ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzM2U1NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZTMzYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gTWFyIDA5IDIwOjM2OjQ1IEdNVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWQxN2Y5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1FY2xpcHNlLUJ1ZGR5UG9saWN5OiByZWdpc3RlcmVkCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZVBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YTAzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMWE3N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzhlMWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jcHJvcGVydGllcyBmaWxlIGZvciBBbm5vdGF0aW9ucyBDb3JlCi1wbHVnaW5OYW1lPSBBbm5vdGF0aW9ucyBDb3JlCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzIzZmVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvbkNhdGVnb3J5IiBuYW1lPSJBbm5vdGF0aW9uIENhdGVnb3J5IiBzY2hlbWE9InNjaGVtYS9hbm5vdGF0aW9uQ2F0ZWdvcnkuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvbkRlZmluaXRpb24iIG5hbWU9IkFubm90YXRpb24gRGVmaW5pdGlvbiIgc2NoZW1hPSJzY2hlbWEvYW5ub3RhdGlvbkRlZmluaXRpb24uZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvbkluaXRpYWxpemVyIiBuYW1lPSJBbm5vdGF0aW9uIEluaXRpYWxpemVyIiBzY2hlbWE9InNjaGVtYS9hbm5vdGF0aW9uSW5pdGlhbGl6ZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvblByb2Nlc3NvciIgbmFtZT0iQW5ub3RhdGlvbiBQcm9jZXNzb3IiIHNjaGVtYT0ic2NoZW1hL2Fubm90YXRpb25Qcm9jZXNzb3IuZXhzZCIvPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUuYW5ub3RhdGlvblByb2Nlc3NvckZhY3RvcnkiPgotICAgICAgPGZhY3RvcmllcyBlbmFibGVEZWZhdWx0PSJ0cnVlIj4KLSAgICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFubm90YXRpb25zQ29yZVByb2Nlc3NvckZhY3RvcnkiPgotICAgICAgICAgPC9mYWN0b3J5PgotICAgICAgPC9mYWN0b3JpZXM+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uQ2F0ZWdvcnkuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25DYXRlZ29yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTg1NGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25DYXRlZ29yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIiBpZD0iYW5ub3RhdGlvbkNhdGVnb3J5IiBuYW1lPSJBbm5vdGF0aW9uIENhdGVnb3J5Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gY29udHJpYnV0ZSBhbiBhbm5vdGF0aW9uIGNhdGVnb3J5LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2F0ZWdvcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2F0ZWdvcnkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEFuIGFubm90YXRpb24gY2F0ZWdvcnkgY29udHJpYnV0aW9uIGRlZmluZXMgY2F0ZWdvcmllcyBvZiBhbm5vdGF0aW9ucyB1c2VkIHRvIGdyb3VwIHRoZW0gaW4gdGhlIFVJLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYW5ub3RhdGlvbiBjYXRlZ29yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVyZSBhbm5vdGF0aW9uIGNhdGVvZ29yeSBuYW1lLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBhbm5vdGF0aW9uIGNhdGVnb3J5IGNvbnRyaWJ1dGlvbjoKLQotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uQ2F0ZWdvcnkmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSZxdW90O2pheHdzLmNhdGVnb3J5JnF1b3Q7Ci0gICAgICAgICAgICBuYW1lPSZxdW90O0pBWC1XUyZxdW90OyZndDsKLSAgICAgICZsdDsvY2F0ZWdvcnkmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuICZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uRGVmaW5pdGlvbi5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkRlZmluaXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxMjY1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uRGVmaW5pdGlvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIiBpZD0iYW5ub3RhdGlvbkRlZmluaXRpb24iIG5hbWU9IkFubm90YXRpb24gRGVmaW5pdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byBjb250cmlidXRlIGFubm90YXRpb25zICZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiZndDsgd2hpY2ggYXJlIGluIHR1cm4gY29uc3VtZWQgYnkgdGhlIFVJLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idGFyZ2V0RmlsdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iNyIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBhbm5vdGF0aW9uIGNsYXNzIG5hbWUgdGhhdCBleHRlbmRzICZsdDtjb2RlJmd0O2phdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24mbHQ7L2NvZGUmZ3Q7Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBpZCBvZiBhICZsdDt0dCZndDthbm5vdGF0aW9uQ2F0ZWdvcnkmbHQ7L3R0Jmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iaWRlbnRpZmllciIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5L2NhdGVnb3J5L0BpZCIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uIGNsYXNzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlc3RyaWN0ZWRUbyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVXNlZCBpbiBhZGRpdGlvbiB0byB0aGUgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUocykgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSB2YWx1ZSBlbGVtZW50IG9mIHRoZSAgQFRhcmdldCBhbm5vdGF0aW9uIG9uIHRoZSBjb250cmlidXRlZCBhbm5vdGF0aW9uIHRvIGFkZCBmdXJ0aGVyIHJlc3RyaWN0aW9ucy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNMQVNTX09OTFkiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5URVJGQUNFX09OTFkiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRU5VTV9PTkxZIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ0YXJnZXRGaWx0ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBhbm5vdGF0aW9ucyBjb3JlIGF1dG9tYXRpY2FsbHkga25vd3Mgd2hlcmUgdG8gcGVybWl0IGFubm90YXRpb25zIGFzIGl0IGluc3BlY3RzIHRoZSBjb250cmlidXRlZCBhbm5vdGF0aW9uIGFuZAotICAgICAgICAgICAgICAgICAgcmVhZHMgdGhlIEBUYXJnZXQgdGhhdCBoYXMgYmVlbiBkZWZpbmVkIGZvciBpdC4gVGhlc2UgZmlsdGVycyBhcmUgb25seSB1c2VkIHdoZW4gdGhlcmUgbWlnaHQgYmUgYW4gZXh0cmEgcmVzdHJpY3Rpb24KLSAgICAgICAgICAgICAgICAgIHlvdSB3YW50IHRvIGFkZCwgZm9yIGV4YW1wbGUsIGlmIHZlcnNpb24gMiBvZiBhbiBhbm5vdGF0aW9uIGFsbG93cyBhZGRpbmcgdGhlIGFubm90YXRpb24gdG8gYSBmaWVsZCwgYW5kIHRoZW4gdmVyc2lvbgotICAgICAgICAgICAgICAgICAgMyBkZXByZWNhdGVzIHRoYXQgdXNhZ2UsIHlvdSBjYW4gYWRkIGEgZmlsdGVyIGhlcmUgdG8gZGlzYWxsb3cgdGhlIHVzYWdlIGluIHRoZSBVSS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlRZUEUiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTUVUSE9EIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlBBUkFNRVRFUiI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDT05TVFJVQ1RPUiI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJMT0NBTF9WQVJJQUJMRSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJBTk5PVEFUSU9OX1RZUEUiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUEFDS0FHRSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gYW5ub3RhdGlvbiBkZWZpbml0aW9uIGNvbnRyaWJ1dGlvbjoKLQotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbiZxdW90OyZndDsKLSAgICAgICZsdDthbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0mcXVvdDtqYXh3cy5jYXRlZ29yeSZxdW90OwotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7amF2YXguandzLldlYlNlcnZpY2UmcXVvdDsKLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7V2ViU2VydmljZSZxdW90OyZndDsKLSAgICAgICZsdDsvYW5ub3RhdGlvbiZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uSW5pdGlhbGl6ZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25Jbml0aWFsaXplci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWUxZGI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25Jbml0aWFsaXplci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIiBpZD0iYW5ub3RhdGlvbkluaXRpYWxpemVyIiBuYW1lPSJBbm5vdGF0aW9uIEluaXRpYWxpemVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBjbGllbnRzIHRvIGFzc29jaWF0ZSBhbiBhbm5vdGF0aW9uIGluaXRpYWxpemVyIHdpdGggYW4gYW5ub3RhdGlvbiBkZWZpbml0aW9uLgotCi1UaGUgYW5ub3RhdGlvbiBpbml0aWFsaXplcnMgcm9sZSBpcyB0byBjb25zdHJ1Y3QgdmFsdWVzIGZvciB0aGUgYW5ub3RhdGlvbnMgbWVtYmVyIHZhbHVlIHBhaXJzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW5pdGlhbGl6ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iaW5pdGlhbGl6ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uIGRlZmluaXRpb24gdGhhdCB0aGlzIGluaXRpYWxpemVycyBoYW5kbGVzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iaWRlbnRpZmllciIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb24vYW5ub3RhdGlvbi9AY2xhc3MiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBjb250cmlidXRlZCBpbml0aWFsaXplci4gVGhlCi1jbGFzcyBtdXN0IGJlIGEgcHVibGljIGFuZCBleHRlbmQKLSZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciZsdDsvY29kZSZndDsgd2l0aCBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBhbm5vdGF0aW9uIGluaXRpYWxpemVyIGNvbnRyaWJ1dGlvbjoKLQotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7aW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIGFubm90YXRpb249JnF1b3Q7amF2YXguandzLldlYlNlcnZpY2UmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uLldlYlNlcnZpY2VBdHRyaWJ1dGVJbml0aWFsaXplciZxdW90OyZndDsKLSAgICAgICZsdDsvaW5pdGlhbGl6ZXImZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuICZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvblByb2Nlc3Nvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvblByb2Nlc3Nvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2VmNjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25Qcm9jZXNzb3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgaWQ9ImFubm90YXRpb25Qcm9jZXNzb3IiIG5hbWU9IkFubm90YXRpb24gUHJvY2Vzc29yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBjbGllbnRzIHRvIGNvbnRyaWJ1dGUgYW5ub3RhdGlvbiBwcm9jZXNvb3JzLiBUaGVzZSBwcm9jZXNzb3JzIGFyZSBhc3NvY2lhdGVkIHdpdGggY29udHJpYnV0ZWQgYW5ub3RhdGlvbiBkZWZpbml0aW9ucy4KLQotVGhlIGdvYWwgb2YgdGhlIHByb2Nlc3NvciBpcyB0byB2YWxpZGF0ZSBhbm5vdGF0aW9uIHJ1bGVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvY2Vzc29yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2Nlc3NvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiBkZWZpbml0aW9uIHRoYXQgdGhpcyBwcm9jZXNzb3IgaGFuZGxlcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImlkZW50aWZpZXIiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uL2Fubm90YXRpb24vQGNsYXNzIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgY29udHJpYnV0ZWQgcHJvY2Vzb3IuIFRoZQotY2xhc3MgbXVzdCBiZSBhIHB1YmxpYyBzdWJjbGFzcyBvZgotJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciZsdDsvY29kZSZndDthbmQgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBbiBvcHRpb25hbCBhdHRyaWJ1dGUgdG8gaG9sZCBhIHNob3J0IHRleHQgZGVzY3JpYmluZyB3aGF0ICZxdW90O3J1bGUmcXVvdDsgdGhlIHByb2Nlc3NvciBoYW5kbGVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgPC9lbGVtZW50PgotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBhbm5vdGF0aW9uIHByb2Nlc3NvciBjb250cmlidXRpb246Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvblByb2Nlc3NvciZxdW90OyZndDsKLSAgICAgICZsdDtwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249JnF1b3Q7amF2YXguandzLldlYlNlcnZpY2UmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZVNFSVByZXNlbnROb1dlYk1ldGhvZFJ1bGUmcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9TRUlfTk9fV0VCTUVUSE9TX1JVTEUKLSAgICAgICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICAmbHQ7L3Byb2Nlc3NvciZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyODE4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci0KLS8qKgotICogQW4gPGNvZGU+QW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+IGlzIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluZm9ybWF0aW9uIGNvbnRyaWJ1dGVkIHRocm91Z2ggdGhlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4sCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uQ2F0ZWdvcnk8L2NvZGU+IGFuZAotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkluaXRpYWxpemVyPC9jb2RlPiBleHRlbnNpb24gcG9pbnRzLgotICogZm9yIGEgPGNvZGU+amF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjwvY29kZT4gY2xhc3MuCi0gKiA8cD4KLSAqIEl0IHN1cHBsaWVzIHRoZSBhbm5vdGF0aW9uIGNsYXNzIG5hbWUsIGl0cyBhbm5vdGF0aW9uIGNhdGVnb3J5LCB0aGUgYXBwbGljYWJsZSB0YXJnZXRzIGZvciB0aGUgYW5ub3RhdGlvbgotICogYW5kIGFuIDxjb2RlPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L2NvZGU+IHRvIGluaXRpYWxpemUgdGhlIGFubm90YXRpb25zIGVsZW1lbnQtdmFsdWUgcGFpcnMuCi0gKiA8L3A+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUkVTVFJJQ1RFRF9UTyA9ICJyZXN0cmljdGVkVG8iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVFJJQ1RFRF9UT19DTEFTU19PTkxZID0gIkNMQVNTX09OTFkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNUUklDVEVEX1RPX0lOVEVSRkFDRV9PTkxZID0gIklOVEVSRkFDRV9PTkxZIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVFJJQ1RFRF9UT19FTlVNX09OTFkgPSAiRU5VTV9PTkxZIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1RBUkdFVF9GSUxURVIgPSAidGFyZ2V0RmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVEFSR0VUID0gInRhcmdldCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotICAgIHByaXZhdGUgU3RyaW5nIGNhdGVnb3J5OwotICAgIHByaXZhdGUgU3RyaW5nIGFubm90YXRpb25DbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzOwotICAgIHByaXZhdGUgTGlzdDxFbGVtZW50VHlwZT4gdGFyZ2V0czsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBhbm5vdGF0aW9uSW5pdGlhbGl6ZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzdGljdGVkVG87Ci0gICAgcHJpdmF0ZSBib29sZWFuIGludGVyZmFjZU9ubHk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNsYXNzT25seTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZW51bU9ubHk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIDxjb2RlPkFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiB1c2luZyBpbmZvcm1hdGlvbiBmcm9tIHRoZQotICAgICAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgYW5kIGNhdGVnb3J5IG5hbWUuCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25FbGVtZW50IHRoZSA8Y29kZT5hbm5vdGF0aW9uPC9jb2RlPiBlbGVtZW50IGZyb20gdGhlIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiBleHRlbnNpb24gcG9pbnQKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIGNhdGVnb3J5IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgQW5ub3RhdGlvbkRlZmluaXRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50LCBTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCA9IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotICAgICAgICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0KLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2xhc3NOYW1lID0gQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEF0dHJpYnV0ZVZhbHVlKGNvbmZpZ3VyYXRpb25FbGVtZW50LCBBVFRfQ0xBU1MpOwotICAgICAgICB0aGlzLm5hbWUgPSBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QXR0cmlidXRlVmFsdWUoY29uZmlndXJhdGlvbkVsZW1lbnQsIEFUVF9OQU1FKTsKLSAgICAgICAgdGhpcy5yZXN0aWN0ZWRUbyA9IEFubm90YXRpb25zTWFuYWdlci5nZXRBdHRyaWJ1dGVWYWx1ZShjb25maWd1cmF0aW9uRWxlbWVudCwKLSAgICAgICAgICAgICAgICBBVFRfUkVTVFJJQ1RFRF9UTyk7Ci0gICAgICAgIHRoaXMuY2xhc3NPbmx5ID0gcmVzdGljdGVkVG8uZXF1YWxzKFJFU1RSSUNURURfVE9fQ0xBU1NfT05MWSk7Ci0gICAgICAgIHRoaXMuaW50ZXJmYWNlT25seSA9IHJlc3RpY3RlZFRvLmVxdWFscyhSRVNUUklDVEVEX1RPX0lOVEVSRkFDRV9PTkxZKTsKLSAgICAgICAgdGhpcy5lbnVtT25seSA9IHJlc3RpY3RlZFRvLmVxdWFscyhSRVNUUklDVEVEX1RPX0VOVU1fT05MWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYW5ub3RhdGlvbiBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNhdGVnb3J5IHRoZSBhbm5vdGF0aW9uIGJlbG9uZ3MgdG8uCi0gICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBjYXRlZ29yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotICAgICAgICByZXR1cm4gY2F0ZWdvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGFubm90YXRpb24uCi0gICAgICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGFubm90YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBjbGFzcyB0eXBlcy4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gY2xhc3NlcyBvbmx5LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2xhc3NPbmx5KCkgewotICAgICAgICByZXR1cm4gY2xhc3NPbmx5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYW5ub3RhdGlvbiBpcyByZXN0cmljdGVkIHRvIGludGVyZmFjZSB0eXBlcy4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gaW50ZXJmYWNlcyBvbmx5LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlT25seSgpIHsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZU9ubHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBhbm5vdGF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gZW51bSB0eXBlcy4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gZW51bXMgb25seS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VudW1Pbmx5KCkgewotICAgICAgICByZXR1cm4gZW51bU9ubHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYW5ub3RhdGlvbiBjbGFzcyBhcyBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPmNsYXNzPC9jb2RlPiBhdHRyaWJ1dGUgb2YgdGhlCi0gICAgICogPGNvZGU+YW5ub3RhdGlvbjxhbm5vdGF0aW9uPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4KLSAgICAgKiBleHRlbnNpb24gcG9pbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIGNsYXNzCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9uQ2xhc3MoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDbGFzczw/PiBhQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGFubm90YXRpb25DbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGlmIChhQ2xhc3MuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNsYXNzID0gKENsYXNzPGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+KUNsYXNzLmZvck5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKGNuZmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2Yge0BsaW5rIEVsZW1lbnRUeXBlfSB0aGF0IHNwZWNpZnkgdGhlIEphdmEgZWxlbWVudHMgdG8gd2hpY2ggdGhlIGFubm90YXRpb24KLSAgICAgKiBjYW4gYmUgYXBwbGllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZWxlbWVudCB0eXBlcyBhcmUgcmV0cmlldmVkIGZyb20gdGhlIGFubm90YXRpb25zCi0gICAgICoge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldH0gbWV0YS1hbm5vdGF0aW9uIHR5cGUuIFRoaXMgbGlzdCBjYW4gYmUgZmlsdGVyZWQgdXNpbmcKLSAgICAgKiB0aGUgPGNvZGU+dGFyZ2V0RmlsdGVyPC9jb2RlPiBlbGVtZW50IG9uIHRoZQotICAgICAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgd2hlbiBkZWZpbmluZwotICAgICAqIHRoZSBhbm5vdGF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBlbGVtZW50IHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEVsZW1lbnRUeXBlPiBnZXRUYXJnZXRzKCkgewotICAgICAgICBpZiAodGFyZ2V0cyA9PSBudWxsKSB7Ci0gICAgICAgIAl0YXJnZXRzID0gbmV3IExpbmtlZExpc3Q8RWxlbWVudFR5cGU+KCk7Ci0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbkNsYXNzKCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJVGFyZ2V0IHRhcmdldCA9IGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbihUYXJnZXQuY2xhc3MpOwotICAgICAgICAgICAgCWlmICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgCSAgICB0YXJnZXRzLmFkZEFsbChBcnJheXMuYXNMaXN0KHRhcmdldC52YWx1ZSgpKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTGlzdDxFbGVtZW50VHlwZT4gZmlsdGVyZWRUYXJnZXRzID0gZ2V0RmlsdGVyZWRUYXJnZXRzKGNvbmZpZ3VyYXRpb25FbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldHMuY29udGFpbnNBbGwoZmlsdGVyZWRUYXJnZXRzKSAmJiBmaWx0ZXJlZFRhcmdldHMuc2l6ZSgpIDwgdGFyZ2V0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHMucmVtb3ZlQWxsKGZpbHRlcmVkVGFyZ2V0cyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRhcmdldHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYW5ub3RhdGlvbnMgYXR0cmlidXRlIGluaXRpYWxpemVyIGFzIHNwZWNpZmllZCBpbiB0aGUKLSAgICAgKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludCBvciBudWxsIGlmIG5vCi0gICAgICogaW5pdGlhbGl6ZXIgY2FuIGJlIGZvdW5kLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBnZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uSW5pdGlhbGl6ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUoKS5nZXQoZ2V0QW5ub3RhdGlvbkNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uSW5pdGlhbGl6ZXIgPSAoSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciljb25maWd1cmF0aW9uRWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25Jbml0aWFsaXplcjsKLSAgICB9Ci0KLQkgIHByaXZhdGUgTGlzdDxFbGVtZW50VHlwZT4gZ2V0RmlsdGVyZWRUYXJnZXRzKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCkgewotCQkgIExpc3Q8RWxlbWVudFR5cGU+IHRhcmdldHMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnRUeXBlPig3KTsKLQkJICB0cnkgewotCQkJICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBkZXByZWNhdGVkVGFyZ2V0cyA9IGNvbmZpZ3VyYXRpb25FbGVtZW50LmdldENoaWxkcmVuKEVMRU1fVEFSR0VUX0ZJTFRFUik7Ci0JCQkgIGZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlcHJlY2F0ZWRUYXJnZXRFbGVtZW50IDogZGVwcmVjYXRlZFRhcmdldHMpIHsKLQkJCQkgIFN0cmluZyB0YXJnZXQgPSBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QXR0cmlidXRlVmFsdWUoZGVwcmVjYXRlZFRhcmdldEVsZW1lbnQsIEFUVF9UQVJHRVQpOwotCQkJCSAgdGFyZ2V0cy5hZGQoRWxlbWVudFR5cGUudmFsdWVPZih0YXJnZXQpKTsKLQkJCSAgfQotCQkgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCSAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhpYWUpOwotCQkgIH0KLQkJICByZXR1cm4gdGFyZ2V0czsKLQkgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODIwODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgY3JlYXRpbmcgYW5ub3RhdGlvbnMgYW5kIG1lbWJlciB2YWx1ZSBwYWlycy4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uc0NvcmUgewotCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uc0NvcmUoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIGFubm90YXRpb25OYW1lIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uLgotICAgICAqIEBwYXJhbSBtZW1iZXJWYWx1ZVBhaXJzIGEgbGlzdCBvZiB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB0byBhZGQgdG8gdGhlIG5vcm1hbCBhbm5vdGF0aW9uLgotICAgICAqIEByZXR1cm4gYSBub3JtYWwgYW5ub3RhdGlvbiB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgdmFsdWUgcGFpcnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOb3JtYWxBbm5vdGF0aW9uIGNyZWF0ZU5vcm1hbEFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIGFubm90YXRpb25OYW1lLCBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhc3QubmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotCi0gICAgICAgIE5hbWUgYW5ub3RhdGlvblR5cGVOYW1lID0gYXN0Lm5ld05hbWUoYW5ub3RhdGlvbk5hbWUpOwotCi0gICAgICAgIGFubm90YXRpb24uc2V0VHlwZU5hbWUoYW5ub3RhdGlvblR5cGVOYW1lKTsKLQotICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgOiBtZW1iZXJWYWx1ZVBhaXJzKSB7Ci0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGFubm90YXRpb25WYWx1ZXMgPSBhbm5vdGF0aW9uLnZhbHVlcygpOwotICAgICAgICAgICAgICAgIGFubm90YXRpb25WYWx1ZXMuYWRkKG1lbWJlclZhbHVlUGFpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIGFubm90YXRpb25OYW1lIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUge0BsaW5rIEV4cHJlc3Npb259IHRvIHNldCBhcyB0aGUgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIHZhbHVlLgotICAgICAqIEByZXR1cm4gYSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGNyZWF0ZVNpbmdsZU1lbWJlckFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIGFubm90YXRpb25OYW1lLCBFeHByZXNzaW9uIHZhbHVlKSB7Ci0gICAgICAgIFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzdC5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0KLSAgICAgICAgTmFtZSBhbm5vdGF0aW9uVHlwZU5hbWUgPSBhc3QubmV3TmFtZShhbm5vdGF0aW9uTmFtZSk7Ci0KLSAgICAgICAgYW5ub3RhdGlvbi5zZXRUeXBlTmFtZShhbm5vdGF0aW9uVHlwZU5hbWUpOwotCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IChFeHByZXNzaW9uKUV4cHJlc3Npb24uY29weVN1YnRyZWUoYXN0LCB2YWx1ZSk7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1hcmtlckFubm90YXRpb259LgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhbm5vdGF0aW9uLgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZSB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcmV0dXJuIGEgbWFya2VyIGFubm90YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXJrZXJBbm5vdGF0aW9uIGNyZWF0ZU1hcmtlckFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0gICAgICAgIE1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzdC5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0KLSAgICAgICAgTmFtZSBhbm5vdGF0aW9uVHlwZU5hbWUgPSBhc3QubmV3TmFtZShhbm5vdGF0aW9uTmFtZSk7Ci0KLSAgICAgICAgYW5ub3RhdGlvbi5zZXRUeXBlTmFtZShhbm5vdGF0aW9uVHlwZU5hbWUpOwotCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSAibmFtZSIuCi0gICAgICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIHtAbGluayBFeHByZXNzaW9ufSAidmFsdWUiIG9mIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IG1lbWJlciB2YWx1ZSBwYWlyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZU1lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0gICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBhc3QubmV3TWVtYmVyVmFsdWVQYWlyKCk7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpci5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKG5hbWUpKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlyLnNldFZhbHVlKGV4cHJlc3Npb24pOwotICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gd2l0aCBhIHtAbGluayBTdHJpbmdMaXRlcmFsfSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyICJuYW1lIi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gInZhbHVlIi4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IG1lbWJlciB2YWx1ZSBwYWlyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHJpbmdNZW1iZXJWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsIHZhbHVlLnRvU3RyaW5nKCkpKTsKLQotICAgICAgICByZXR1cm4gc3RyaW5nTWVtYmVyVmFsdWVQYWlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gd2l0aCBhIHtAbGluayBCb29sZWFuTGl0ZXJhbH0gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBtZW1iZXIgdmFsdWUgcGFpciAibmFtZSIuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSA8Y29kZT5Cb29sZWFuPC9jb2RlPiAidmFsdWUiLgotICAgICAqIEByZXR1cm4gYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZW1iZXJWYWx1ZVBhaXIgY3JlYXRlQm9vbGVhbk1lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgQm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgYm9vbGVhblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLCBBbm5vdGF0aW9uc0NvcmUKLSAgICAgICAgICAgICAgICAuY3JlYXRlQm9vbGVhbkxpdGVyYWwoYXN0LCB2YWx1ZS5ib29sZWFuVmFsdWUoKSkpOwotCi0gICAgICAgIHJldHVybiBib29sZWFuVmFsdWVQYWlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gd2l0aCBhIHtAbGluayBOdW1iZXJMaXRlcmFsfSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyICJuYW1lIi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gInZhbHVlIiByZXByZXNlbnRpbmcgdGhlIG51bWJlci4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IG1lbWJlciB2YWx1ZSBwYWlyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZU51bWJlck1lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwcmltaXRpdmVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTnVtYmVyTGl0ZXJhbChhc3QsIHZhbHVlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlUGFpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHdpdGggYSB7QGxpbmsgTmFtZX0gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyLgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGVuY2xvc2luZyBjbGFzcyBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBtZW1iZXIgdmFsdWUgcGFpciAibmFtZSIuCi0gICAgICogQHBhcmFtIHZhbHVlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIDxjb2RlPmVudW08L2NvZGU+IHZhbHVlLgotICAgICAqIEByZXR1cm4gYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZW1iZXJWYWx1ZVBhaXIgY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIGNyZWF0ZUVudW1MaXRlcmFsKGFzdCwgY2xhc3NOYW1lLCB2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gd2l0aCBhIHtAbGluayBUeXBlTGl0ZXJhbH0gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBtZW1iZXIgdmFsdWUgcGFpciAibmFtZSIuCi0gICAgICogQHBhcmFtIHZhbHVlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHR5cGUgdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBjcmVhdGVUeXBlTWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLAotICAgICAgICAgICAgICAgIGNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHdpdGggYW4ge0BsaW5rIEFycmF5SW5pdGlhbGl6ZXJ9IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgIm5hbWUiLgotICAgICAqIEBwYXJhbSB2YWx1ZXMgYW4gYXJyYXkgb2YgPGNvZGU+T2JqZWN0PC9jb2RlPiB2YWx1ZXMuIFN1cHBvcnRzICB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sIHtAbGluayBqYXZhLmxhbmcuQm9vbGVhbn0sIHtAbGluayBqYXZhLmxhbmcuQ2xhc3N9IHZhbHVlcy4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IG1lbWJlciB2YWx1ZSBwYWlyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGFycmF5IG9mIHZhbHVlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBjcmVhdGVBcnJheU1lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgT2JqZWN0W10gdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwgY3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWwoYXN0LCB2YWx1ZXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBBcnJheUluaXRpYWxpemVyfS4KLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHtAbGluayBBcnJheUluaXRpYWxpemVyfS4KLSAgICAgKiBAcGFyYW0gdmFsdWVzIGFuIGFycmF5IG9mIDxjb2RlPk9iamVjdDwvY29kZT4gdmFsdWVzLiBTdXBwb3J0cyAge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LCB7QGxpbmsgamF2YS5sYW5nLkJvb2xlYW59LCB7QGxpbmsgamF2YS5sYW5nLkNsYXNzfSB2YWx1ZXMuCi0gICAgICogQHJldHVybiBhIG5ldyBzcnJheSBpbml0aWFsaXplci4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIEFycmF5SW5pdGlhbGl6ZXIgY3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWwoQVNUIGFzdCwgT2JqZWN0W10gdmFsdWVzKSB7Ci0gICAgICAgIEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IGFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKENsYXNzLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKS5hZGQoY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCB2YWx1ZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmluZ1ZhbHVlLmVuZHNXaXRoKCIuY2xhc3MiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKS5hZGQoY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCBzdHJpbmdWYWx1ZS5zdWJzdHJpbmcoMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdWYWx1ZS5sYXN0SW5kZXhPZigiLiIpKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZChjcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgc3RyaW5nVmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgICAgIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKS5hZGQoY3JlYXRlQm9vbGVhbkxpdGVyYWwoYXN0LCAoQm9vbGVhbikgdmFsdWUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhcnJheUluaXRpYWxpemVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFF1YWxpZmllZE5hbWV9IHRvIHJlcHJlc2VudCBhbiA8Y29kZT5lbnVtPC9jb2RlPiBsaXRlcmFsIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBxdWFsaWZpZWQgbmFtZS4KLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzLgotICAgICAqIEBwYXJhbSB2YWx1ZSBzbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSA8Y29kZT5lbnVtPC9jb2RlPiB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IHF1YWxpZmllZCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUXVhbGlmaWVkTmFtZSBjcmVhdGVFbnVtTGl0ZXJhbChBU1QgYXN0LCBTdHJpbmcgY2xhc3NOYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgUXVhbGlmaWVkTmFtZSBlbnVtTmFtZSA9IG51bGw7Ci0gICAgICAgIFNpbXBsZU5hbWUgZW51bUNsYXNzTmFtZSA9IGFzdC5uZXdTaW1wbGVOYW1lKHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgU2ltcGxlTmFtZSBlbnVtTGl0ZXJhbCA9IGFzdC5uZXdTaW1wbGVOYW1lKHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICBpZiAodmFsdWUuZ2V0Q2xhc3MoKS5pc01lbWJlckNsYXNzKCkpIHsKLSAgICAgICAgICAgIE5hbWUgZW51bUVuY2xvc2luZ0NsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgZW5jbG9zaW5nQ2xhc3NOYW1lID0gdmFsdWUuZ2V0Q2xhc3MoKS5nZXRFbmNsb3NpbmdDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChlbmNsb3NpbmdDbGFzc05hbWUuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBlbnVtRW5jbG9zaW5nQ2xhc3NOYW1lID0gYXN0Lm5ld1NpbXBsZU5hbWUodmFsdWUuZ2V0Q2xhc3MoKS5nZXRFbmNsb3NpbmdDbGFzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW51bUVuY2xvc2luZ0NsYXNzTmFtZSA9IGFzdC5uZXdOYW1lKGVuY2xvc2luZ0NsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSBhc3QubmV3UXVhbGlmaWVkTmFtZShlbnVtRW5jbG9zaW5nQ2xhc3NOYW1lLCBlbnVtQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGVudW1OYW1lID0gYXN0Lm5ld1F1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSwgZW51bUxpdGVyYWwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTmFtZSBxdWFsaWZpZWROYW1lID0gYXN0Lm5ld05hbWUodmFsdWUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICAgICAgZW51bU5hbWUgPSBhc3QubmV3UXVhbGlmaWVkTmFtZShxdWFsaWZpZWROYW1lLCBlbnVtTGl0ZXJhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVudW1OYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFR5cGVMaXRlcmFsfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUge0BsaW5rIFR5cGVMaXRlcmFsfS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgYSA8Y29kZT5DbGFzczwvY29kZT4gb3IgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGZyb20gd2hpY2ggdG8gY3JlYXRlIHRoZSB0eXBlIGxpdGVyYWwuCi0gICAgICogQHJldHVybiBhIG5ldyB0eXBlIGxpdGVyYWwgb3IgbnVsbCBpdCB0aGUgdmFsdWUgaXMgbm90IG9mIHR5cGUgPGNvZGU+Q2xhc3M8L2NvZGU+IG9yIDxjb2RlPlN0cmluZzwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUeXBlTGl0ZXJhbCBjcmVhdGVUeXBlTGl0ZXJhbChBU1QgYXN0LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgVHlwZUxpdGVyYWwgdHlwZUxpdGVyYWwgPSBudWxsOwotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDbGFzczw/PikgewotICAgICAgICAgICAgdHlwZUxpdGVyYWwgPSBjcmVhdGVUeXBlTGl0ZXJhbChhc3QsIChDbGFzczw/PikgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgdHlwZUxpdGVyYWwgPSBjcmVhdGVUeXBlTGl0ZXJhbChhc3QsIChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZUxpdGVyYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVHlwZUxpdGVyYWx9LgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB0eXBlIGxpdGVyYWwuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBjbGFzcyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IHR5cGUgbGl0ZXJhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVMaXRlcmFsIGNyZWF0ZVR5cGVMaXRlcmFsKEFTVCBhc3QsIENsYXNzPD8+IHZhbHVlKSB7Ci0gICAgICAgIFR5cGVMaXRlcmFsIHR5cGVMaXRlcmFsID0gYXN0Lm5ld1R5cGVMaXRlcmFsKCk7Ci0KLSAgICAgICAgQ2xhc3M8Pz4gYUNsYXNzID0gdmFsdWU7Ci0gICAgICAgIFNpbXBsZU5hbWUgY2xhc3NOYW1lID0gYXN0Lm5ld1NpbXBsZU5hbWUoYUNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0KLSAgICAgICAgaWYgKGFDbGFzcy5pc01lbWJlckNsYXNzKCkpIHsKLSAgICAgICAgICAgIE5hbWUgZW5jbG9zaW5nQ2xhc3NOYW1lID0gYXN0Lm5ld05hbWUoYUNsYXNzLmdldEVuY2xvc2luZ0NsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIFF1YWxpZmllZFR5cGUgcXVhbGlmaWVkVHlwZSA9IGFzdC5uZXdRdWFsaWZpZWRUeXBlKGFzdC5uZXdTaW1wbGVUeXBlKGVuY2xvc2luZ0NsYXNzTmFtZSksIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB0eXBlTGl0ZXJhbC5zZXRUeXBlKHF1YWxpZmllZFR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIHR5cGVMaXRlcmFsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjcmVhdGVUeXBlTGl0ZXJhbChhc3QsIHZhbHVlLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVHlwZUxpdGVyYWx9Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHR5cGUgbGl0ZXJhbC4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzLgotICAgICAqIEByZXR1cm4gYSBuZXcgdHlwZSBsaXRlcmFsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHlwZUxpdGVyYWwgY3JlYXRlVHlwZUxpdGVyYWwoQVNUIGFzdCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIFR5cGVMaXRlcmFsIHR5cGVMaXRlcmFsID0gYXN0Lm5ld1R5cGVMaXRlcmFsKCk7Ci0KLSAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoIi4iKSA9PSAtMSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0eXBlTGl0ZXJhbC5zZXRUeXBlKGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdTaW1wbGVOYW1lKHZhbHVlKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllciA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sYXN0SW5kZXhPZigiLiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSB2YWx1ZS5zdWJzdHJpbmcodmFsdWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAocXVhbGlmaWVyLmVxdWFscygiamF2YS5sYW5nIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHR5cGVMaXRlcmFsLnNldFR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld1NpbXBsZU5hbWUoaWRlbnRpZmllcikpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHlwZUxpdGVyYWwuc2V0VHlwZShhc3QubmV3UXVhbGlmaWVkVHlwZShhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3TmFtZShxdWFsaWZpZXIpKSwgYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmV3U2ltcGxlTmFtZShpZGVudGlmaWVyKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0eXBlTGl0ZXJhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBTdHJpbmdMaXRlcmFsfS4KLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHN0cmluZyBsaXRlcmFsLgotICAgICAqIEBwYXJhbSBsaXRlcmFsVmFsdWUgdGhlIHN0cmluZyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IHN0cmluZyBsaXRlcmFsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nTGl0ZXJhbCBjcmVhdGVTdHJpbmdMaXRlcmFsKEFTVCBhc3QsIFN0cmluZyBsaXRlcmFsVmFsdWUpIHsKLSAgICAgICAgU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsKLSAgICAgICAgc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUobGl0ZXJhbFZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHN0cmluZ0xpdGVyYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQm9vbGVhbkxpdGVyYWx9LgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYm9vbGVhbiBsaXRlcmFsLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IGJvb2xlYW4gbGl0ZXJhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW5MaXRlcmFsIGNyZWF0ZUJvb2xlYW5MaXRlcmFsKEFTVCBhc3QsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgQm9vbGVhbkxpdGVyYWwgYm9vbGVhbkxpdGVyYWwgPSBhc3QubmV3Qm9vbGVhbkxpdGVyYWwodmFsdWUpOwotICAgICAgICByZXR1cm4gYm9vbGVhbkxpdGVyYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTnVtYmVyTGl0ZXJhbH0uCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB7QGxpbmsgTnVtYmVyTGl0ZXJhbH0uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBudW1iZXIgdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyBudW1iZXIgbGl0ZXJhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE51bWJlckxpdGVyYWwgY3JlYXRlTnVtYmVyTGl0ZXJhbChBU1QgYXN0LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgTnVtYmVyTGl0ZXJhbCBwcmltaXRpdmVMaXRlcmFsID0gYXN0Lm5ld051bWJlckxpdGVyYWwoKTsKLSAgICAgICAgcHJpbWl0aXZlTGl0ZXJhbC5zZXRUb2tlbih2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVMaXRlcmFsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDQ2NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgCi0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIAotICogdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25zQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uc0NvcmVQbHVnaW4gcGx1Z2luOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbnNDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBBbm5vdGF0aW9uc0NvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzODM4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGFubm90YXRpb24gY2F0ZWdvcmllcywgZGVmaW5pdGlvbnMsIHByb2Nlc3NvcnMgYW5kIGluaXRpYWxpemVycyBjb250cmlidXRlZCB0aHJvdWdoIHRoZQotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+LAotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5PC9jb2RlPiwKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplcjwvY29kZT4gYW5kCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uUHJvY2Vzc29yPC9jb2RlPiBleHRlbnNpb24gcG9pbnRzLgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFubm90YXRpb25zTWFuYWdlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fREVGSU5JVElPTiA9ICJhbm5vdGF0aW9uRGVmaW5pdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTl9DQVRFR09SWSA9ICJhbm5vdGF0aW9uQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fSU5JVElBTElaRVIgPSAiYW5ub3RhdGlvbkluaXRpYWxpemVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX1BST0NFU1NPUiA9ICJhbm5vdGF0aW9uUHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OID0gImFubm90YXRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uQ2FjaGUgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gYW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4gYW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50Pj4gYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPj4gYW5ub3RhdGlvbnNCeUNhdGVnb3J5TWFwID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkNsYXNzTmFtZVRvRGVmaW5pdGlvbk1hcDsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvblNpbXBsZU5hbWVUb0RlZmluaXRpb25NYXA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25RdWFsaWZpZWROYW1lVG9EZWZpbml0aW9uTWFwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NBVEVHT1JZID0gImNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVEFSR0VUX0ZJTFRFUiA9ICJ0YXJnZXRGaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0gICAgLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UQVJHRVQgPSAidGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uc01hbmFnZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2Yge0BsaW5rIEFubm90YXRpb25EZWZpbml0aW9ufSBjb25zdHJ1Y3RlZCBmcm9tIGNvbnRyaWJ1dGlvbnMgdG8gdGhlCi0gICAgICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFubm90YXRpb24gZGVmaW5pdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0QW5ub3RhdGlvbnMoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uQ2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgYW5ub3RhdGlvbkNhY2hlID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLQotICAgICAgICAgICAgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgQU5OT1RBVElPTl9ERUZJTklUSU9OKTsKLSAgICAgICAgICAgIGlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoQU5OT1RBVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uID0gbmV3IEFubm90YXRpb25EZWZpbml0aW9uKGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFubm90YXRpb25DYXRlZ29yeShnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBBVFRfQ0FURUdPUlkpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2FjaGUuYWRkKGFubm90YXRpb25EZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNhY2hlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgY29udHJpYnV0ZWQge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259IHRoYXQgdGFyZ2V0IHRoZSBnaXZlbiBqYXZhIGVsZW1lbnQgdHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50IG9uZSBvZgotICAgICAqIDxsaT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZURlY2xhcmF0aW9uPC9saT4KLSAgICAgKiA8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU8L2xpPgotICAgICAqIDxsaT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ8L2xpPgotICAgICAqIDxsaT5vcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kPC9saT4KLSAgICAgKiA8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU8L2xpPgotICAgICAqCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgYW5ub3RhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gZ2V0QW5ub3RhdGlvbnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB7Ci0gICAgICAgIExpc3Q8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBhbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSBnZXRBbGxBbm5vdGF0aW9uc0ZvckVsZW1lbnQoamF2YUVsZW1lbnQpOwotCi0gICAgICAgICAgICBmaWx0ZXJBbm5vdGF0aW9uc0xpc3QoamF2YUVsZW1lbnQsIGFubm90YXRpb25EZWZpbml0aW9ucyk7Ci0KLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbkNsYXNzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0QW5ub3RhdGlvblRvQ2xhc3NOYW1lRGVmaW5pdGlvbk1hcCgpIHsKLQotICAgICAgICBpZiAoYW5ub3RhdGlvbkNsYXNzTmFtZVRvRGVmaW5pdGlvbk1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSBnZXRBbm5vdGF0aW9ucygpOwotCi0gICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3NOYW1lVG9EZWZpbml0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLQotICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGFubm90YXRpb25EZWZpbml0aW9ucykgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25DbGFzc05hbWVUb0RlZmluaXRpb25NYXAucHV0KGFubm90YXRpb25EZWZpbml0aW9uLmdldEFubm90YXRpb25DbGFzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2Fub25pY2FsTmFtZSgpLCBhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25DbGFzc05hbWVUb0RlZmluaXRpb25NYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPiBnZXRTaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvblNpbXBsZU5hbWVUb0RlZmluaXRpb25NYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zID0gZ2V0QW5ub3RhdGlvbnMoKTsKLQotICAgICAgICAgICAgYW5ub3RhdGlvblNpbXBsZU5hbWVUb0RlZmluaXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPigpOwotCi0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uIDogYW5ub3RhdGlvbkRlZmluaXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvblNpbXBsZU5hbWVUb0RlZmluaXRpb25NYXAucHV0KGFubm90YXRpb25EZWZpbml0aW9uLmdldE5hbWUoKSwgYW5ub3RhdGlvbkRlZmluaXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uU2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+IGdldFF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXAoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uUXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSBnZXRBbm5vdGF0aW9ucygpOwotCi0gICAgICAgICAgICBhbm5vdGF0aW9uUXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcC5wdXQoYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbkNsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uUXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQW5ub3RhdGlvbkRlZmluaXRpb259IGZvciB0aGUgZ2l2ZW4ge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259IGNsYXNzCi0gICAgICogb3IgbnVsbCBpZiBubyBhbm5vdGF0aW9uIGRlZmluaXRpb24gY2FuIGJlIGZvdW5kLgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uQ2xhc3MgdGhlIDxjb2RlPmphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb248L2NvZGU+IGNsYXNzLgotICAgICAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gZGVmaW5pdGlvbiBmb3IgdGhlIDxjb2RlPmphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb248L2NvZGU+IGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uVG9DbGFzc05hbWVEZWZpbml0aW9uTWFwKCkuZ2V0KGFubm90YXRpb25DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBbm5vdGF0aW9uRGVmaW5pdGlvbn0gZm9yIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259IGNsYXNzCi0gICAgICogbmFtZSBvciBudWxsIGlmIG5vIGFubm90YXRpb24gZGVmaW5pdGlvbiBjYW4gYmUgZm91bmQuCi0gICAgICogQHBhcmFtIGNhbm9uaWNhbE5hbWUgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSA8Y29kZT5qYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPC9jb2RlPiBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIGRlZmluaXRpb24gZm9yIHRoZSBmdWxseSBxdWFsaWZpZWQgPGNvZGU+amF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjwvY29kZT4gY2xhc3MgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoU3RyaW5nIGNhbm9uaWNhbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25Ub0NsYXNzTmFtZURlZmluaXRpb25NYXAoKS5nZXQoY2Fub25pY2FsTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXJ9IGZvciB0aGUgZ2l2ZW4ge0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lfQotICAgICAqIG9yIG51bGwgaWYgbm9uZSBjYW4gYmUgZm91bmQuCi0gICAgICogQHBhcmFtIG5hbWUgYSB7QGxpbmsgU2ltcGxlTmFtZX0gb3Ige0BsaW5rIFF1YWxpZmllZE5hbWV9IGZvciB0aGUgYW5ub3RhdGlvbiB0byBzZWFyY2ggZm9yLgotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+SUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjwvY29kZT4gZm9yIHRoZSBnaXZlbiBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBnZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXJGb3JOYW1lKE5hbWUgbmFtZSkgewotICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobmFtZS5pc1NpbXBsZU5hbWUoKSAmJiBnZXRTaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwKCkuY29udGFpbnNLZXkoKChTaW1wbGVOYW1lKSBuYW1lKS5nZXRJZGVudGlmaWVyKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNpbXBsZU5hbWVUb0RlZmluaXRpb25NYXAoKS5nZXQoKChTaW1wbGVOYW1lKSBuYW1lKS5nZXRJZGVudGlmaWVyKCkpLmdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmlzUXVhbGlmaWVkTmFtZSgpICYmIGdldFF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXAoKS5jb250YWluc0tleShuYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRRdWFsaWZpZWROYW1lVG9EZWZpbml0aW9uTWFwKCkuZ2V0KG5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpLmdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUge0BsaW5rIEFubm90YXRpb25EZWZpbml0aW9ufSB3aXRoIHRoZSBnaXZlbiBhbm5vdGF0aW9uIGNhdGVnb3J5IG5hbWUuCi0gICAgICogQHBhcmFtIGNhdGVnb3J5TmFtZSB0aGUgYW5ub3RhdGlvbiBjYXRlZ29yeSBuYW1lLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFubm90YXRpb24gZGVmaW5pdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0QW5ub3RhdGlvbnNCeUNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeU5hbWUpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25zQnlDYXRlZ29yeU1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uc0J5Q2F0ZWdvcnlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+PigpOwotICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGdldEFubm90YXRpb25zKCkpIHsKLQotICAgICAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9uTGlzdCA9IGFubm90YXRpb25zQnlDYXRlZ29yeU1hcC5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRDYXRlZ29yeSgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPigpOwotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QuYWRkKGFubm90YXRpb25EZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNCeUNhdGVnb3J5TWFwLnB1dChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRDYXRlZ29yeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWZpbml0aW9uTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QuYWRkKGFubm90YXRpb25EZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnNCeUNhdGVnb3J5TWFwLmdldChjYXRlZ29yeU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBhbm5vdGF0aW9uIGNhdGVnb3JpZXMuCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgYW5ub3RhdGlvbiBjYXRlZ29yaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEFubm90YXRpb25DYXRlZ29yaWVzKCkgewotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChnZXRBbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSgpLnZhbHVlcygpLnRvQXJyYXkoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tnZXRBbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSgpLnNpemUoKV0pKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeUlkKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSgpLmdldChjYXRlZ29yeUlkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSgpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25DYXRlZ29yeUNhY2hlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZTsKLSAgICAgICAgfQotCi0gICAgICAgIGFubm90YXRpb25DYXRlZ29yeUNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4uUExVR0lOX0lELCBBTk5PVEFUSU9OX0NBVEVHT1JZKTsKLSAgICAgICAgaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZXh0ZW5zaW9uUG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZS5wdXQoZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgQVRUX0lEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIEFUVF9OQU1FKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25DYXRlZ29yeUNhY2hlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4gZ2V0QW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGU7Ci0gICAgICAgIH0KLQotICAgICAgICBhbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotCi0gICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgQU5OT1RBVElPTl9JTklUSUFMSVpFUik7Ci0gICAgICAgIGlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvblBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUucHV0KGdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIEFOTk9UQVRJT04pLAotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25Jbml0aWFsaXplckNhY2hlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50Pj4gZ2V0QW5ub3RhdGlvblByb2Nlc3NvcnNDYWNoZSgpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25Qcm9jZXNzb3JDYWNoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50Pj4oKTsKLQotICAgICAgICAgICAgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgQU5OT1RBVElPTl9QUk9DRVNTT1IpOwotICAgICAgICAgICAgaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvblBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoInByb2Nlc3NvciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbktleSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIEFOTk9UQVRJT04pOwotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGNvbmZpZ3VyYXRpb25FbGVtZW50cyA9IGFubm90YXRpb25Qcm9jZXNzb3JDYWNoZS5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25LZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkVsZW1lbnRzLmFkZChlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUucHV0KGFubm90YXRpb25LZXksIGNvbmZpZ3VyYXRpb25FbGVtZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGU7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBjb25maWd1cmF0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBnZXRBbGxBbm5vdGF0aW9uc0ZvckVsZW1lbnQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KQotICAgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlLlBBQ0tBR0UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgaWYgKHR5cGUuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuVFlQRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlLkZJRUxEKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlLk1FVEhPRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTG9jYWxWYXJpYWJsZSkgewotICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpIHsKLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLQotICAgICAgICBpZiAoYW5ub3RhdGlvbkNhY2hlID09IG51bGwpIHsKLSAgICAgICAgICAgIGdldEFubm90YXRpb25zKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uIDogYW5ub3RhdGlvbkNhY2hlKSB7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0VGFyZ2V0cygpLmNvbnRhaW5zKGVsZW1lbnRUeXBlKSAmJgotICAgICAgICAgICAgICAgICAgICAhaXNEZXByZWNhdGVkKGFubm90YXRpb25EZWZpbml0aW9uKSkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWZpbml0aW9ucy5hZGQoYW5ub3RhdGlvbkRlZmluaXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWx0ZXJBbm5vdGF0aW9uc0xpc3QoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgSXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25JdGVyID0gYW5ub3RhdGlvbkRlZmluaXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChhbm5vdGF0aW9uSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uID0gYW5ub3RhdGlvbkl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgewotICAgICAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChpc0NsYXNzUmVzdHJpY3RlZCh0eXBlLCBhbm5vdGF0aW9uRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzSW50ZXJmYWNlUmVzdHJpY3RlZCh0eXBlLCBhbm5vdGF0aW9uRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzRW51bVJlc3RyaWN0ZWQodHlwZSwgYW5ub3RhdGlvbkRlZmluaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmlzTWFpbk1ldGhvZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWFubm90YXRpb25EZWZpbml0aW9uLmdldFRhcmdldHMoKS5jb250YWlucyhFbGVtZW50VHlwZS5DT05TVFJVQ1RPUikpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzQ2xhc3NSZXN0cmljdGVkKG1ldGhvZCwgYW5ub3RhdGlvbkRlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0ludGVyZmFjZVJlc3RyaWN0ZWQobWV0aG9kLCBhbm5vdGF0aW9uRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzRW51bVJlc3RyaWN0ZWQobWV0aG9kLCBhbm5vdGF0aW9uRGVmaW5pdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpIHsKLSAgICAgICAgICAgICAgICBpZihpc0NsYXNzUmVzdHJpY3RlZChqYXZhRWxlbWVudCwgYW5ub3RhdGlvbkRlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0ludGVyZmFjZVJlc3RyaWN0ZWQoamF2YUVsZW1lbnQsIGFubm90YXRpb25EZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgfHxpc0VudW1SZXN0cmljdGVkKGphdmFFbGVtZW50LCBhbm5vdGF0aW9uRGVmaW5pdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzUmVzdHJpY3RlZChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0gICAgICAgICAgICByZXR1cm4gISgoSVR5cGUpamF2YUVsZW1lbnQpLmlzQ2xhc3MoKSAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0NsYXNzT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gIXR5cGUuaXNDbGFzcygpICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzQ2xhc3NPbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxEKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgcmV0dXJuICF0eXBlLmlzQ2xhc3MoKSAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0NsYXNzT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW50ZXJmYWNlUmVzdHJpY3RlZChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0gICAgICAgICAgICByZXR1cm4gISgoSVR5cGUpamF2YUVsZW1lbnQpLmlzSW50ZXJmYWNlKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNJbnRlcmZhY2VPbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiAhdHlwZS5pc0ludGVyZmFjZSgpICAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0ludGVyZmFjZU9ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gIXR5cGUuaXNJbnRlcmZhY2UoKSAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0ludGVyZmFjZU9ubHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VudW1SZXN0cmljdGVkKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKLSAgICAgICAgICAgIHJldHVybiAhKChJVHlwZSlqYXZhRWxlbWVudCkuaXNFbnVtKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNFbnVtT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gIXR5cGUuaXNFbnVtKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNFbnVtT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiAhdHlwZS5pc0VudW0oKSAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0VudW1Pbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vVE9ETyBNb3ZlIHRoZSBEZXByZWNhdGVkIG9wdGlvbiB0byBwcmVmZXJlbmNlcwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEZXByZWNhdGVkKEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uKSB7Ci0gICAgICAgIENsYXNzPD8+IGFubm90YXRpb25DbGFzcyA9IGFubm90YXRpb25EZWZpbml0aW9uLmdldEFubm90YXRpb25DbGFzcygpOwotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNsYXNzLmdldEFubm90YXRpb24oamF2YS5sYW5nLkRlcHJlY2F0ZWQuY2xhc3MpICE9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjNWQyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGluaXRpYWxpemVycyBjb250cmlidXRlZCB0byB0aGUKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPHA+Ci0gKiBQcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgYWxsIG1ldGhvZHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlCi0gKiB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsCi0gKiBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19JREVOVElGRVIgPSAiJG1pc3NpbmckIjsKLQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKSB7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyI2dldE1lbWJlclZhbHVlUGFpcnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuQ2xhc3MpCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIjZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyI2dldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb24pCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvclNpbmdsZU1lbWJlckFubm90YXRpb24oSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcHJvcG9zYWwsIEV4cHJlc3Npb24gdmFsdWUpIHsKLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXMuSU1HX09CSl9GSUxFKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCwgdmFsdWUsIGltYWdlLCBwcm9wb3NhbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoU3RyaW5nIHByb3Bvc2FsLCBFeHByZXNzaW9uIHZhbHVlLCBJbWFnZSBpbWFnZSwKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0gICAgICAgIGludCByZXBsYWNlbWVudE9mZnNldCA9IHZhbHVlLmdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICAgICAgaW50IHJlcGxhY2VtZW50TGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKE1JU1NJTkdfSURFTlRJRkVSKSkgewotICAgICAgICAgICAgaWYgKHByb3Bvc2FsLmNoYXJBdCgwKSAhPSAnXCInKSB7Ci0gICAgICAgICAgICAgICAgcHJvcG9zYWwgPSAiXCIiICsgcHJvcG9zYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJvcG9zYWwuY2hhckF0KHByb3Bvc2FsLmxlbmd0aCgpIC0gMSkgIT0gJ1wiJykgewotICAgICAgICAgICAgICAgIHByb3Bvc2FsID0gcHJvcG9zYWwgKyAiXCIiOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVwbGFjZW1lbnRPZmZzZXQgKz0gMTsKLSAgICAgICAgICAgIHJlcGxhY2VtZW50TGVuZ3RoID0gdmFsdWUuZ2V0TGVuZ3RoKCkgLSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgcHJvcG9zYWwubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIG51bGwsIG51bGwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYjViYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IGZyb20gdGhlIGRlZmF1bHRzIGZvdW5kIGluIHRoZSBnaXZlbiB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0uCi0gKiA8cD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotICogdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgewotCi0gICAgcHVibGljIERlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBsaXN0IG9mIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHVzaW5nIHRoZSBkZWNsYXJlZCBtZXRob2QgbmFtZXMgYW5kIGRlZmF1bHQgdmFsdWVzIGluCi0gICAgICogdGhlIGdpdmVuIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufS4KLSAgICAgKiAgQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyI2dldE1lbWJlclZhbHVlUGFpcnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuQ2xhc3MpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIGdldE1lbWJlclZhbHVlUGFpcnMoYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZXRob2RbXSBkZWNsYXJlZE1ldGhvZHMgPSBhbm5vdGF0aW9uQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGRlY2xhcmVkTWV0aG9kcykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICBPYmplY3QgZGVmYXVsdFZhbHVlID0gbWV0aG9kLmdldERlZmF1bHRWYWx1ZSgpOwotCi0gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBkZWZhdWx0VmFsdWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhCb29sZWFuLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBCb29sZWFuLnBhcnNlQm9vbGVhbihkZWZhdWx0VmFsdWUudG9TdHJpbmcoKSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpICYmIChyZXR1cm5UeXBlLmVxdWFscyhCeXRlLlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKFNob3J0LlRZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCByZXR1cm5UeXBlLmVxdWFscyhJbnRlZ2VyLlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKExvbmcuVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKEZsb2F0LlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKERvdWJsZS5UWVBFKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU51bWJlck1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIGRlZmF1bHRWYWx1ZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVBcnJheU1lbWJlclZhbHVlUGFpcihhc3QsIG1ldGhvZC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9iamVjdFtdKSBkZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0VudW0oKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCBuYW1lLCBkZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVUeXBlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpcnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJlZjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotLyoqCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgYW5ub3RhdGlvbiBhdHRyaWJ1dGUgaW5pdGlhbGl6ZXJzLgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIEBub2V4dGVuZCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHRoYXQgbWF5IGJlIGFkZGVkIHRvIGEge0BsaW5rIE5vcm1hbEFubm90YXRpb259LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCB0aGUgamF2YSBlbGVtZW50IG9uIHdoaWNoIHRoZSBhbm5vdGF0aW9uIGlzIGRlY2xhcmVkLgotICAgICAqIEBwYXJhbSBhc3QgdGhlIDxjb2RlPkFTVDwvY29kZT4gd2l0aCB3aGljaCB0byBjcmVhdGUgdGhlIG1lbWJlciB2YWx1ZSBwYWlycy4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbkNsYXNzIHRoZSB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0gY2xhc3Mgd2hpY2ggbWF5IGJlCi0gICAgICogdXNlZCB0byBxdWVyeSB0aGUgZGVjbGFyZWQgbWVtYmVycyBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIGFuZCB0aGUgbWVtYmVycyBkZWZhdWx0IHZhbHVlcy4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBtZW1iZXIgdmFsdWUgcGFpcnMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBwcm92aWRlIGEgbGlzdCBvZiB7QGxpbmsgSUNvbXBsZXRpb25Qcm9wb3NhbH0gZm9yIGEge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gdmFsdWUuCi0gICAgICogQHBhcmFtIGphdmFFbGVtZW50IHRoZSBqYXZhIGVsZW1lbnQgb24gd2hpY2ggdGhlIGFubm90YXRpb24gaXMgZGVjbGFyZWQuCi0gICAgICogQHBhcmFtIG1lbWJlclZhbHVlUGFpciB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgaW4gd2hpY2ggY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQuCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2Yge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWx9IGZvciBhIHtAbGluayBTaW5nbGVNZW1iZXJBbm5vdGF0aW9ufSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgdGhlIGphdmEgZWxlbWVudCBvbiB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyBkZWNsYXJlZC4KLSAgICAgKiBAcGFyYW0gc2luZ2xlTWVtYmVyQW5ub3RhdGlvbiB0aGUgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIGluIHdoaWNoIGNvbnRlbnQgYXNzaXN0IHdhcyBpbnZva2VkLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIFNpbmdsZU1lbWJlckFubm90YXRpb24gc2luZ2xlTWVtYmVyQW5ub3RhdGlvbik7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTU0NzlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLnV0aWwuRWNsaXBzZU1lc3NhZ2VyOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHByb2Nlc3NvcnMgY29udHJpYnV0ZWQgdG8gdGhlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uUHJvY2Vzc29yPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgaW1wbGVtZW50cyBBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yKCkgewotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB7QGxpbmsgQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50fSBlbnZpcm9ubWVudCB0byB1c2UgZHVyaW5nIHByb2Nlc3NpbmcuCi0gICAgICogQHBhcmFtIGVudmlyb25tZW50IHRoZSBhbm5vdGF0aW9uIHByb2Nlc3NvciBlbnZpcm9ubWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQoQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGFsbCBwcm9ncmFtIGVsZW1lbnRzIHN1cHBvcnRlZCBieSB0aGlzIGFubm90YXRpb24gcHJvY2Vzc29yLgotICAgICAqIAotICAgICAqIEBzZWUgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLCBvciBudWxsIGlmIGl0IGlzIHVua25vd24gb3Igbm90IGFwcGxpY2FibGUKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEVycm9yKFNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpLnByaW50RXJyb3IocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhbiBlcnJvciBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByaW50RXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludEVycm9yKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSB3YXJuaW5nIG9jY3VyZWQsIG9yIG51bGwgaWYgaXQgaXMgdW5rbm93biBvciBub3QgYXBwbGljYWJsZQotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByaW50V2FybmluZyhTb3VyY2VQb3NpdGlvbiBwb3NpdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludFdhcm5pbmcocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludFdhcm5pbmcobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGEgbm90aWNlLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIG5vdGljZSBvY2N1cmVkLCBvciBudWxsIGlmIGl0IGlzIHVua25vd24gb3Igbm90IGFwcGxpY2FibGUKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludE5vdGljZShTb3VyY2VQb3NpdGlvbiBwb3NpdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludE5vdGljZShwb3NpdGlvbiwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGEgbm90aWNlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByaW50Tm90aWNlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkucHJpbnROb3RpY2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYW4gZXJyb3IgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gcG9zaXRpb24gb2YgdGhlIGVycm9yCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlRXJyb3IoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpIGluc3RhbmNlb2YgRWNsaXBzZU1lc3NhZ2VyKSB7Ci0gICAgICAgICAgICBFY2xpcHNlTWVzc2FnZXIgbWVzc2FnZXIgPSAoRWNsaXBzZU1lc3NhZ2VyKSBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpOwotICAgICAgICAgICAgbWVzc2FnZXIucHJpbnRGaXhhYmxlRXJyb3IocG9zaXRpb24sIG1lc3NhZ2UsICIiLCBtZXNzYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYW4gZXJyb3IgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gcG9zaXRpb24gb2YgdGhlIGVycm9yCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCi0gICAgICogQHBhcmFtIHBsdWdpbklkIHBsdWctaW4gd2hpY2ggd2lsbCBwcm92aWRlIGEgamF2YSBxdWljayBmaXggcHJvY2Vzc29yIGZvciB0aGlzIGVycm9yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gZXJyb3JJZCBhIHBsdWctaW4gcHJvdmlkZWQgZXJyb3IgY29kZSB3aGljaCB3aWxsIGJlIG1lYW5pbmdmdWwgdG8gdGhlIGphdmEgcXVpY2sgZml4IHByb2Nlc3Nvci4gQ2Fubm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlRXJyb3IoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBlcnJvcklkKSB7Ci0gICAgICAgIGlmIChlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpIGluc3RhbmNlb2YgRWNsaXBzZU1lc3NhZ2VyKSB7Ci0gICAgICAgICAgICBFY2xpcHNlTWVzc2FnZXIgbWVzc2FnZXIgPSAoRWNsaXBzZU1lc3NhZ2VyKSBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpOwotICAgICAgICAgICAgbWVzc2FnZXIucHJpbnRGaXhhYmxlRXJyb3IocG9zaXRpb24sIG1lc3NhZ2UsIHBsdWdpbklkLCBlcnJvcklkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYW4gZXJyb3IgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gcGx1Z2luSWQgcGx1Zy1pbiB3aGljaCB3aWxsIHByb3ZpZGUgYSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IgZm9yIHRoaXMgZXJyb3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBlcnJvcklkIGEgcGx1Zy1pbiBwcm92aWRlZCBlcnJvciBjb2RlIHdoaWNoIHdpbGwgYmUgbWVhbmluZ2Z1bCB0byB0aGUgamF2YSBxdWljayBmaXggcHJvY2Vzc29yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEZpeGFibGVFcnJvcihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXJyb3JJZCkgewotICAgICAgICBpZiAoZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKSBpbnN0YW5jZW9mIEVjbGlwc2VNZXNzYWdlcikgewotICAgICAgICAgICAgRWNsaXBzZU1lc3NhZ2VyIG1lc3NhZ2VyID0gKEVjbGlwc2VNZXNzYWdlcikgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZUVycm9yKG1lc3NhZ2UsIHBsdWdpbklkLCBlcnJvcklkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBhIHdhcm5pbmcgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gcG9zaXRpb24gb2YgdGhlIHdhcm5pbmcKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gcGx1Z2luSWQgcGx1Zy1pbiB3aGljaCB3aWxsIHByb3ZpZGUgYSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IgZm9yIHRoaXMgZXJyb3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBlcnJvcklkIGEgcGx1Zy1pbiBwcm92aWRlZCBlcnJvciBjb2RlIHdoaWNoIHdpbGwgYmUgbWVhbmluZ2Z1bCB0byB0aGUgamF2YSBxdWljayBmaXggcHJvY2Vzc29yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEZpeGFibGVXYXJuaW5nKFNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXJyb3JJZCkgewotICAgICAgICBpZiAoZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKSBpbnN0YW5jZW9mIEVjbGlwc2VNZXNzYWdlcikgewotICAgICAgICAgICAgRWNsaXBzZU1lc3NhZ2VyIG1lc3NhZ2VyID0gKEVjbGlwc2VNZXNzYWdlcikgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZVdhcm5pbmcocG9zaXRpb24sIG1lc3NhZ2UsIHBsdWdpbklkLCBlcnJvcklkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50V2FybmluZyhwb3NpdGlvbiwgbWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBhIHdhcm5pbmcgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gcGx1Z2luSWQgcGx1Zy1pbiB3aGljaCB3aWxsIHByb3ZpZGUgYSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IgZm9yIHRoaXMgZXJyb3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBlcnJvcklkIGEgcGx1Zy1pbiBwcm92aWRlZCBlcnJvciBjb2RlIHdoaWNoIHdpbGwgYmUgbWVhbmluZ2Z1bCB0byB0aGUgamF2YSBxdWljayBmaXggcHJvY2Vzc29yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEZpeGFibGVXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBlcnJvcklkKSB7Ci0gICAgICAgIGlmIChlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpIGluc3RhbmNlb2YgRWNsaXBzZU1lc3NhZ2VyKSB7Ci0gICAgICAgICAgICBFY2xpcHNlTWVzc2FnZXIgbWVzc2FnZXIgPSAoRWNsaXBzZU1lc3NhZ2VyKSBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpOwotICAgICAgICAgICAgbWVzc2FnZXIucHJpbnRGaXhhYmxlV2FybmluZyhtZXNzYWdlLCBwbHVnaW5JZCwgZXJyb3JJZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludFdhcm5pbmcobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBhIG5vdGljZSBpbmNsdWRpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cyBmb3IgdXNlIGluIHF1aWNrLWZpeGVzLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbiBwb3NpdGlvbiBvZiB0aGUgbm90aWNlCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCi0gICAgICogQHBhcmFtIHBsdWdpbklkIHBsdWctaW4gd2hpY2ggd2lsbCBwcm92aWRlIGEgamF2YSBxdWljayBmaXggcHJvY2Vzc29yIGZvciB0aGlzIGVycm9yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gZXJyb3JJZCBhIHBsdWctaW4gcHJvdmlkZWQgZXJyb3IgY29kZSB3aGljaCB3aWxsIGJlIG1lYW5pbmdmdWwgdG8gdGhlIGphdmEgcXVpY2sgZml4IHByb2Nlc3Nvci4gQ2Fubm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlTm90aWNlKFNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXJyb3JJZCkgewotICAgICAgICBpZiAoZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKSBpbnN0YW5jZW9mIEVjbGlwc2VNZXNzYWdlcikgewotICAgICAgICAgICAgRWNsaXBzZU1lc3NhZ2VyIG1lc3NhZ2VyID0gKEVjbGlwc2VNZXNzYWdlcikgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZU5vdGljZShwb3NpdGlvbiwgbWVzc2FnZSwgcGx1Z2luSWQsIGVycm9ySWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnROb3RpY2UocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYSBub3RpY2UgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gcGx1Z2luSWQgcGx1Zy1pbiB3aGljaCB3aWxsIHByb3ZpZGUgYSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IgZm9yIHRoaXMgZXJyb3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBlcnJvcklkIGEgcGx1Zy1pbiBwcm92aWRlZCBlcnJvciBjb2RlIHdoaWNoIHdpbGwgYmUgbWVhbmluZ2Z1bCB0byB0aGUgamF2YSBxdWljayBmaXggcHJvY2Vzc29yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEZpeGFibGVOb3RpY2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGVycm9ySWQpIHsKLSAgICAgICAgaWYgKGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkgaW5zdGFuY2VvZiBFY2xpcHNlTWVzc2FnZXIpIHsKLSAgICAgICAgICAgIEVjbGlwc2VNZXNzYWdlciBtZXNzYWdlciA9IChFY2xpcHNlTWVzc2FnZXIpIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCk7Ci0gICAgICAgICAgICBtZXNzYWdlci5wcmludEZpeGFibGVOb3RpY2UobWVzc2FnZSwgcGx1Z2luSWQsIGVycm9ySWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnROb3RpY2UobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MTAzM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDLCBTaGFuZSBDbGFya2UKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBTaGFuZSBDbGFya2UgLSBSZXdyb3RlIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5JbXBvcnRSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkxpc3RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5Db2RlU3R5bGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TaGFyZWRBU1RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5JVW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYWRkaW5nLCByZW1vdmluZyBhbmQgdXBkYXRpbmcgYW5ub3RhdGlvbnMgYW5kIG1lbWJlciB2YWx1ZSBwYWlycy4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uVXRpbHMgewotCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBpbXBvcnQgdG8gdGhlIGNvbXBpbGF0aW9uIHVuaXQgb2YgdGhlIGdpdmVuIHtAbGluayBJSmF2YUVsZW1lbnR9LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCB0aGUgamF2YSBlbGVtZW50IHdoaWNoIGlzIHVzZWQgdG8gZ2V0IHRoZSBjb21waWxhdGlvbiB1bml0IHRvIGFkZCB0aGUgaW1wb3J0IHRvLgotICAgICAqIFRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50cyBhcmUgc3VwcG9ydGVkOgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSB0aGUgaW1wb3J0IHRvIGFkZC4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGltcG9ydCByZXdyaXRlIGZhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbXBvcnQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBUZXh0RmlsZUNoYW5nZSBjaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFkZCBJbXBvcnQiLCAoSUZpbGUpIGphdmFFbGVtZW50LmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBUZXh0RWRpdCBhbm5vdGF0aW9uRWRpdCA9IEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChqYXZhRWxlbWVudCwgcXVhbGlmaWVkTmFtZSk7Ci0gICAgICAgIGNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25FZGl0KTsKLSAgICAgICAgYXBwbHlDaGFuZ2UobnVsbCwgY2hhbmdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFuIGltcG9ydCBmcm9tIHRoZSBjb21waWxhdGlvbiB1bml0IG9mIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFFbGVtZW50fS4gVGhlIGltcG9ydCB3aWxsIG5vdCBiZSByZW1vdmVkIGlmIHRoZQotICAgICAqIGltcG9ydCB0eXBlIGlzIHJlZmVyZW5jZWQgb24gbW9yZSB0aGFuIG9uZSBhbm5vdGF0YWJsZSBlbGVtZW50IGluIHRoZSBzb3VyY2UgY29kZS4gVGhpcyBtZXRob2QKLSAgICAgKiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rIEFubm90YXRpb25VdGlscyNyZW1vdmVBbm5vdGF0aW9uKElKYXZhRWxlbWVudCwgQW5ub3RhdGlvbil9fS4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgdGhlIGphdmEgZWxlbWVudCB3aGljaCBpcyB1c2VkIHRvIGdldCB0aGUgY29tcGlsYXRpb24gdW5pdCB0byByZW1vdmUgdGhlIGltcG9ydCBmcm9tLgotICAgICAqIFRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50cyBhcmUgc3VwcG9ydGVkOgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSB0aGUgaW1wb3J0IHRvIHJlbW92ZS4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGltcG9ydCByZXdyaXRlIGZhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbXBvcnQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBUZXh0RmlsZUNoYW5nZSBjaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIlJlbW92ZSBJbXBvcnQiLCAoSUZpbGUpIGphdmFFbGVtZW50LmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBUZXh0RWRpdCBhbm5vdGF0aW9uRWRpdCA9IEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdChqYXZhRWxlbWVudCwgcXVhbGlmaWVkTmFtZSk7Ci0gICAgICAgIGNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25FZGl0KTsKLSAgICAgICAgYXBwbHlDaGFuZ2UobnVsbCwgY2hhbmdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiB7QGxpbmsgQW5ub3RhdGlvbn0gdG8gdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudHMgYXJlIHN1cHBvcnRlZDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uIHRvIGFkZC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzCi0gICAgICogYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQW5ub3RhdGlvbihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQWRkIGFubm90YXRpb24iLCAoSUZpbGUpIGphdmFFbGVtZW50LmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBUZXh0RWRpdCBhbm5vdGF0aW9uRWRpdCA9IEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uRWRpdCk7Ci0gICAgICAgIGFwcGx5Q2hhbmdlKG51bGwsIGNoYW5nZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4ge0BsaW5rIEFubm90YXRpb259IGZyb20gdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudHMgYXJlIHN1cHBvcnRlZDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uIHRvIHJlbW92ZS4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzCi0gICAgICogYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiUmVtb3ZlIGFubm90YXRpb24iLCAoSUZpbGUpIGphdmFFbGVtZW50LmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBUZXh0RWRpdCB0ZXh0RWRpdCA9IEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjaGFuZ2UuYWRkRWRpdCh0ZXh0RWRpdCk7Ci0gICAgICAgIGFwcGx5Q2hhbmdlKG51bGwsIGNoYW5nZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gdG8gdGhlIHtAbGluayBOb3JtYWxBbm5vdGF0aW9ufS4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgbm9ybWFsIGFubm90YXRpb24gdG8gYWRkIHRoZSBtZW1iZXIgdmFsdWUgcGFpciB0by4KLSAgICAgKiBAcGFyYW0gbWVtYmVyVmFsdWVQYWlyIHRoZSBtZW1iZXIgdmFsdWUgcGFpciB0byBhZGQuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gQSB7QGxpbmsgSmF2YU1vZGVsRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotICAgICAqIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoYW5ub3RhdGlvbi5nZXRSb290KCkgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBhbm5vdGF0aW9uLmdldFJvb3QoKTsKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQWRkIE1lbWJlciBWYWx1ZSBQYWlyIiwgKElGaWxlKSBjb21waWxhdGlvblVuaXQuZ2V0SmF2YUVsZW1lbnQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvbkVkaXQgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQoYW5ub3RhdGlvbiwgbWVtYmVyVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIGNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25FZGl0KTsKLSAgICAgICAgICAgIGFwcGx5Q2hhbmdlKG51bGwsIGNoYW5nZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSBmcm9tIHRoZSB7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbn0uCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIG5vcm1hbCBhbm5vdGF0aW9uIGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW0gbWVtYmVyVmFsdWVQYWlyIHRoZSBtZW1iZXIgdmFsdWUgcGFpciB0byByZW1vdmUuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gQSB7QGxpbmsgSmF2YU1vZGVsRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotICAgICAqIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoYW5ub3RhdGlvbi5nZXRSb290KCkgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBhbm5vdGF0aW9uLmdldFJvb3QoKTsKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiUmVtb3ZlIE1lbWJlciBWYWx1ZSBQYWlyIiwgKElGaWxlKSBjb21waWxhdGlvblVuaXQuZ2V0SmF2YUVsZW1lbnQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvbkVkaXQgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQoYW5ub3RhdGlvbiwgbWVtYmVyVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIGNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25FZGl0KTsKLSAgICAgICAgICAgIGFwcGx5Q2hhbmdlKG51bGwsIGNoYW5nZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB2YWx1ZSB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgQVNUTm9kZX0uCi0gICAgICogQHBhcmFtIG1lbWJlclZhbHVlUGFpciB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdXBkYXRlLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0LgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIEEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMKLSAgICAgKiBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVNZW1iZXJWYWx1ZVBhaXIoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciwgQVNUTm9kZSB2YWx1ZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0Um9vdCgpIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgbWVtYmVyVmFsdWVQYWlyLmdldFJvb3QoKTsKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiVXBkYXRlIE1lbWJlciBWYWx1ZSBQYWlyIiwgKElGaWxlKSBjb21waWxhdGlvblVuaXQuZ2V0SmF2YUVsZW1lbnQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvbkVkaXQgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQobWVtYmVyVmFsdWVQYWlyLCB2YWx1ZSk7Ci0gICAgICAgICAgICBjaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uRWRpdCk7Ci0gICAgICAgICAgICBhcHBseUNoYW5nZShudWxsLCBjaGFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgb2YgdGhlIHtAbGluayBTaW5nbGVNZW1iZXJBbm5vdGF0aW9ufSB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgQVNUTm9kZX0uCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiB0byB1cGRhdGUuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gQSB7QGxpbmsgSmF2YU1vZGVsRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotICAgICAqIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb24oU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBBU1ROb2RlIHZhbHVlKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uLmdldFJvb3QoKSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIGFubm90YXRpb24uZ2V0Um9vdCgpOwotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgY2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKCJVcGRhdGUgU2luZ2xlIE1lbWJlciBBbm5vdGF0aW9uIiwgKElGaWxlKSBjb21waWxhdGlvblVuaXQuZ2V0SmF2YUVsZW1lbnQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvbkVkaXQgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRleHRFZGl0KGFubm90YXRpb24sIHZhbHVlKTsKLSAgICAgICAgICAgIGNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25FZGl0KTsKLSAgICAgICAgICAgIGFwcGx5Q2hhbmdlKG51bGwsIGNoYW5nZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRleHRFZGl0fSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBhZGQgaW1wb3J0IGNoYW5nZSB0byB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGphdmEgZWxlbWVudHMgY29tcGlsYXRpb24gdW5pdC4KLSAgICAgKiBUaGUgY29tcGlsYXRpb24gdW5pdCBpdHNlbGYgaXMgbm90IG1vZGlmaWVkLgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIDxwPgotICAgICAqIFRoZSBqYXZhIGVsZW1lbnQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIHtAbGluayBDb21waWxhdGlvblVuaXR9IHdoaWNoIHdpbGwgaW4gdHVybiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiB7QGxpbmsgSW1wb3J0UmV3cml0ZX0uCi0gICAgICogPC9wPgotICAgICAqIEBwYXJhbSBxdWFsaWZpZWROYW1lIHRoZSBpbXBvcnQgdG8gYWRkLgotICAgICAqIEByZXR1cm4gdGV4dCBlZGl0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBhZGQgaW1wb3J0IGNoYW5nZXMuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBpbXBvcnQgcmV3cml0ZSBmYWlscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRleHRFZGl0IGNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChnZXRDb21waWxhdGlvblVuaXRGcm9tSmF2YUVsZW1lbnQoamF2YUVsZW1lbnQpLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgIEltcG9ydFJld3JpdGUgaW1wb3J0UmV3cml0ZSA9IENvZGVTdHlsZUNvbmZpZ3VyYXRpb24uY3JlYXRlSW1wb3J0UmV3cml0ZShjb21waWxhdGlvblVuaXQsIHRydWUpOwotICAgICAgICBpbXBvcnRSZXdyaXRlLmFkZEltcG9ydChxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgcmV0dXJuIGltcG9ydFJld3JpdGUucmV3cml0ZUltcG9ydHMobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0RWRpdH0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVtb3ZlIGltcG9ydCBjaGFuZ2UgdG8gdGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBqYXZhIGVsZW1lbnRzIGNvbXBpbGF0aW9uIHVuaXQuCi0gICAgICogVGhlIGNvbXBpbGF0aW9uIHVuaXQgaXRzZWxmIGlzIG5vdCBtb2RpZmllZC4gTm8gY2hhbmdlIHdpbGwgYmUgcmVjb3JkZWQgaWYgdGhlIGltcG9ydCB0eXBlIGlzIHJlZmVyZW5jZWQgb24gbW9yZSB0aGFuIG9uZSBhbiBhbm5vdGF0YWJsZQotICAgICAqIGVsZW1lbnQgaW4gdGhlIHNvdXJjZSBjb2RlLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rIEFubm90YXRpb25VdGlscyNjcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoSUphdmFFbGVtZW50LCBBbm5vdGF0aW9uKX19LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIDxwPgotICAgICAqIFRoZSBqYXZhIGVsZW1lbnQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIHtAbGluayBDb21waWxhdGlvblVuaXR9IHdoaWNoIHdpbGwgaW4gdHVybiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiB7QGxpbmsgSW1wb3J0UmV3cml0ZX0uCi0gICAgICogPC9wPgotICAgICAqIEBwYXJhbSBxdWFsaWZpZWROYW1lIHRoZSBhbm5vdGF0aW9uIGltcG9ydCB0byByZW1vdmUuCi0gICAgICogQHJldHVybiB0ZXh0IGVkaXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHJlbW92ZSBpbXBvcnQgY2hhbmdlcy4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGltcG9ydCByZXdyaXRlIGZhaWxzLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlUmVtb3ZlSW1wb3J0VGV4dEVkaXQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKGdldENvbXBpbGF0aW9uVW5pdEZyb21KYXZhRWxlbWVudChqYXZhRWxlbWVudCksIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLSAgICAgICAgSW1wb3J0UmV3cml0ZSBpbXBvcnRSZXdyaXRlID0gQ29kZVN0eWxlQ29uZmlndXJhdGlvbi5jcmVhdGVJbXBvcnRSZXdyaXRlKGNvbXBpbGF0aW9uVW5pdCwgdHJ1ZSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uU2ltcGxlTmFtZSA9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKHF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOwotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gb2NjdXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKHF1YWxpZmllZE5hbWUpOwotICAgICAgICBMaXN0PEVsZW1lbnRUeXBlPiBlbGVtZW50VHlwZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgaWYgKGFubm90YXRpb25EZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVsZW1lbnRUeXBlcyA9IGFubm90YXRpb25EZWZpbml0aW9uLmdldFRhcmdldHMoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlIDogZWxlbWVudFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT0gRWxlbWVudFR5cGUuUEFDS0FHRSkgewotICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5hY2NlcHQobmV3IEFTVFZpc2l0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudEFubm90YXRpb25PY2N1cnJlbmNlcyhwYWNrYWdlRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblNpbXBsZU5hbWUsIG9jY3VyZW5jZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT0gRWxlbWVudFR5cGUuVFlQRSkgewotICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5hY2NlcHQobmV3IEFTVFZpc2l0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudEFubm90YXRpb25PY2N1cnJlbmNlcyh0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25TaW1wbGVOYW1lLCBvY2N1cmVuY2VzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IEVsZW1lbnRUeXBlLkZJRUxEKSB7Ci0gICAgICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LmFjY2VwdChuZXcgQVNUVmlzaXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRBbm5vdGF0aW9uT2NjdXJyZW5jZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkRGVjbGFyYXRpb24ubW9kaWZpZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25TaW1wbGVOYW1lLCBvY2N1cmVuY2VzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IEVsZW1lbnRUeXBlLk1FVEhPRCkgewotICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5hY2NlcHQobmV3IEFTVFZpc2l0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRBbm5vdGF0aW9uT2NjdXJyZW5jZXMobWV0aG9kRGVjbGFyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uU2ltcGxlTmFtZSwgb2NjdXJlbmNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZSA9PSBFbGVtZW50VHlwZS5QQVJBTUVURVIpIHsKLSAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudEFubm90YXRpb25PY2N1cnJlbmNlcyhzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tb2RpZmllcnMoKSwgYW5ub3RhdGlvblNpbXBsZU5hbWUsIG9jY3VyZW5jZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9jY3VyZW5jZXMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgIGltcG9ydFJld3JpdGUucmVtb3ZlSW1wb3J0KHF1YWxpZmllZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8gQ2xlYW51cCBpbXBvcnRzLiBSZXBlYXRlZGx5IGFkZGluZyBhbmQgcmVtb3ZpbmcgYW4gaW1wb3J0Ci0gICAgICAgIC8vIHdoZXJlIG5vbmUgZXhpc3RlZCBiZWZvcmUgd2lsbAotICAgICAgICAvLyBpbnNlcnQgYSBuZXcgbGluZSBvbiBlYWNoIGluc2VydC4KLSAgICAgICAgcmV0dXJuIGltcG9ydFJld3JpdGUucmV3cml0ZUltcG9ydHMobnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3VudEFubm90YXRpb25PY2N1cnJlbmNlcyhMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMsIFN0cmluZyBhbm5vdGF0aW9uU2ltcGxlTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBvY2N1cmVuY2VzKSB7Ci0gICAgICAgIGZvciAoSUV4dGVuZGVkTW9kaWZpZXIgZXh0ZW5kZWRNb2RpZmllciA6IG1vZGlmaWVycykgewotICAgICAgICAgICAgaWYgKGV4dGVuZGVkTW9kaWZpZXIgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBleGlzdGluZ0Fubm90YXRpb24gPSAoQW5ub3RhdGlvbikgZXh0ZW5kZWRNb2RpZmllcjsKLSAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGV4aXN0aW5nQW5ub3RhdGlvbikuZXF1YWxzKGFubm90YXRpb25TaW1wbGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBvY2N1cmVuY2VzLmFkZChhbm5vdGF0aW9uU2ltcGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0RWRpdH0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYWRkIGFubm90YXRpb24gY2hhbmdlIHRvIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgamF2YSBlbGVtZW50cyBjb21waWxhdGlvbiB1bml0LgotICAgICAqIFRoZSBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi0gICAgICogQHBhcmFtIGphdmFFbGVtZW50IG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uIHRvIGFkZC4KLSAgICAgKiBAcmV0dXJuIHRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgYWRkIGFubm90YXRpb24gY2hhbmdlcy4gUmV0dXJucyBhIHtAbGluayBNdWx0aVRleHRFZGl0fSBpZiB0aGUgZ2l2ZW4gamF2YSBlbGVtZW50IGlzbid0IHN1cHBvcnRlZC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzCi0gICAgICogYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRleHRFZGl0IGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN3aXRjaChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KChJUGFja2FnZURlY2xhcmF0aW9uKSBqYXZhRWxlbWVudCwgYW5ub3RhdGlvbik7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LlRZUEU6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KChJVHlwZSkgamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5GSUVMRDoKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoKElGaWVsZCkgamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KChJTWV0aG9kKSBqYXZhRWxlbWVudCwgYW5ub3RhdGlvbik7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdCgoSUxvY2FsVmFyaWFibGUpIGphdmFFbGVtZW50LCBhbm5vdGF0aW9uKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0RWRpdH0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVtb3ZlIGFubm90YXRpb24gY2hhbmdlIHRvIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgamF2YSBlbGVtZW50cyBjb21waWxhdGlvbiB1bml0LgotICAgICAqIFRoZSBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi0gICAgICogQHBhcmFtIGphdmFFbGVtZW50IG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uIHRvIGFkZC4KLSAgICAgKiBAcmV0dXJuIHRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgYWRkIGFubm90YXRpb24gY2hhbmdlcy4gUmV0dXJucyBhIHtAbGluayBNdWx0aVRleHRFZGl0fSBpZiB0aGUgZ2l2ZW4gamF2YSBlbGVtZW50IGlzbid0IHN1cHBvcnRlZC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzCi0gICAgICogYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRleHRFZGl0IGNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN3aXRjaChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KChJUGFja2FnZURlY2xhcmF0aW9uKSBqYXZhRWxlbWVudCwgYW5ub3RhdGlvbik7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LlRZUEU6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KChJVHlwZSkgamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5GSUVMRDoKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoKElGaWVsZCkgamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KChJTWV0aG9kKSBqYXZhRWxlbWVudCwgYW5ub3RhdGlvbik7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdCgoSUxvY2FsVmFyaWFibGUpIGphdmFFbGVtZW50LCBhbm5vdGF0aW9uKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIENoYW5nZSBjaGFuZ2UpIHsKLSAgICAgICAgaWYgKGNoYW5nZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIElVbmRvTWFuYWdlciBtYW5hZ2VyID0gUmVmYWN0b3JpbmdDb3JlLmdldFVuZG9NYW5hZ2VyKCk7Ci0gICAgICAgIGJvb2xlYW4gc3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgICAgICBDaGFuZ2UgdW5kb0NoYW5nZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotICAgICAgICAgICAgUmVmYWN0b3JpbmdTdGF0dXMgdmFsaWQgPSBjaGFuZ2UuaXNWYWxpZChtb25pdG9yKTsKLSAgICAgICAgICAgIGlmICh2YWxpZC5pc09LKCkpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLmFib3V0VG9QZXJmb3JtQ2hhbmdlKGNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgdW5kb0NoYW5nZSA9IGNoYW5nZS5wZXJmb3JtKG1vbml0b3IpOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1hbmFnZXIuY2hhbmdlUGVyZm9ybWVkKGNoYW5nZSwgc3VjY2Vzc2Z1bCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVuZG9DaGFuZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdW5kb0NoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0gICAgICAgICAgICBtYW5hZ2VyLmFkZFVuZG8odW5kb0NoYW5nZS5nZXROYW1lKCksIHVuZG9DaGFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KElQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAocGFja2FnZURlY2xhcmF0aW9uICE9IG51bGwgJiYgIWlzQW5ub3RhdGlvblByZXNlbnQocGFja2FnZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKSB7Ci0gICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdEZyb21KYXZhRWxlbWVudChwYWNrYWdlRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShjb21waWxhdGlvblVuaXQuZ2V0QVNUKCkpOwotCi0gICAgICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKGNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlKCksIFBhY2thZ2VEZWNsYXJhdGlvbi5BTk5PVEFUSU9OU19QUk9QRVJUWSk7Ci0KLSAgICAgICAgICAgIGxpc3RSZXdyaXRlLmluc2VydEZpcnN0KGFubm90YXRpb24sIG51bGwpOwotCi0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRleHRFZGl0IGNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChJUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhY2thZ2VEZWNsYXJhdGlvbiAhPSBudWxsICYmIGlzQW5ub3RhdGlvblByZXNlbnQocGFja2FnZURlY2xhcmF0aW9uLCBnZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpIHsKLSAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0RnJvbUphdmFFbGVtZW50KHBhY2thZ2VEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNvdXJjZSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotICAgICAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGNvbXBpbGF0aW9uVW5pdC5nZXRBU1QoKSk7Ci0KLSAgICAgICAgICAgIFBhY2thZ2VEZWNsYXJhdGlvbiBwa2dEZWNsYXJhdGlvbiA9IGNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlKCk7Ci0KLSAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUocGtnRGVjbGFyYXRpb24sIFBhY2thZ2VEZWNsYXJhdGlvbi5BTk5PVEFUSU9OU19QUk9QRVJUWSk7Ci0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgTGlzdCBvcmlnaW5hbExpc3QgPSBsaXN0UmV3cml0ZS5nZXRPcmlnaW5hbExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IG9yaWdpbmFsTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBbm5vdGF0aW9uICYmIGNvbXBhcmVBbm5vdGF0aW9uTmFtZXMoKEFubm90YXRpb24pIG9iamVjdCwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUucmVtb3ZlKChBbm5vdGF0aW9uKSBvYmplY3QsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KElUeXBlIHR5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGdldFR5cGVEZWNsYXJhdGlvbih0eXBlKTsKLSAgICAgICAgaWYodHlwZURlY2xhcmF0aW9uICE9IG51bGwgJiYgIWlzQW5ub3RhdGlvblByZXNlbnQodHlwZSwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZSh0eXBlRGVjbGFyYXRpb24uZ2V0QVNUKCkpOwotCi0gICAgICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKHR5cGVEZWNsYXJhdGlvbiwgZ2V0Q2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yRm9yVHlwZSh0eXBlRGVjbGFyYXRpb24pKTsKLQotICAgICAgICAgICAgbGlzdFJld3JpdGUuaW5zZXJ0Rmlyc3QoYW5ub3RhdGlvbiwgbnVsbCk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KElUeXBlIHR5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGdldFR5cGVEZWNsYXJhdGlvbih0eXBlKTsKLSAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsICYmIGlzQW5ub3RhdGlvblByZXNlbnQodHlwZSwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZSh0eXBlRGVjbGFyYXRpb24uZ2V0QVNUKCkpOwotCi0gICAgICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKHR5cGVEZWNsYXJhdGlvbiwgZ2V0Q2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yRm9yVHlwZSh0eXBlRGVjbGFyYXRpb24pKTsKLQotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBMaXN0IG9yaWdpbmFsTGlzdCA9IGxpc3RSZXdyaXRlLmdldE9yaWdpbmFsTGlzdCgpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogb3JpZ2luYWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFubm90YXRpb24gJiYgY29tcGFyZUFubm90YXRpb25OYW1lcygoQW5ub3RhdGlvbilvYmplY3QsIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RSZXdyaXRlLnJlbW92ZSgoQW5ub3RhdGlvbilvYmplY3QsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KElNZXRob2QgbWV0aG9kLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGdldE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCk7Ci0gICAgICAgIGlmIChtZXRob2REZWNsYXJhdGlvbiAhPSBudWxsICYmICFpc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShtZXRob2REZWNsYXJhdGlvbi5nZXRBU1QoKSk7Ci0KLSAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUobWV0aG9kRGVjbGFyYXRpb24sICBNZXRob2REZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZKTsKLQotICAgICAgICAgICAgbGlzdFJld3JpdGUuaW5zZXJ0QXQoYW5ub3RhdGlvbiwgMCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KElNZXRob2QgbWV0aG9kLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGdldE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCk7Ci0gICAgICAgIGlmIChtZXRob2REZWNsYXJhdGlvbiAhPSBudWxsICYmIGlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKG1ldGhvZERlY2xhcmF0aW9uLmdldEFTVCgpKTsKLQotICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShtZXRob2REZWNsYXJhdGlvbiwgIE1ldGhvZERlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFkpOwotCi0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIExpc3Qgb3JpZ2luYWxMaXN0ID0gbGlzdFJld3JpdGUuZ2V0T3JpZ2luYWxMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBvcmlnaW5hbExpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJiBjb21wYXJlQW5ub3RhdGlvbk5hbWVzKChBbm5vdGF0aW9uKSBvYmplY3QsIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RSZXdyaXRlLnJlbW92ZSgoQW5ub3RhdGlvbikgb2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRleHRFZGl0IGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChJRmllbGQgZmllbGQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IGdldEZpZWxkRGVjbGFyYXRpb24oZmllbGQpOwotICAgICAgICBpZiAoZmllbGREZWNsYXJhdGlvbiAhPSBudWxsICYmICFpc0Fubm90YXRpb25QcmVzZW50KGZpZWxkLCBhbm5vdGF0aW9uKSkgewotCi0gICAgICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoZmllbGREZWNsYXJhdGlvbi5nZXRBU1QoKSk7Ci0KLSAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoZmllbGREZWNsYXJhdGlvbiwgRmllbGREZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZKTsKLSAgICAgICAgICAgIGxpc3RSZXdyaXRlLmluc2VydEF0KGFubm90YXRpb24sIDAsIG51bGwpOwotCi0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KElGaWVsZCBmaWVsZCwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gZ2V0RmllbGREZWNsYXJhdGlvbihmaWVsZCk7Ci0gICAgICAgIGlmIChmaWVsZERlY2xhcmF0aW9uICE9IG51bGwgJiYgaXNBbm5vdGF0aW9uUHJlc2VudChmaWVsZCwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShmaWVsZERlY2xhcmF0aW9uLmdldEFTVCgpKTsKLQotICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShmaWVsZERlY2xhcmF0aW9uLCBGaWVsZERlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFkpOwotCi0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIExpc3Qgb3JpZ2luYWxMaXN0ID0gbGlzdFJld3JpdGUuZ2V0T3JpZ2luYWxMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBvcmlnaW5hbExpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJiBjb21wYXJlQW5ub3RhdGlvbk5hbWVzKChBbm5vdGF0aW9uKSBvYmplY3QsIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RSZXdyaXRlLnJlbW92ZSgoQW5ub3RhdGlvbikgb2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRleHRFZGl0IGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChJTG9jYWxWYXJpYWJsZSBtZXRob2RQYXJhbWV0ZXIsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbihtZXRob2RQYXJhbWV0ZXIpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwgJiYgIWlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kUGFyYW1ldGVyLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKSB7Ci0gICAgICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUocGFyYW1ldGVyLmdldEFTVCgpKTsKLQotICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShwYXJhbWV0ZXIsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSk7Ci0KLSAgICAgICAgICAgIGxpc3RSZXdyaXRlLmluc2VydEF0KGFubm90YXRpb24sIC0xLCBudWxsKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJld3JpdGVyLnJld3JpdGVBU1QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUZXh0RWRpdCBjcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoSUxvY2FsVmFyaWFibGUgbWV0aG9kUGFyYW1ldGVyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9IGdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24obWV0aG9kUGFyYW1ldGVyKTsKLSAgICAgICAgaWYgKGlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kUGFyYW1ldGVyLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKSB7Ci0gICAgICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUocGFyYW1ldGVyLmdldEFTVCgpKTsKLQotICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShwYXJhbWV0ZXIsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSk7Ci0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgTGlzdCBvcmlnaW5hbExpc3QgPSBsaXN0UmV3cml0ZS5nZXRPcmlnaW5hbExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IG9yaWdpbmFsTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBbm5vdGF0aW9uICYmIGNvbXBhcmVBbm5vdGF0aW9uTmFtZXMoKEFubm90YXRpb24pb2JqZWN0LCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0UmV3cml0ZS5yZW1vdmUoKEFubm90YXRpb24pb2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0RWRpdH0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY2hhbmdlIG9mIGFkZGluZyB0aGUge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gdG8gdGhlIHtAbGluayBOb3JtYWxBbm5vdGF0aW9ufS4KLSAgICAgKiBUaGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIG5vcm1hbCBhbm5vdGF0aW9uIHRvIGFkZCB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8uCi0gICAgICogQHBhcmFtIG1lbWJlclZhbHVlUGFpciB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8gYWRkLgotICAgICAqIEByZXR1cm4gdGV4dCBlZGl0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBhZGQgbWVtYmVyIHZhbHVlIHBhaXIgY2hhbmdlLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIEEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4KLSAgICAgKiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cyBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlQWRkTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFubm90YXRpb24uZ2V0QVNUKCkpOwotCi0gICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoYW5ub3RhdGlvbiwgTm9ybWFsQW5ub3RhdGlvbi5WQUxVRVNfUFJPUEVSVFkpOwotCi0gICAgICAgIGxpc3RSZXdyaXRlLmluc2VydExhc3QobWVtYmVyVmFsdWVQYWlyLCBudWxsKTsKLQotICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVGV4dEVkaXR9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNoYW5nZSBvZiByZW1vdmluZyB0aGUge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gZnJvbSB0aGUge0BsaW5rIE5vcm1hbEFubm90YXRpb259LgotICAgICAqIFRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXQgaXRzZWxmIGlzIG5vdCBtb2RpZmllZC4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgbm9ybWFsIGFubm90YXRpb24gdG8gcmVtb3ZlIHRoZSBtZW1iZXIgdmFsdWUgcGFpciBmcm9tLgotICAgICAqIEBwYXJhbSBtZW1iZXJWYWx1ZVBhaXIgdGhlIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHJlbW92ZS4KLSAgICAgKiBAcmV0dXJuIHRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgcmVtb3ZlIG1lbWJlciB2YWx1ZSBwYWlyIGNoYW5nZS4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuCi0gICAgICogdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMgYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRleHRFZGl0IGNyZWF0ZVJlbW92ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0KE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhbm5vdGF0aW9uLmdldEFTVCgpKTsKLQotICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKGFubm90YXRpb24sIE5vcm1hbEFubm90YXRpb24uVkFMVUVTX1BST1BFUlRZKTsKLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgTGlzdCBvcmlnaW5hbExpc3QgPSBsaXN0UmV3cml0ZS5nZXRPcmlnaW5hbExpc3QoKTsKLSAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogb3JpZ2luYWxMaXN0KSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG12cCA9IChNZW1iZXJWYWx1ZVBhaXIpIG9iamVjdDsKLSAgICAgICAgICAgICAgICBpZiAobXZwLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0UmV3cml0ZS5yZW1vdmUobXZwLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJld3JpdGVyLnJld3JpdGVBU1QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRleHRFZGl0fSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjaGFuZ2Ugb2YgdXBkYXRpbmcgdGhlIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHdpdGggdGhlIHtAbGluayBBU1ROb2RlfSB2YWx1ZS4KLSAgICAgKiBUaGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi0gICAgICogQHBhcmFtIG1lbWJlclZhbHVlUGFpciB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdXBkYXRlLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0LgotICAgICAqIEByZXR1cm4gdGV4dCBlZGl0IG9iamVjdCBkZXNjcmliaW5nIHRoZSB1cGRhdGUgbWVtYmVyIHZhbHVlIHBhaXIgY2hhbmdlLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIEEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4KLSAgICAgKiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cyBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciwgQVNUTm9kZSB2YWx1ZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShtZW1iZXJWYWx1ZVBhaXIuZ2V0QVNUKCkpOwotCi0gICAgICAgIHJld3JpdGVyLnNldChtZW1iZXJWYWx1ZVBhaXIsIE1lbWJlclZhbHVlUGFpci5WQUxVRV9QUk9QRVJUWSwgdmFsdWUsIG51bGwpOwotCi0gICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0RWRpdH0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY2hhbmdlIG9mIHVwZGF0aW5nIHRoZSB7QGxpbmsgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbn0gd2l0aCB0aGUge0BsaW5rIEFTVE5vZGV9IHZhbHVlLgotICAgICAqIFRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXQgaXRzZWxmIGlzIG5vdCBtb2RpZmllZC4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgc2luZ2xlIG1lbWViZXIgYW5ub3RhdGlvbiB0byB1cGRhdGUuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQuCi0gICAgICogQHJldHVybiB0ZXh0IGVkaXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHVwZGF0ZSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gY2hhbmdlLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIEEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4KLSAgICAgKiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cyBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRleHRFZGl0KFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiwgQVNUTm9kZSB2YWx1ZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhbm5vdGF0aW9uLmdldEFTVCgpKTsKLQotICAgICAgICByZXdyaXRlci5zZXQoYW5ub3RhdGlvbiwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5WQUxVRV9QUk9QRVJUWSwgdmFsdWUsIG51bGwpOwotCi0gICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBJQ29tcGlsYXRpb25Vbml0fSBmb3IgdGhlIGdpdmVuIHtAbGluayBJSmF2YUVsZW1lbnR9LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEByZXR1cm4gYSBjb21waWxhdGlvbiB1bml0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXRGcm9tSmF2YUVsZW1lbnQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB7Ci0gICAgICAgIHN3aXRjaChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ6Ci0gICAgICAgICAgICByZXR1cm4gKElDb21waWxhdGlvblVuaXQpIGphdmFFbGVtZW50OwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OOgotICAgICAgICAgICAgSVBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24gPSAoSVBhY2thZ2VEZWNsYXJhdGlvbikgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICByZXR1cm4gKElDb21waWxhdGlvblVuaXQpIHBhY2thZ2VEZWNsYXJhdGlvbi5nZXRQYXJlbnQoKTsKLSAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQ6Ci0gICAgICAgICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIHJldHVybiBmaWVsZC5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU6Ci0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gKElMb2NhbFZhcmlhYmxlKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIGlmIChsb2NhbFZhcmlhYmxlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb21waWxhdGlvblVuaXRGcm9tSmF2YUVsZW1lbnQobG9jYWxWYXJpYWJsZS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpIGphdmFFbGVtZW50LmdldFJlc291cmNlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEFic3RyYWN0VHlwZURlY2xhcmF0aW9ufSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB7QGxpbmsgSVR5cGV9LgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlLgotICAgICAqIEByZXR1cm4gYSB0eXBlIGRlY2xhcmF0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKElUeXBlIHR5cGUpIHsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVCh0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgIExpc3Q8VHlwZURlY2xhcmF0aW9uPiB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC50eXBlcygpOwotICAgICAgICBmb3IgKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uIDogdHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChjb21wYXJlVHlwZU5hbWVzKGFic3RyYWN0VHlwZURlY2xhcmF0aW9uLCB0eXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTWV0aG9kRGVjbGFyYXRpb259IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHtAbGluayBJTWV0aG9kfS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QKLSAgICAgKiBAcmV0dXJuIGEgbWV0aG9kIGRlY2xhcmF0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kRGVjbGFyYXRpb24gZ2V0TWV0aG9kRGVjbGFyYXRpb24oSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gZ2V0VHlwZURlY2xhcmF0aW9uKG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOwotICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBib2R5RGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKLSAgICAgICAgICAgIGZvciAoQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbiA6IGJvZHlEZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoYm9keURlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVNZXRob2RzKG1ldGhvZERlY2xhcmF0aW9uLCBtZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHtAbGluayBJRmllbGR9LgotICAgICAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQKLSAgICAgKiBAcmV0dXJuIGEgZmllbGQgZGVjbGFyYXRpb24gb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBGaWVsZERlY2xhcmF0aW9uIGdldEZpZWxkRGVjbGFyYXRpb24oSUZpZWxkIGZpZWxkKSB7Ci0gICAgICAgIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGdldFR5cGVEZWNsYXJhdGlvbihmaWVsZC5nZXREZWNsYXJpbmdUeXBlKCkpOwotICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBib2R5RGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKLSAgICAgICAgICAgIGZvciAoQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbiA6IGJvZHlEZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoYm9keURlY2xhcmF0aW9uIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgYm9keURlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZUZpZWxkTmFtZXMoZmllbGREZWNsYXJhdGlvbiwgZmllbGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGREZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbn0gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4ge0BsaW5rIElMb2NhbFZhcmlhYmxlfS4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgdGhlIGxvY2FsIHZhcmlhYmxlCi0gICAgICogQHJldHVybiBhIHNpbmdsZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbihJTG9jYWxWYXJpYWJsZSBqYXZhRWxlbWVudCkgewotICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTG9jYWxWYXJpYWJsZSAmJiBqYXZhRWxlbWVudC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgIElMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGUgPSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGxvY2FsVmFyaWFibGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGdldE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobG9jYWxWYXJpYWJsZS5nZXRFbGVtZW50TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIGdldENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvckZvclR5cGUoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24KLSAgICAgICAgICAgIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBjaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgPSBudWxsOwotICAgICAgICBpZiAoYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIGNoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciA9IFR5cGVEZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikgewotICAgICAgICAgICAgY2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yID0gRW51bURlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgY2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yID0gQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYW5ub3RhdGlvbnMgdHlwZSBuYW1lLiBJZiB0aGUgYW5ub3RhdGlvbiBuYW1lIGlzIGEgc2ltcGxlIG5hbWUsIHRoZSByZXN1bHQgaXMgdGhlCi0gICAgICogbmFtZSdzIGlkZW50aWZpZXIuIElmIHRoZSBuYW1lIGlzIGEgcXVhbGlmaWVkIG5hbWUsIHRoZSByZXN1bHQgaXMgdGhlIG5hbWUgb2YgdGhlIHF1YWxpZmllcgotICAgICAqIGZvbGxvd2VkIGJ5ICIuIiBmb2xsb3dlZCBieSB0aGUgbmFtZSdzIGlkZW50aWZpZXIuCi0KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIG5hbWUuIFRoZSBzaW1wbGUgbmFtZSBvciB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIE5hbWUgYW5ub3RhdGlvblR5cGVOYW1lID0gYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpOwotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblR5cGVOYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSB7QGxpbmsgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb259IGFuZCB7QGxpbmsgSVR5cGV9LgotICAgICAqIEBwYXJhbSBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0aGUgdHlwZSBkZWNsYXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZS4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuYW1lcyBtYXRjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZVR5cGVOYW1lcyhBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiwgSVR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHModHlwZS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufSBhbmQge0BsaW5rIElNZXRob2R9LgotICAgICAqIEBwYXJhbSBtZXRob2REZWNsYXJhdGlvbiB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uLgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbmFtZXMgYW5kIHBhcmFtZXRlciB0eXBlcyBtYXRjaC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZU1ldGhvZHMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIGlmIChtZXRob2REZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtZXRldFR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9uUGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXRUeXBlcy5sZW5ndGggPT0gbWV0aG9kRGVjbGFyYXRpb25QYXJhbWV0ZXJzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGV0VHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNpbXBsZU5hbWUxID0gU2lnbmF0dXJlLnRvU3RyaW5nKHBhcmFtZXRldFR5cGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNpbXBsZU5hbWUyID0gbWV0aG9kRGVjbGFyYXRpb25QYXJhbWV0ZXJzLmdldChpKS5nZXRUeXBlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzaW1wbGVOYW1lMS5lcXVhbHMoc2ltcGxlTmFtZTIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSB0d28ge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kT25lIHRoZSBmaXJzdCBtZXRob2QgZGVjbGFyYXRpb24uCi0gICAgICogQHBhcmFtIG1ldGhvZFR3byB0aGUgc2Vjb25kIG1ldGhvZCBkZWNsYXJhdGlvbi4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbmFtZXMgYW5kIHBhcmFtZXRlciB0eXBlcyBtYXRjaC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZU1ldGhvZHMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kT25lLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2RUd28pIHsKLSAgICAgICAgaWYgKG1ldGhvZE9uZS5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZXRob2RUd28uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSkpIHsKLSAgICAgICAgICAgIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gbWV0aG9kUGFyYW1ldGVyc09uZSA9IG1ldGhvZE9uZS5wYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IG1ldGhvZFBhcmFtZXRlcnNUd28gPSBtZXRob2RUd28ucGFyYW1ldGVycygpOwotICAgICAgICAgICAgaWYgKG1ldGhvZFBhcmFtZXRlcnNPbmUuc2l6ZSgpID09IG1ldGhvZFBhcmFtZXRlcnNUd28uc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RQYXJhbWV0ZXJzT25lLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaW1wbGVOYW1lMSA9IG1ldGhvZFBhcmFtZXRlcnNPbmUuZ2V0KGkpLmdldFR5cGUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2ltcGxlTmFtZTIgPSBtZXRob2RQYXJhbWV0ZXJzVHdvLmdldChpKS5nZXRUeXBlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzaW1wbGVOYW1lMS5lcXVhbHMoc2ltcGxlTmFtZTIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSB0d28ge0BsaW5rIGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9ufS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kT25lIHRoZSBmaXJzdCBtZXRob2QgZGVjbGFyYXRpb24uCi0gICAgICogQHBhcmFtIG1ldGhvZFR3byB0aGUgc2Vjb25kIG1ldGhvZCBkZWNsYXJhdGlvbi4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbmFtZXMgYW5kIHBhcmFtZXRlciB0eXBlcyBtYXRjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZU1ldGhvZHMoY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kT25lLAotICAgICAgICAgICAgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kVHdvKSB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlTWV0aG9kTmFtZXMobWV0aG9kT25lLCBtZXRob2RUd28pICYmIGNvbXBhcmVNZXRob2RQYXJhbWV0ZXJUeXBlcyhtZXRob2RPbmUsIG1ldGhvZFR3byk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWV0aG9kTmFtZXMoY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kT25lLAotICAgICAgICAgICAgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kVHdvKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2RPbmUuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyhtZXRob2RUd28uZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbXBhcmVNZXRob2RQYXJhbWV0ZXJUeXBlcyhjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbiBtZXRob2RPbmUsCi0gICAgICAgICAgICBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbiBtZXRob2RUd28pIHsKLSAgICAgICAgaW50IG51bWJlck9mUGFyYW1ldGVyc09uZSA9IG1ldGhvZE9uZS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpOwotICAgICAgICBpbnQgbnVtYmVyT2ZQYXJhbWV0ZXJzVHdvID0gbWV0aG9kVHdvLmdldFBhcmFtZXRlcnMoKS5zaXplKCk7Ci0KLSAgICAgICAgaWYgKG51bWJlck9mUGFyYW1ldGVyc09uZSA9PSBudW1iZXJPZlBhcmFtZXRlcnNUd28pIHsKLSAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnNPbmUgPSAoTGlzdDxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4pIG1ldGhvZE9uZS5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzVHdvID0gKExpc3Q8UGFyYW1ldGVyRGVjbGFyYXRpb24+KSBtZXRob2RUd28uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzT25lLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJzT25lLmdldChpKS5nZXRUeXBlKCkuZXF1YWxzKHBhcmFtZXRlcnNUd28uZ2V0KGkpLmdldFR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGFuZCB7QGxpbmsgSUZpZWxkfS4KLSAgICAgKiBAcGFyYW0gZmllbGREZWNsYXJhdGlvbiB0aGUgZmllbGQgZGVjbGFyYXRpb24uCi0gICAgICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWVsZCBuYW1lcyBtYXRjaC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZUZpZWxkTmFtZXMoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBJRmllbGQgZmllbGQpIHsKLSAgICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ+IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0gICAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA6IGZyYWdtZW50cykgewotICAgICAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhmaWVsZC5nZXRFbGVtZW50TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbXBhcmVBbm5vdGF0aW9uTmFtZXMoQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uLCBBbm5vdGF0aW9uIGV4aXN0aW5nQW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGV4aXN0aW5nQW5ub3RhdGlvbikuZXF1YWxzKAotICAgICAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShuZXdBbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB7QGxpbmsgQW5ub3RhdGlvbn0gaXMgcHJlc2VudCBvbiB0aGUge0BsaW5rIElKYXZhRWxlbWVudH0uCi0gICAgICogQHBhcmFtIGphdmFFbGVtZW50IG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gaXMgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJlc2VudChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoamF2YUVsZW1lbnQsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBhbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgaXMgcHJlc2VudCBvbiB0aGUge0BsaW5rIElKYXZhRWxlbWVudH0uCi0gICAgICogQHBhcmFtIGphdmFFbGVtZW50IG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZSB0aGUgYW5ub3RhdGlvbiBuYW1lLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gaXMgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJlc2VudChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIGlzQW5ub3RhdGlvblByZXNlbnQoKChJQ29tcGlsYXRpb25Vbml0KWphdmFFbGVtZW50KS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbk5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGVsZW1lbnRUeXBlID0gamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsKLQotICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04KLSAgICAgICAgICAgICAgICB8fCBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuVFlQRQotICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5NRVRIT0QKLSAgICAgICAgICAgICAgICB8fCBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUKLSAgICAgICAgICAgICAgICB8fCBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsKLQotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IGdldEFubm90YXRpb25zKGphdmFFbGVtZW50KTsKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHtAbGluayBBbm5vdGF0aW9ufSB0aGF0IGFyZSBwcmVzZW50IG9uIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFFbGVtZW50fQotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbm5vdGF0aW9ucy4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8QW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gQW5ub3RhdGlvblV0aWxzLmdldENvbXBpbGF0aW9uVW5pdEZyb21KYXZhRWxlbWVudChqYXZhRWxlbWVudCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04pIHsKLSAgICAgICAgICAgIFBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24gPSBjb21waWxhdGlvblVuaXQuZ2V0UGFja2FnZSgpOwotICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VEZWNsYXJhdGlvbi5hbm5vdGF0aW9ucygpOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGUpOwotICAgICAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RBbm5vdGF0aW9ucyh0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRNZXRob2REZWNsYXJhdGlvbihtZXRob2QpOwotICAgICAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdEFubm90YXRpb25zKG1ldGhvZERlY2xhcmF0aW9uLm1vZGlmaWVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZCkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RmllbGREZWNsYXJhdGlvbihmaWVsZCk7Ci0gICAgICAgICAgICBpZiAoZmllbGREZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RBbm5vdGF0aW9ucyhmaWVsZERlY2xhcmF0aW9uLm1vZGlmaWVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRSkgewotICAgICAgICAgICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uID0gZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbigoSUxvY2FsVmFyaWFibGUpIGphdmFFbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdEFubm90YXRpb25zKHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24ubW9kaWZpZXJzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QW5ub3RhdGlvbj4gZXh0cmFjdEFubm90YXRpb25zKExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IGV4dGVuZGVkTW9kaWZpZXJzKSB7Ci0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb24+KCk7Ci0gICAgICAgIGZvciAoSUV4dGVuZGVkTW9kaWZpZXIgZXh0ZW5kZWRNb2RpZmllciA6IGV4dGVuZGVkTW9kaWZpZXJzKSB7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5kZWRNb2RpZmllci5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25zLmFkZCgoQW5ub3RhdGlvbikgZXh0ZW5kZWRNb2RpZmllcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUge0BsaW5rIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb259IGZvciB0aGUgZ2l2ZW4ge0BsaW5rIElNZXRob2R9LgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZC4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBzaW5nbGUgdmFyaWFibGUgZGVjbGFyYXRpb25zLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBnZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9ucyhmaW5hbCBJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLSAgICAgICAgZmluYWwgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPigpOwotICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChjb21wYXJlTWV0aG9kcyhtZXRob2REZWNsYXJhdGlvbiwgbWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZEFsbChtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSUxvY2FsVmFyaWFibGV9IGF0IHRoZSBnaXZlbiBvZmZzZXQgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSBmaWxlLgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZCBpbiB3aGljaCB0aGUgbG9jYWwgdmFyaWFibGUgaXMgZGVjbGFyZWQuCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBsb2NhbCB2YXJpYWJsZSBpbiB0aGUgc291cmNlIGZpbGUuCi0gICAgICogVGhlIG9mZnNldCBtdXN0IGJlID49IHRvIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbm9kZSByZXByZXNlbnRpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGFuZAotICAgICAqIDw9IHRoZSBub2RlcyBzdGFydCBwb3NpdGlvbiBwbHVzIGxlbmd0aC4KLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCB2YXJpYWJsZSBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElMb2NhbFZhcmlhYmxlIGdldExvY2FsVmFyaWFibGUoSU1ldGhvZCBtZXRob2QsIGludCBvZmZzZXQpIHsKLSAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMobWV0aG9kKTsKLSAgICAgICAgZm9yIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIGludCBwYXJhbWV0ZXJTdGFydFBvc2l0aW9uID0gcGFyYW1ldGVyLmdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICAgICAgICAgIGludCBwYXJhbWV0ZXJMZW5ndGggPSBwYXJhbWV0ZXIuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID49IHBhcmFtZXRlclN0YXJ0UG9zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgJiYgb2Zmc2V0IDw9IHBhcmFtZXRlclN0YXJ0UG9zaXRpb24gKyBwYXJhbWV0ZXJMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBJTG9jYWxWYXJpYWJsZX0gd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aXRoaW4gdGhlIGRlY2xhcmVkIHtAbGluayBJTWV0aG9kfS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QgaW4gd2hpY2ggdGhlIGxvY2FsIHZhcmlhYmxlIGlzIGRlY2xhcmVkLgotICAgICAqIEBwYXJhbSBwYXJhbU5hbWUgdGhlIGxvY2FsIHZhcmlhYmxlIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgbG9jYWwgdmFyaWFibGUgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJTG9jYWxWYXJpYWJsZSBnZXRMb2NhbFZhcmlhYmxlKElNZXRob2QgbWV0aG9kLCBTdHJpbmcgcGFyYW1OYW1lKSB7Ci0gICAgICAgIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IGdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zKG1ldGhvZCk7Ci0gICAgICAgIGZvciAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAocGFyYW1ldGVyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKHBhcmFtTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEFTVCB7QGxpbmsgQW5ub3RhdGlvbn0gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4ge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259IGNsYXNzCi0gICAgICogb24gdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259IGNsYXNzLgotICAgICAqIEByZXR1cm4gdGhlIEFTVCBhbm5vdGF0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb24pIHsKLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IGdldEFubm90YXRpb25zKGphdmFFbGVtZW50KTsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFzdEFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gYXN0QW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgaWYgKHR5cGVOYW1lLmVxdWFscyhhbm5vdGF0aW9uLmdldENhbm9uaWNhbE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgdHlwZU5hbWUuZXF1YWxzKGFubm90YXRpb24uZ2V0U2ltcGxlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhc3RBbm5vdGF0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBbm5vdGF0aW9uTWlycm9yfSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0gY2xhc3MKLSAgICAgKiBvbiB0aGUge0BsaW5rIERlY2xhcmF0aW9ufS4KLSAgICAgKiBAcGFyYW0gZGVjbGFyYXRpb24gdGhlIGRlY2xhcmF0aW9uCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIG1pcnJvciBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb25NaXJyb3IgZ2V0QW5ub3RhdGlvbihEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIENvbGxlY3Rpb248QW5ub3RhdGlvbk1pcnJvcj4gYWFubm90YXRpb25NaXJyb3JzID0gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLQotICAgICAgICBmb3IgKEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciA6IGFhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uID0gYW5ub3RhdGlvbk1pcnJvcgotICAgICAgICAgICAgLmdldEFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGFubm90YXRpb24uZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uTWlycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEpEVCB7QGxpbmsgSUFubm90YXRpb259IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcwotICAgICAqIG9uIHRoZSB7QGxpbmsgSUFubm90YXRhYmxlfSBlbGVtZW50LgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0gY2xhc3MuCi0gICAgICogQHBhcmFtIGFubm90YXRhYmxlIGEgcGFja2FnZSBkZWNsYXJhdGlvbiwgYSB0eXBlLCBhIG1ldGhvZCwgYSBmaWVsZCBvciBhIGxvY2FsIHZhcmlhYmxlIGluIGEgY29tcGlsYXRpb24gdW5pdC4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBhbm5vdGF0YWJsZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbiwKLSAgICAgICAgICAgIElBbm5vdGF0YWJsZSBhbm5vdGF0YWJsZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIElBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBhbm5vdGF0YWJsZS5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICBmb3IgKElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nIGFubm90YXRpb25OYW1lID0gamR0QW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhhbm5vdGF0aW9uLmdldENhbm9uaWNhbE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGFubm90YXRpb24uZ2V0U2ltcGxlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBqZHRBbm5vdGF0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBbm5vdGF0aW9uVmFsdWV9IHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIHRoYXQgaXMgZGVjbGFyZWQgd2l0aGluIHRoZSB7QGxpbmsgQW5ub3RhdGlvbk1pcnJvcn0uCi0gICAgICogQHBhcmFtIG1pcnJvciB0aGUgYW5ub3RhdGlvbiBtaXJyb3IuCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gdmFsdWUgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uVmFsdWUgZ2V0QW5ub3RhdGlvblZhbHVlKEFubm90YXRpb25NaXJyb3IgbWlycm9yLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBNYXA8QW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24sIEFubm90YXRpb25WYWx1ZT4gdmFsdWVzID0gbWlycm9yLmdldEVsZW1lbnRWYWx1ZXMoKTsKLSAgICAgICAgU2V0PE1hcC5FbnRyeTxBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbiwgQW5ub3RhdGlvblZhbHVlPj4gZW50cnlTZXQgPSB2YWx1ZXMuZW50cnlTZXQoKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8QW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24sIEFubm90YXRpb25WYWx1ZT4gZW50cnkgOiBlbnRyeVNldCkgewotICAgICAgICAgICAgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyhtZW1iZXJOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBOb3JtYWxBbm5vdGF0aW9ufSBtZW1iZXIgdmFsdWUgcGFpciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcGFyYW0gbm9ybWFsQW5ub3RhdGlvbiB0aGUgbm9ybWFsIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGV4cHJlc3Npb24gb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBFeHByZXNzaW9uIGdldEFubm90YXRpb25WYWx1ZShOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbm9ybWFsQW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZW1iZXJOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKRFQge0BsaW5rIElBbm5vdGF0aW9ufSBtZW1iZXIgdmFsdWUgcGFpciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG5hbWUuCi0gICAgICogQHJldHVybiBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBtZW1iZXIgdmFsdWUgcGFpcnMgdmFsdWUuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QW5ub3RhdGlvblZhbHVlKElBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgSU1lbWJlclZhbHVlUGFpcltdIG1lbWJlclZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uLmdldE1lbWJlclZhbHVlUGFpcnMoKTsKLSAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpcnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgZm9yIChJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldE1lbWJlck5hbWUoKS5lcXVhbHMobWVtYmVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSB7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbn0uCi0gICAgICogQHBhcmFtIG5vcm1hbEFubm90YXRpb24gdGhlIG5vcm1hbCBhbm5vdGF0aW9uLgotICAgICAqIEBwYXJhbSBtZW1iZXJOYW1lIHRoZSBtZW1iZXIgbmFtZSBvZiB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8gcmV0dXJuLgotICAgICAqIEByZXR1cm4gYSBtZW1iZXIgdmFsdWUgcGFpciBvciBudWxsIGlmIG5vIG1lbWJlciB2YWx1ZSBwYWlyIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBnZXRNZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVzUGFpcnMgPSBub3JtYWxBbm5vdGF0aW9uLnZhbHVlcygpOwotICAgICAgICBmb3IgKE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgOiBtZW1iZXJWYWx1ZXNQYWlycykgewotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZW1iZXJOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIHtAbGluayBBbm5vdGF0aW9uTWlycm9yfSBhcyBhIHtAbGluayBTdHJpbmd9IHZhbHVlLgotICAgICAqIEBwYXJhbSBtaXJyb3IgdGhlIGFubm90YXRpb24gbWlycm9yLgotICAgICAqIEBwYXJhbSBtZW1iZXJOYW1lIHRoZSBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZW1iZXIgdmFsdWUgYXMgYSBTdHJpbmcgb3IgbnVsbCBpZiBubyBtZW1iZXIgd2l0aCB0aGUgbWVtYmVyIG5hbWUgY2FuIGJlIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKEFubm90YXRpb25NaXJyb3IgbWlycm9yLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBBbm5vdGF0aW9uVmFsdWUgYW5ub3RhdGlvblZhbHVlID0gZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgbWVtYmVyTmFtZSk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25WYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIHtAbGluayBBbm5vdGF0aW9ufSBhcyBhIHtAbGluayBTdHJpbmd9IHZhbHVlLgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBBU1QgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgbWVtYmVyIHZhbHVlIGFzIGEgU3RyaW5nIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZShBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZ2V0QW5ub3RhdGlvblZhbHVlKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBtZW1iZXJOYW1lKTsKLSAgICAgICAgICAgIGlmIChleHByZXNzaW9uICE9IG51bGwgJiYgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTdHJpbmdMaXRlcmFsKSBleHByZXNzaW9uKS5nZXRMaXRlcmFsVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZW1iZXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUge0BsaW5rIElBbm5vdGF0aW9ufSBhcyBhIHtAbGluayBTdHJpbmd9IHZhbHVlLgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBKRFQgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgbWVtYmVyIHZhbHVlIGFzIGEgU3RyaW5nIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiAgaWYgdGhlIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcKLSAgICAgKiBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZShJQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbWVtYmVyTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbiwgbWVtYmVyTmFtZSk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZW1iZXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUge0BsaW5rIEFubm90YXRpb25NaXJyb3J9IGFzIGEge0BsaW5rIEJvb2xlYW59IHZhbHVlLgotICAgICAqIEBwYXJhbSBtaXJyb3IgdGhlIGFubm90YXRpb24gbWlycm9yLgotICAgICAqIEBwYXJhbSBtZW1iZXJOYW1lIHRoZSBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZW1iZXIgdmFsdWUgYXMgYSBCb29sZWFuIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKEFubm90YXRpb25NaXJyb3IgbWlycm9yLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmdWYWx1ZShtaXJyb3IsIG1lbWJlck5hbWUpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIHtAbGluayBBbm5vdGF0aW9ufSBhcyBhIHtAbGluayBCb29sZWFufSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgQVNUIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIG1lbWJlciB2YWx1ZSBhcyBhIEJvb2xlYW4gb3IgbnVsbCBpZiBubyBtZW1iZXIgd2l0aCB0aGUgbWVtYmVyIG5hbWUgY2FuIGJlIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pIHsKLSAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGdldEFubm90YXRpb25WYWx1ZSgoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgbWVtYmVyTmFtZSk7Ci0gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsICYmIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBCb29sZWFuTGl0ZXJhbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKChCb29sZWFuTGl0ZXJhbCkgZXhwcmVzc2lvbikuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlICBtZW1iZXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUge0BsaW5rIElBbm5vdGF0aW9ufSBhcyBhIHtAbGluayBCb29sZWFufSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgSkRUIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIG1lbWJlciB2YWx1ZSBhcyBhIEJvb2xlYW4gb3IgbnVsbCBpZiBubyBtZW1iZXIgd2l0aCB0aGUgbWVtYmVyIG5hbWUgY2FuIGJlIGZvdW5kLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uICBpZiB0aGUgYW5ub3RhdGlvbiBkb2VzIG5vdCBleGlzdCBvciBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZwotICAgICAqIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoSUFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG1lbWJlck5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgbWVtYmVyTmFtZSk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZW1iZXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUge0BsaW5rIEFubm90YXRpb259IGFzIGEge0BsaW5rIFN0cmluZ30gdmFsdWUuCi0gICAgICogVGhlIHJldHVybmVkIFN0cmluZyB2YWx1ZSBpcyB0aGUgbmFtZSBvZiB0aGUgZW51bSBjb25zdGFudC4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgQVNUIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIG1lbWJlciB2YWx1ZSBhcyBhIFN0cmluZyBvciBudWxsIGlmIG5vIG1lbWJlciB3aXRoIHRoZSBtZW1iZXIgbmFtZSBjYW4gYmUgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW51bVZhbHVlKEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBnZXRBbm5vdGF0aW9uVmFsdWUoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIG1lbWJlck5hbWUpOwotICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCAmJiBleHByZXNzaW9uIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFF1YWxpZmllZE5hbWUpIGV4cHJlc3Npb24pLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIHtAbGluayBJQW5ub3RhdGlvbn0gYXMgYSB7QGxpbmsgU3RyaW5nfSB2YWx1ZS4KLSAgICAgKiBUaGUgcmV0dXJuZWQgU3RyaW5nIHZhbHVlIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnVtIGNvbnN0YW50LgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBKRFQgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgbWVtYmVyIHZhbHVlIGFzIGEgU3RyaW5nIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiAgaWYgdGhlIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcKLSAgICAgKiBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbnVtVmFsdWUoSUFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG1lbWJlck5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgbWVtYmVyTmFtZSk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmluZGV4T2YoIi4iKSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fubm90YXRpb25zQ29yZVByb2Nlc3NvckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9Bbm5vdGF0aW9uc0NvcmVQcm9jZXNzb3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NjM2NjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fubm90YXRpb25zQ29yZVByb2Nlc3NvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yczsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNDb3JlUHJvY2Vzc29yRmFjdG9yeSBpbXBsZW1lbnRzIEFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uUHJvY2Vzc29yIGdldFByb2Nlc3NvckZvcihTZXQ8QW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbj4gYW5ub3RhdGlvblNldCwKLSAgICAgICAgICAgIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBwcm9jZXNzb3JFbnZpcm9ubWVudCkgewotCi0gICAgCWlmIChhbm5vdGF0aW9uU2V0LnNpemUoKSA9PSAwKSB7Ci0gICAgCQlyZXR1cm4gQW5ub3RhdGlvblByb2Nlc3NvcnMuTk9fT1A7Ci0gICAgCX0KLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uUHJvY2Vzc29yPiBhbm5vdGF0aW9uUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvblByb2Nlc3Nvcj4oKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+IGFubm90YXRpb25Qcm9jZXNzb3JDYWNoZSA9Ci0gICAgICAgICAgICBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvblByb2Nlc3NvcnNDYWNoZSgpOwotCi0gICAgICAgIGZvciAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIDogYW5ub3RhdGlvblNldCkgewotICAgICAgICAgICAgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IHByb2Nlc3NvckVsZW1lbnRzID0gYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlLmdldCgKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpOwotCi0gICAgICAgICAgICBmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA6IHByb2Nlc3NvckVsZW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBnZXRBbm5vdGF0aW9uUHJvY2Vzc29yKGNvbmZpZ3VyYXRpb25FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckVudmlyb25tZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc29ycy5hZGQocHJvY2Vzc29yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uUHJvY2Vzc29ycy5nZXRDb21wb3NpdGVBbm5vdGF0aW9uUHJvY2Vzc29yKGFubm90YXRpb25Qcm9jZXNzb3JzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFubm90YXRpb25Qcm9jZXNzb3IgZ2V0QW5ub3RhdGlvblByb2Nlc3NvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQsCi0gICAgICAgICAgICBBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgcHJvY2Vzc29yRW52aXJvbm1lbnQpIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgYW5ub3RhdGlvblByb2Nlc3NvciA9Ci0gICAgICAgICAgICAgICAgICAoQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yKWNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICAgICAgICAgIGFubm90YXRpb25Qcm9jZXNzb3Iuc2V0QW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KHByb2Nlc3NvckVudmlyb25tZW50KTsKLSAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25Qcm9jZXNzb3I7Ci0gICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IHN1cHBvcnRlZEFubm90YXRpb25UeXBlcygpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uUHJvY2Vzc29yc0NhY2hlKCkua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBzdXBwb3J0ZWRPcHRpb25zKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyMWQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTliNjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5NGY4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgTm92IDA3IDIzOjU4OjUyIEVTVCAyMDA4Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMTcwZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLkNYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtidW5kbGUtdmVyc2lvbj0iMC40LjMiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBqYXZheC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS42LjIsMS43LjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIgotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQ3JlYXRlZC1CeTogMS41LjBfMTQtYjAzIChTdW4gTWljcm9zeXN0ZW1zIEluYy4pCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTY5YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5TZXB0ZW1iZXIgMTIsIDIwMDg8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2J1amF2YS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9idWphdmEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2NjRhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2J1amF2YS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgU2hhbmUgQ2xhcmtlIC0gQXBhY2hlIENYRiBzdXBwb3J0Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hLS0gU2NlbmFyaW9UeXBlIFJFUVVJUkVELiBEaWZmZXJlbnRpYXRlcyBmcm9tICJjbGllbnQiIHNjZW5hcmlvLgotU2NlbmFyaW9UeXBlPXNlcnZpY2UKLQotIS0tIEluaXRpYWxTZWxlY3Rpb24gUkVRVUlSRUQuICBXb3Jrc3BhY2UgcmVsYXRpdmUgVVJJIHRvIHRoZSBpbnB1dCBXU0RMIG9yIEphdmEKLUluaXRpYWxTZWxlY3Rpb249L2R5bmFtaWNXZWJQcm9qZWN0TmFtZS9zcmMvcGFja2FnZW5hbWUvbXlTZXJ2aWNlLmphdmEKLQotIS0tVXRpbGl0eSBwcm9wZXJ0eSB2YWx1ZXMgLSB1c2UgdGhlc2UgdG8gbGlzdCB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKLSEtLSBTZXJ2aWNlLlJ1bnRpbWVJZCwgU2VydmljZS5TZXJ2ZXJJZCAKLUxpc3RSdW50aW1lcz10cnVlCi1MaXN0U2VydmVycz10cnVlCi0hLS0gVmVyYm9zZSB3aWxsIGxpc3QgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyBhcyB3ZWxsIGFzIGVycm9ycyBpZiBzZXQgdG8gdHJ1ZQotVmVyYm9zZT10cnVlCi0KLSEtLSAgU2VydmljZS5SdW50aW1lSWQgLSBJRCBvZiB3ZWIgc2VydmljZSBydW50aW1lIAotU2VydmljZS5SdW50aW1lSWQ9b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jeGZXZWJTZXJ2aWNlUlQKLSEtLSBTZXJ2aWNlLlNlcnZlcklkIC0gIElEIG9mIHRhcmdldCBzZXJ2ZXIgCi1TZXJ2aWNlLlNlcnZlcklkPW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjYwCi0hLS0gU2VydmljZS5UeXBlSWQgLSBKYXZhIEJlYW4gaXMgZGVmYXVsdCBmb3IgYm90aCBUb3AgRG93biBhbmQgQm90dG9tIFVwCi0hLS0gU2VydmljZS5UeXBlSWQ9SmF2YSBCZWFuCi0KLSEtLSBTZXJ2aWNlUHJvamVjdE5hbWUgLSAhLS10eXBlOlN0cmluZyAtIG5hbWUgb2YgU2VydmljZSBwcm9qZWN0IC0gdGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBnaXZlIHRoZSBzZXJ2aWNlIHByb2plY3QgYSBkaWZmZXJlbnQgbmFtZSB0aGFuIHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIGluaXRpYWwgc2VsZWN0aW9uLiAgdHlwZTogU3RyaW5nICAgIAotIS0tU2VydmljZVByb2plY3ROYW1lPXNlcnZpY2VQcm9qZWN0TmFtZQotIS0tIFNlcnZpY2VFYXJQcm9qZWN0TmFtZSAtICEtLXR5cGU6U3RyaW5nIC0gbmFtZSBvZiBTZXJ2aWNlIEVBUiBwcm9qZWN0IC0gdGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBnaXZlIHRoZSBzZXJ2aWNlIEVBUiBwcm9qZWN0IGEgZGlmZmVyZW50IG5hbWUgdGhhbiB0aGUgRUFSIHByb2plY3QgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZpY2UgcHJvamVjdC4gIHR5cGU6IFN0cmluZwotIS0tU2VydmljZUVhclByb2plY3ROYW1lPXNlcnZpY2VFYXJQcm9qZWN0TmFtZQotCi0hLS0gR2VuZXJhdGUgYSBjbGllbnQgbWFpbmxpbmUgdXNpbmcgSkFYLVdTIEFQSXMKLSEtLUdlbkNsaWVudD1mYWxzZQotIS0tIEdlbmVyYXRlIGEgc2VydmVyIG1haW5saW5lIHVzaW5nIEpBWC1XUyBBUElzCi0hLS1HZW5TZXJ2ZXI9ZmFsc2UKLSEtLSBTcGVjaWZ5IHRvIGdlbmVyYXRlIHRoZSB3cmFwcGVyIGFuZCBmYXVsdCBiZWFucwotIS0tR2VuV3JhcHBlckZhdWx0QmVhbnM9dHJ1ZQotIS0tIFNwZWNpZnkgdG8gZ2VuZXJhdGUgdGhlIFdTREwgZmlsZQotIS0tR2VuV1NETD10cnVlCi0hLS0gT3V0cHV0IHNjaGVtYXMgdG8gc2VwYXJhdGUgZmlsZXMgYW5kIHVzZSBpbXBvcnRzIHRvIGxvYWQgdGhlbSBpbnN0ZWFkIG9mIGlubGluaW5nIHRoZW0gaW50byB0aGUgd3NkbAotIS0tR2VuWFNESW1wb3J0cz10cnVlCi0hLS1TcGVjaWZpZXMgdGhhdCB0aGUgZ2VuZXJhdGVkIFdTREwgaXMgdG8gaW5jbHVkZSBhIFNPQVAgMS4yIGJpbmRpbmcKLSEtLVVzZVNPQVAxMkJpbmRpbmc9ZmFsc2UKLSEtLVNldCB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIFdTREwgZmlsZQotIS0tV3NkbEZpbGVOYW1lPW15V1NETEZpbGVOYW1lLndzZGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfYnVqYXZhLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfYnVqYXZhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1ZjhiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2J1amF2YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0KLTxlY2hvIG1lc3NhZ2U9InB1bGxpbmcgaW4gcHJvcGVydHkgZmlsZXMiLz4KLTxwcm9wZXJ0eSBmaWxlPSJjeGZfYnVqYXZhLnByb3BlcnRpZXMiLz4KLQkKLTxlY2hvIG1lc3NhZ2U9ImNhbGxpbmcgdGhlIHdlYiBzZXJ2aWNlcyBnZW5lcmF0aW9uIGFudCB0YXNrOiBjeGZfYnVqYXZhIi8+Ci0gPHRhcmdldCBuYW1lPSJtYWluIiA+Ci0gIAkgPHdzZ2VuLz4KLSAgPC90YXJnZXQ+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9jbGllbnQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfY2xpZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjkyY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9jbGllbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIFNoYW5lIENsYXJrZSAtIEFwYWNoZSBDWEYgc3VwcG9ydAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIS0tU2NlbmFyaW9UeXBlIFJFUVVJUkVELiBEaWZmZXJlbnRpYXRlcyBmcm9tICJzZXJ2aWNlIiBzY2VuYXJpby4KLVNjZW5hcmlvVHlwZT1jbGllbnQKLQotIS0tSW5pdGlhbFNlbGVjdGlvbiBSRVFVSVJFRC4gIFdvcmtzcGFjZSByZWxhdGl2ZSBVUkkgdG8gdGhlIGlucHV0IFdTREwgb3IgSmF2YS4KLUluaXRpYWxTZWxlY3Rpb249L2R5bmFtaWNXZWJQcm9qZWN0TmFtZS9XZWJDb250ZW50L3dzZGwvbXlTZXJ2aWNlLndzZGwKLQotIS0tVXRpbGl0eSBwcm9wZXJ0eSB2YWx1ZXMgLSB1c2UgdGhlc2UgdG8gbGlzdCB2YWx1ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKLSEtLSBDbGllbnQuUnVudGltZUlkLCBDbGllbnQuU2VydmVySWQgCi1MaXN0UnVudGltZXM9dHJ1ZQotTGlzdFNlcnZlcnM9dHJ1ZQotIS0tIFZlcmJvc2Ugd2lsbCBsaXN0IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgYXMgd2VsbCBhcyBlcnJvcnMgaWYgc2V0IHRvIHRydWUKLVZlcmJvc2U9dHJ1ZQotIAotIS0tQ2xpZW50LlJ1bnRpbWVJZCAtIElEIG9mIHdlYiBzZXJ2aWNlIHJ1bnRpbWUgCi1DbGllbnQuUnVudGltZUlkPW9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3hmV2ViU2VydmljZVJUCi0hLS1DbGllbnQuU2VydmVySWQgLSBJRCBvZiB0YXJnZXQgc2VydmVyIAotQ2xpZW50LlNlcnZlcklkPW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjYwCi0KLSEtLUNsaWVudFByb2plY3ROYW1lIC0gbmFtZSBvZiBDbGllbnQgcHJvamVjdCAtIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gZ2l2ZSB0aGUgY2xpZW50IHByb2plY3QgYSAKLSEtLSBkaWZmZXJlbnQgbmFtZSB0aGFuIHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0hLS1DbGllbnRQcm9qZWN0TmFtZT1jbGllbnRQcm9qZWN0TmFtZQotCi0hLS1DbGllbnRFYXJQcm9qZWN0TmFtZS0gbmFtZSBvZiBDbGllbnQgRUFSIHByb2plY3QgLSBzZXQgb25seSBpZiBhcHBsaWNhYmxlIGZvciBzZWxlY3RlZCBzZXJ2ZXIgdHlwZQotIS0tQ2xpZW50RWFyUHJvamVjdE5hbWU9Y2xpZW50RUFSUHJvamVjdE5hbWUKLQotIS0tQ2xpZW50Q29tcG9uZW50VHlwZSAtIHR5cGUgb2YgQ2xpZW50IHByb2plY3QKLSEtLUNsaWVudENvbXBvbmVudFR5cGU9dGVtcGxhdGUuY3hmLmNvcmUKLQotIS0tIEphdmFPdXRwdXQKLSEtLSBUb3AgZG93biAtIFN0cmluZzogdGhlIHdvcmtzcGFjZSByZWxhdGl2ZSBVUkkgZm9yIGEgSmF2YSBzb3VyY2UgZm9sZGVyIGZvciB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZSAtIG11c3QgYmUgZXhpc3Rpbmcgd29ya3NwYWNlIHNvdXJjZSBmb2xkZXIKLSEtLUphdmFPdXRwdXQ9L3Byb2plY3ROYW1lL0phdmFTb3VyY2UKLQotIS0tR2VuZXJhdGUgQ2xpZW50IDogUkVRVUlSRUQKLUdlbkNsaWVudD10cnVlCi0KLSEtLUdlbmVyYXRlIGEgc2VydmVyIG1haW5saW5lIHVzaW5nIEpBWC1XUyBBUElzCi0hLS1HZW5TZXJ2ZXI9ZmFsc2UKLSEtLUdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9iamVjdAotIS0tR2VuSW1wbD10cnVlCi0hLS1HZW5lcmF0ZSBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgaW1wbGVtZW50YXRpb24gYW5kIGNsaWVudC4gSWdub3JlZCBpZiBpbXBsZW1lbnRhdGlvbiBvciBjbGllbnQgaXMgbm90IGJlaW5nIGdlbmVyYXRlZAotIS0tRGVmYXVsdFZhbHVlcz10cnVlCi0hLS1FbmFibGVzIG9yIGRpc2FibGVzIHByb2Nlc3Npbmcgb2YgZXh0ZW5kZWQgc29hcCBoZWFkZXIgbWVzc2FnZSBiaW5kaW5nCi0hLS1FeHRTT0FQSGVhZGVycz1mYWxzZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBwYWNrYWdlIG5hbWUgbWFwcGluZwotIS0tRGVmYXVsdE5hbWVzcGFjZT10cnVlCi0hLS1FbmFibGVzIG9yIGRpc2FibGVzIGxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmcKLSEtLURlZmF1bHRFeGNsdWRlc05hbWVzcGFjZT10cnVlCi0hLS1FbmFibGUgQXV0byBOYW1lIFJlc29sdXRpb24KLSEtLUF1dG9OYW1lUmVzb2x1dGlvbj1mYWxzZQotCi0hLS1TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBXU0RMIHNlcnZpY2UgZm9yIHdoaWNoIGNvZGUgaXMgdG8gYmUgZ2VuZXJhdGVkLiBUaGUgZGVmYXVsdCBpcyB0byBnZW5lcmF0ZSBjb2RlIGZvciBldmVyeSBzZXJ2aWNlIGluIHRoZSBXU0RMIGRvY3VtZW50Ci0hLS1TZXJ2aWNlTmFtZT1teVNlcnZpY2UKLQotIS0tWEpDIEFyZ3M6IFNwZWNpZnkgdGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIFhKQwotCi0hLS1Jbml0aWFsaXNlIGZpZWxkcyBtYXBwZWQgZnJvbSBlbGVtZW50cyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzCi0hLS14amNfZHY9ZmFsc2UKLSEtLUFjdGl2YXRlIHBsdWdpbiB0byBhZGQgYSB0b1N0cmluZygpIG1ldGhvZCB0byBnZW5lcmF0ZWQgY2xhc3NlcwotIS0teGpjX3RzPWZhbHNlCi0hLS1IYXZlIHRvU3RyaW5nIHByb2R1Y2UgbXVsdGkgbGluZSBvdXRwdXQKLSEtLXhqY190c19tdWx0aT1mYWxzZQotIS0tSGF2ZSB0b1N0cmluZyBwcm9kdWNlIHNpbmdsZSBsaW5lIHRlcnNlIG91dHB1dAotIS0teGpjX3RzX3NpbXBsZT1mYWxzZQotIS0tRW5hYmxlIHNvdXJjZSBsb2NhdGlvbiBzdXBwb3J0IGZvciBnZW5lcmF0ZWQgY29kZQotIS0teGpjX2xvY2F0b3I9ZmFsc2UKLSEtLUdlbmVyYXRlIGFjY2Vzc29yIG1ldGhvZHMgd2l0aCB0aGUgJ3N5bmNocm9uaXplZCcga2V5d29yZAotIS0teGpjX3N5bmNfbWV0aG9kcz1mYWxzZQotIS0tQWRkIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMgdG8gdGhlIGdlbmVyYXRlZCBjb2RlCi0hLS14amNfbWFya19nZW5lcmF0ZWQ9ZmFsc2UKLQotIS0tIE1hcHBpbmdzCi0hLS0gVG9wIGRvd24gc2NlbmFyaW8uIFdvcmtzcGFjZSByZWxhdGl2ZSBVUkkgdG8gcHJvcGVydHkgZmlsZSBjb250YWluaW5nIG1hcHBpbmdzLgotIS0tIE1hcHBpbmdzIGFyZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHBhY2thZ2UgbmFtZXMgb2YgdGhlIGdlbmVyYXRlZCBKYXZhIHRlbXBsYXRlIGNsYXNzZXMuCi0hLS0gVGhlIGNvbnRlbnQgb2YgdGhlIHByb3BlcnRpZXMgZmlsZSBtdXN0IGJlIG9mIHRoZSBmb3JtYXQgbmFtZXNwYWNlPXBhY2thZ2UgIAotIS0tTWFwcGluZ3M9L2R5bmFtaWNXZWJQcm9qZWN0TmFtZS9tYXBwaW5ncy50eHQKLQotIS0tQmluZGluZyBGaWxlcy4gQ29tbWEgZGVsaW1pdGVkIHN0cmluZyBvZiBhYnNvbHV0ZSBwYXRocyBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gb2YgSkFYV1Mgb3IgSkFYQiBiaW5kaW5nIGZpbGVzLgotIS0tQmluZGluZ3M9Qzovd29ya3NwYWNlMS9keW5hbWljV2ViUHJvamVjdE5hbWUvYmluZGluZzEueG1sLEM6L3dvcmtzcGFjZTEvZHluYW1pY1dlYlByb2plY3ROYW1lL2JpbmRpbmcyLnhtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfY2xpZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfY2xpZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzYTU2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2NsaWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0KLTxlY2hvIG1lc3NhZ2U9InB1bGxpbmcgaW4gcHJvcGVydHkgZmlsZXMiLz4KLTxwcm9wZXJ0eSBmaWxlPSJjeGZfY2xpZW50LnByb3BlcnRpZXMiLz4KLQkKLTxlY2hvIG1lc3NhZ2U9ImNhbGxpbmcgdGhlIHdlYiBzZXJ2aWNlcyBnZW5lcmF0aW9uIGFudCB0YXNrOiBjeGZfY2xpZW50Ii8+Ci0gPHRhcmdldCBuYW1lPSJtYWluIiA+Ci0gIAkgPHdzZ2VuLz4KLSAgPC90YXJnZXQ+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl90ZGphdmEucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNmU4ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl90ZGphdmEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIFNoYW5lIENsYXJrZSAtIEFwYWNoZSBDWEYgc3VwcG9ydAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIS0tIFNjZW5hcmlvVHlwZSBSRVFVSVJFRC4gRGlmZmVyZW50aWF0ZXMgZnJvbSAiY2xpZW50IiBzY2VuYXJpby4KLVNjZW5hcmlvVHlwZT1zZXJ2aWNlCi0KLSEtLSBJbml0aWFsU2VsZWN0aW9uIFJFUVVJUkVELiAgV29ya3NwYWNlIHJlbGF0aXZlIFVSSSB0byB0aGUgaW5wdXQgV1NETCBvciBKYXZhCi1Jbml0aWFsU2VsZWN0aW9uPS9keW5hbWljV2ViUHJvamVjdE5hbWUvV2ViQ29udGVudC93c2RsL215U2VydmljZS53c2RsCi0KLSEtLVV0aWxpdHkgcHJvcGVydHkgdmFsdWVzIC0gdXNlIHRoZXNlIHRvIGxpc3QgdmFsaWQgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0hLS0gU2VydmljZS5SdW50aW1lSWQsIFNlcnZpY2UuU2VydmVySWQgCi1MaXN0UnVudGltZXM9dHJ1ZQotTGlzdFNlcnZlcnM9dHJ1ZQotIS0tIFZlcmJvc2Ugd2lsbCBsaXN0IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgYXMgd2VsbCBhcyBlcnJvcnMgaWYgc2V0IHRvIHRydWUKLVZlcmJvc2U9dHJ1ZQotCi0hLS0gIFNlcnZpY2UuUnVudGltZUlkIC0gSUQgb2Ygd2ViIHNlcnZpY2UgcnVudGltZSAKLVNlcnZpY2UuUnVudGltZUlkPW9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3hmV2ViU2VydmljZVJUCi0hLS0gU2VydmljZS5TZXJ2ZXJJZCAtICBJRCBvZiB0YXJnZXQgc2VydmVyIAotU2VydmljZS5TZXJ2ZXJJZD1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC42MAotIS0tIFNlcnZpY2UuVHlwZUlkIC0gSmF2YSBCZWFuIGlzIGRlZmF1bHQgZm9yIGJvdGggVG9wIERvd24gYW5kIEJvdHRvbSBVcAotIS0tIFNlcnZpY2UuVHlwZUlkPUphdmEgQmVhbgotCi0hLS0gU2VydmljZVByb2plY3ROYW1lIC0gIS0tdHlwZTpTdHJpbmcgLSBuYW1lIG9mIFNlcnZpY2UgcHJvamVjdCAtIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gZ2l2ZSB0aGUgc2VydmljZSBwcm9qZWN0IGEgZGlmZmVyZW50IG5hbWUgdGhhbiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBpbml0aWFsIHNlbGVjdGlvbi4gIHR5cGU6IFN0cmluZyAgICAKLSEtLVNlcnZpY2VQcm9qZWN0TmFtZT1zZXJ2aWNlUHJvamVjdE5hbWUKLSEtLSBTZXJ2aWNlRWFyUHJvamVjdE5hbWUgLSAhLS10eXBlOlN0cmluZyAtIG5hbWUgb2YgU2VydmljZSBFQVIgcHJvamVjdCAtIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gZ2l2ZSB0aGUgc2VydmljZSBFQVIgcHJvamVjdCBhIGRpZmZlcmVudCBuYW1lIHRoYW4gdGhlIEVBUiBwcm9qZWN0IGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlIHByb2plY3QuICB0eXBlOiBTdHJpbmcKLSEtLVNlcnZpY2VFYXJQcm9qZWN0TmFtZT1zZXJ2aWNlRWFyUHJvamVjdE5hbWUKLQotIS0tIEphdmFPdXRwdXQKLSEtLSBUb3AgZG93biAtIFN0cmluZzogdGhlIHdvcmtzcGFjZSByZWxhdGl2ZSBVUkkgZm9yIGEgSmF2YSBzb3VyY2UgZm9sZGVyIGZvciB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZSAtIG11c3QgYmUgZXhpc3Rpbmcgd29ya3NwYWNlIHNvdXJjZSBmb2xkZXIKLSEtLUphdmFPdXRwdXQ9L3Byb2plY3ROYW1lL0phdmFTb3VyY2UKLQotIS0tU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgV1NETCBzZXJ2aWNlIGZvciB3aGljaCBjb2RlIGlzIHRvIGJlIGdlbmVyYXRlZC4gVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgZXZlcnkgc2VydmljZSBpbiB0aGUgV1NETCBkb2N1bWVudAotIS0tU2VydmljZU5hbWU9bXlTZXJ2aWNlCi0KLSEtLUdlbmVyYXRlIGEgc2VydmVyIG1haW5saW5lIHVzaW5nIEpBWC1XUyBBUElzCi0hLS1HZW5TZXJ2ZXI9ZmFsc2UKLSEtLUdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9iamVjdAotIS0tR2VuSW1wbD10cnVlCi0hLS1HZW5lcmF0ZSBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgaW1wbGVtZW50YXRpb24gYW5kIGNsaWVudC4gSWdub3JlZCBpZiBpbXBsZW1lbnRhdGlvbiBvciBjbGllbnQgaXMgbm90IGJlaW5nIGdlbmVyYXRlZAotIS0tRGVmYXVsdFZhbHVlcz10cnVlCi0hLS1FbmFibGVzIG9yIGRpc2FibGVzIHByb2Nlc3Npbmcgb2YgZXh0ZW5kZWQgc29hcCBoZWFkZXIgbWVzc2FnZSBiaW5kaW5nCi0hLS1FeHRTT0FQSGVhZGVycz1mYWxzZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBwYWNrYWdlIG5hbWUgbWFwcGluZwotIS0tRGVmYXVsdE5hbWVzcGFjZT10cnVlCi0hLS1FbmFibGVzIG9yIGRpc2FibGVzIGxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmcKLSEtLURlZmF1bHRFeGNsdWRlc05hbWVzcGFjZT10cnVlCi0hLS1FbmFibGUgQXV0byBOYW1lIFJlc29sdXRpb24KLSEtLUF1dG9OYW1lUmVzb2x1dGlvbj1mYWxzZQotCi0hLS1YSkMgQXJnczogU3BlY2lmeSB0aGUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgWEpDCi0KLSEtLUluaXRpYWxpc2UgZmllbGRzIG1hcHBlZCBmcm9tIGVsZW1lbnRzIHdpdGggdGhlaXIgZGVmYXVsdCB2YWx1ZXMKLSEtLXhqY19kdj1mYWxzZQotIS0tQWN0aXZhdGUgcGx1Z2luIHRvIGFkZCBhIHRvU3RyaW5nKCkgbWV0aG9kIHRvIGdlbmVyYXRlZCBjbGFzc2VzCi0hLS14amNfdHM9ZmFsc2UKLSEtLUhhdmUgdG9TdHJpbmcgcHJvZHVjZSBtdWx0aSBsaW5lIG91dHB1dAotIS0teGpjX3RzX211bHRpPWZhbHNlCi0hLS1IYXZlIHRvU3RyaW5nIHByb2R1Y2Ugc2luZ2xlIGxpbmUgdGVyc2Ugb3V0cHV0Ci0hLS14amNfdHNfc2ltcGxlPWZhbHNlCi0hLS1FbmFibGUgc291cmNlIGxvY2F0aW9uIHN1cHBvcnQgZm9yIGdlbmVyYXRlZCBjb2RlCi0hLS14amNfbG9jYXRvcj1mYWxzZQotIS0tR2VuZXJhdGUgYWNjZXNzb3IgbWV0aG9kcyB3aXRoIHRoZSAnc3luY2hyb25pemVkJyBrZXl3b3JkCi0hLS14amNfc3luY19tZXRob2RzPWZhbHNlCi0hLS1BZGQgQEdlbmVyYXRlZCBhbm5vdGF0aW9ucyB0byB0aGUgZ2VuZXJhdGVkIGNvZGUKLSEtLXhqY19tYXJrX2dlbmVyYXRlZD1mYWxzZQotCi0hLS0gTWFwcGluZ3MKLSEtLSBUb3AgZG93biBzY2VuYXJpby4gV29ya3NwYWNlIHJlbGF0aXZlIFVSSSB0byBwcm9wZXJ0eSBmaWxlIGNvbnRhaW5pbmcgbWFwcGluZ3MuCi0hLS0gTWFwcGluZ3MgYXJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcGFja2FnZSBuYW1lcyBvZiB0aGUgZ2VuZXJhdGVkIEphdmEgdGVtcGxhdGUgY2xhc3Nlcy4KLSEtLSBUaGUgY29udGVudCBvZiB0aGUgcHJvcGVydGllcyBmaWxlIG11c3QgYmUgb2YgdGhlIGZvcm1hdCBuYW1lc3BhY2U9cGFja2FnZSAgCi0hLS1NYXBwaW5ncz0vZHluYW1pY1dlYlByb2plY3ROYW1lL21hcHBpbmdzLnR4dAotCi0hLS1CaW5kaW5nIEZpbGVzLiBDb21tYSBkZWxpbWl0ZWQgc3RyaW5nIG9mIGFic29sdXRlIHBhdGhzIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvZiBKQVhXUyBvciBKQVhCIGJpbmRpbmcgZmlsZXMuCi0hLS1CaW5kaW5ncz1DOi93b3Jrc3BhY2UxL2R5bmFtaWNXZWJQcm9qZWN0TmFtZS9iaW5kaW5nMS54bWwsQzovd29ya3NwYWNlMS9keW5hbWljV2ViUHJvamVjdE5hbWUvYmluZGluZzIueG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl90ZGphdmEueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl90ZGphdmEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc5YzZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQotPGVjaG8gbWVzc2FnZT0icHVsbGluZyBpbiBwcm9wZXJ0eSBmaWxlcyIvPgotPHByb3BlcnR5IGZpbGU9ImN4Zl90ZGphdmEucHJvcGVydGllcyIvPgotCQotPGVjaG8gbWVzc2FnZT0iY2FsbGluZyB0aGUgd2ViIHNlcnZpY2VzIGdlbmVyYXRpb24gYW50IHRhc2s6IGN4Zl90ZGphdmEiLz4KLSA8dGFyZ2V0IG5hbWU9Im1haW4iID4KLSAgCSA8d3NnZW4vPgotICA8L3RhcmdldD4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhZDVjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhbnQvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjgxNGFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBDb25zdW1wdGlvbiBDb3JlCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1XRUJfU0VSVklDRV9MT0NBVE9SX0NYRj1BcGFjaGUgQ1hGIFdlYiBTZXJ2aWNlIExvY2F0b3IKLVdFQl9TRVJWSUNFX0xPQ0FUT1JfQ0FURUdPUllfQ1hGPUFwYWNoZSBDWEYgQ29tcG9uZW50cwotCi1MQUJFTF9SVU5USU1FX0NYRj1BcGFjaGUgQ1hGCi1MQUJFTF9CT1RUT01fVVBfSkFWQV9CRUFOPUJvdHRvbSB1cCBKYXZhIGJlYW4gV2ViIFNlcnZpY2UKLUxBQkVMX1RPUF9ET1dOX0pBVkFfQkVBTj1Ub3AgZG93biBKYXZhIGJlYW4gV2ViIFNlcnZpY2UKLUxBQkVMX0NMSUVOVD1DbGllbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTM3NDc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53cy5sb2NhdG9yIj4KLSAgICAgIDx3ZWJTZXJ2aWNlTG9jYXRvckNhdGVnb3J5Ci0gICAgICAgICBpZD0id3MubG9jYXRvci5jYXRlZ29yeS5jeGYiCi0gICAgICAgICBsYWJlbD0iJVdFQl9TRVJWSUNFX0xPQ0FUT1JfQ0FURUdPUllfQ1hGIi8+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlTG9jYXRvcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5sb2NhdG9yLkNYRldlYlNlcnZpY2VMb2NhdG9yIgotICAgICAgICAgaWQ9IndzLmxvY2F0b3IuY3hmIgotICAgICAgICAgY2F0ZWdvcnk9IndzLmxvY2F0b3IuY2F0ZWdvcnkuY3hmIgotICAgICAgICAgbGFiZWw9IiVXRUJfU0VSVklDRV9MT0NBVE9SX0NYRiI+Ci0gICAgICA8L3dlYlNlcnZpY2VMb2NhdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS5hbnRmaWxlcyI+Ci0gICAgICA8YW50ZmlsZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmN4ZldlYlNlcnZpY2VSVEJVSmF2YSIKLSAgICAJIHJ1bnRpbWVpZD0iY3hmIgotICAgIAkgcGx1Z2lubG9jYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSIKLSAgICAJIHBhdGg9ImFudC9jeGZfYnVqYXZhLnByb3BlcnRpZXMiCi0gICAgCSB3c2dlbnBhdGg9ImFudC9jeGZfYnVqYXZhLnhtbCIKLSAgICAJIHJ1bnRpbWVsYWJlbD0iJUxBQkVMX1JVTlRJTUVfQ1hGIgotICAgIAkgc2NlbmFyaW9sYWJlbD0iJUxBQkVMX0JPVFRPTV9VUF9KQVZBX0JFQU4iPgotICAJICA8L2FudGZpbGVzPgotICAgICAgPGFudGZpbGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jeGZXZWJTZXJ2aWNlUlRUb3BKYXZhIgotICAgICAgICAgcnVudGltZWlkPSJjeGYiCi0gICAgICAgICBwbHVnaW5sb2NhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIgotICAgICAgICAgcGF0aD0iYW50L2N4Zl90ZGphdmEucHJvcGVydGllcyIKLSAgICAgICAgIHdzZ2VucGF0aD0iYW50L2N4Zl90ZGphdmEueG1sIgotICAgICAgICAgcnVudGltZWxhYmVsPSIlTEFCRUxfUlVOVElNRV9DWEYiCi0gICAgICAgICBzY2VuYXJpb2xhYmVsPSIlTEFCRUxfVE9QX0RPV05fSkFWQV9CRUFOIj4KLSAgCSAgPC9hbnRmaWxlcz4KLSAgCSAgPGFudGZpbGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jeGZXZWJTZXJ2aWNlUlRaQ2xpZW50IgotICAgICAgICAgcnVudGltZWlkPSJjeGYiCi0gICAgICAgICBwbHVnaW5sb2NhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIgotICAgICAgICAgcGF0aD0iYW50L2N4Zl9jbGllbnQucHJvcGVydGllcyIKLSAgICAgICAgIHdzZ2VucGF0aD0iYW50L2N4Zl9jbGllbnQueG1sIgotICAgICAgICAgcnVudGltZWxhYmVsPSIlTEFCRUxfUlVOVElNRV9DWEYiCi0gICAgICAgICBzY2VuYXJpb2xhYmVsPSIlTEFCRUxfQ0xJRU5UIj4KLSAgICAgIDwvYW50ZmlsZXM+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ViMDAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKENYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLkJVTkRMRV9OQU1FLCBDWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTgwYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MjBmZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLSAgICAvLyBUaGUgcGx1Zy1pbiBJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luIHBsdWdpbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luKCkgewotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgIG1lc3NhZ2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgIGV4Y2VwdGlvbi50b1N0cmluZygpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNsaWVudENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhQ2xpZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTI1ZmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhQ2xpZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLkNYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXMuSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNvbW1hbmRMaW5lVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuTGF1bmNoVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiBFeGVjdXRlcyB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jeGYudG9vbHMud3NkbHRvLldTRExUb0phdmE8L2NvZGU+IGNvbW1hbmQgd2l0aCB0aGUgYXJndW1lbnRzCi0gKiBuZWNlc3NhcnkgdG8gZ2VuZXJhdGUgYSBjbGllbnQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ2xpZW50Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDWEZfVE9PTF9DTEFTU19OQU1FID0gIm9yZy5hcGFjaGUuY3hmLnRvb2xzLndzZGx0by5XU0RMVG9KYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWw7Ci0KLSAgICBwcml2YXRlIEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIDxjb2RlPldTREwySmF2YUNsaWVudENvbW1hbmQ8L2NvZGU+IG9iamVjdC4KLSAgICAgKiBAcGFyYW0gbW9kZWwgdGhlIDxjb2RlPldTREwySmF2YURhdGFNb2RlbDwvY29kZT4gdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uCi0gICAgICogYmV0d2VlbiBjb21tYW5kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETDJKYXZhQ2xpZW50Q29tbWFuZChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKG5ldyBQYXRoKG1vZGVsLmdldEphdmFTb3VyY2VGb2xkZXIoKSkpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0KLSAgICAgICAgU3RyaW5nW10gcHJvZ0FyZ3MgPSBDb21tYW5kTGluZVV0aWxzLmdldFdTREwySmF2YUdlbmVyYXRlQ2xpZW50QXJndW1lbnRzKG1vZGVsKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0UHJvamVjdE5hbWUoKTsKLQotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgTGF1bmNoVXRpbHMubGF1bmNoKGphdmFQcm9qZWN0LCBXU0RMMkphdmFDbGllbnRDb21tYW5kLkNYRl9UT09MX0NMQVNTX05BTUUsIHByb2dBcmdzKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5VzJKRmlsZXNGcm9tVG1wKHRoaXMubW9kZWwpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBMaXN0PElSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigpOwotICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotICAgICAgICBpZiAoY2hhbmdlZFJlc291cmNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5kZWxldGUodHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIC8vQU5UIEVudmlyb25tZW50IE1hcHBpbmdzCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YVNvdXJjZUZvbGRlcihTdHJpbmcgamF2YVNvdXJjZUZvbGRlcikgewotICAgICAgICBtb2RlbC5zZXRKYXZhU291cmNlRm9sZGVyKGphdmFTb3VyY2VGb2xkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSkgewotICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVTZXJ2ZXIoYm9vbGVhbiBnZW5lcmF0ZVNlcnZlcikgewotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVNlcnZlcihnZW5lcmF0ZVNlcnZlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVDbGllbnQoYm9vbGVhbiBnZW5lcmF0ZUNsaWVudCkgewotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZUNsaWVudChnZW5lcmF0ZUNsaWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihib29sZWFuIGdlbmVyYXRlSW1wbGVtZW50YXRpb24pIHsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihnZW5lcmF0ZUltcGxlbWVudGF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VEZWZhdWx0VmFsdWVzKGJvb2xlYW4gdXNlRGVmYXVsdFZhbHVlcykgewotICAgICAgICBtb2RlbC5zZXRVc2VEZWZhdWx0VmFsdWVzKHVzZURlZmF1bHRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NTT0FQSGVhZGVycyhib29sZWFuIHByb2Nlc3NTT0FQSGVhZGVycykgewotICAgICAgICBtb2RlbC5zZXRQcm9jZXNzU09BUEhlYWRlcnMocHJvY2Vzc1NPQVBIZWFkZXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhib29sZWFuIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKSB7Ci0gICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhib29sZWFuIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKSB7Ci0gICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvTmFtZVJlc29sdXRpb24oYm9vbGVhbiBhdXRvTmFtZVJlc29sdXRpb24pIHsKLSAgICAgICAgbW9kZWwuc2V0QXV0b05hbWVSZXNvbHV0aW9uKGF1dG9OYW1lUmVzb2x1dGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIHhqY1VzZURlZmF1bHRWYWx1ZXMpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyh4amNVc2VEZWZhdWx0VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZyhib29sZWFuIHhqY1RvU3RyaW5nKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nU2ltcGxlKHhqY1RvU3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZ1NpbXBsZShib29sZWFuIHhqY1RvU3RyaW5nU2ltcGxlKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nU2ltcGxlKHhqY1RvU3RyaW5nU2ltcGxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZ011bHRpTGluZShib29sZWFuIHhqY1RvU3RyaW5nTXVsdGlMaW5lKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKHhqY1RvU3RyaW5nTXVsdGlMaW5lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNMb2NhdG9yKGJvb2xlYW4geGpjTG9jYXRvcikgewotICAgICAgICBtb2RlbC5zZXRYamNMb2NhdG9yKHhqY0xvY2F0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1N5bmNNZXRob2RzKGJvb2xlYW4geGpjU3luY01ldGhvZHMpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjU3luY01ldGhvZHMoeGpjU3luY01ldGhvZHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY01hcmtHZW5lcmF0ZWQoYm9vbGVhbiB4amNNYXJrR2VuZXJhdGVkKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY01hcmtHZW5lcmF0ZWQoeGpjTWFya0dlbmVyYXRlZCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZWROYW1lc3BhY2VzKE1hcCB2YWx1ZSkgewotICAgICAgICBtb2RlbC5zZXRJbmNsdWRlZE5hbWVzcGFjZXModmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdGaWxlcyhMaXN0PFN0cmluZz4gYmluZGluZ0ZpbGVzKSB7Ci0gICAgICAgIGZvciAoU3RyaW5nIHBhdGggOiBiaW5kaW5nRmlsZXMpIHsKLSAgICAgICAgICAgIG1vZGVsLmdldEJpbmRpbmdGaWxlcygpLmFkZChwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYjQ4MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLkNYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5XU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIExvYWRzIHRoZSA8Y29kZT5XU0RMMkphdmFEYXRhTW9kZWw8L2NvZGU+IHdpdGggdGhlIHBlcnNpc3RlZCBkZWZhdWx0cwotICogZnJvbSB0aGUgcHJlZmVyZW5jZXMgYW5kIHdpdGggdGhlIGluaXRpYWwgcnVudGltZSBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZQotICogc3RhcnRpbmcgcG9pbnQgV1NETCBVUkwuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgcHJpdmF0ZSBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaW5wdXRVUkw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQgb2JqZWN0LgotICAgICAqIEBwYXJhbSBtb2RlbCB0aGUgPGNvZGU+V1NETDJKYXZhRGF0YU1vZGVsPC9jb2RlPiB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24KLSAgICAgKiAgICAgICAgICAgICAgYmV0d2VlbiBjb21tYW5kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBpbnB1dFVSTCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLSAgICAgICAgdGhpcy5pbnB1dFVSTCA9IGlucHV0VVJMOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIFdTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0gICAgICAgIG1vZGVsLnNldERlZmF1bHRSdW50aW1lVmVyc2lvbihjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpKTsKLSAgICAgICAgbW9kZWwuc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkpOwotICAgICAgICBtb2RlbC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7Ci0KLSAgICAgICAgbW9kZWwuc2V0SW5jbHVkZWROYW1lc3BhY2VzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLSAgICAgICAgbW9kZWwuc2V0RXhjbHVkZWROYW1lc3BhY2VzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLQotICAgICAgICAvLyBYSkMKLSAgICAgICAgbW9kZWwuc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyhjb250ZXh0LmlzWGpjVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmcoY29udGV4dC5pc1hqY1RvU3RyaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ011bHRpTGluZShjb250ZXh0LmlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nU2ltcGxlKGNvbnRleHQuaXNYamNUb1N0cmluZ1NpbXBsZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjTG9jYXRvcihjb250ZXh0LmlzWGpjTG9jYXRvcigpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjU3luY01ldGhvZHMoY29udGV4dC5pc1hqY1N5bmNNZXRob2RzKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNNYXJrR2VuZXJhdGVkKGNvbnRleHQuaXNYamNNYXJrR2VuZXJhdGVkKCkpOwotCi0gICAgICAgIG1vZGVsLnNldFZhbGlkYXRlKGNvbnRleHQuaXNWYWxpZGF0ZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKGNvbnRleHQuaXNQcm9jZXNzU09BUEhlYWRlcnMoKSk7Ci0gICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGNvbnRleHQuaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoY29udGV4dC5pc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRVc2VEZWZhdWx0VmFsdWVzKGNvbnRleHQuaXNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICBtb2RlbC5zZXROb0FkZHJlc3NCaW5kaW5nKGNvbnRleHQuaXNOb0FkZHJlc3NCaW5kaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRBdXRvTmFtZVJlc29sdXRpb24oY29udGV4dC5pc0F1dG9OYW1lUmVzb2x1dGlvbigpKTsKLQotICAgICAgICBtb2RlbC5zZXRKYXZhU291cmNlRm9sZGVyKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKS50b09TU3RyaW5nKCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IG5ldyBVUkwoaW5wdXRVUkwpOwotICAgICAgICAgICAgbW9kZWwuc2V0V3NkbFVSTCh3c2RsVXJsKTsKLQotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gV1NETFV0aWxzLnJlYWRXU0RMKG1vZGVsLmdldFdzZGxVUkwoKSk7Ci0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gV1NETFV0aWxzLmdldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLnB1dCh0YXJnZXROYW1lc3BhY2UsIHBhY2thZ2VOYW1lKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSBXU0RMVXRpbHMuZ2V0V1NETExvY2F0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIGlmICh3c2RsTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRXc2RsRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgbXVybGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIGlvZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIFdTREwySmF2YURhdGFNb2RlbCBnZXRXU0RMMkphdmFEYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2xvY2F0b3IvQ1hGV2ViU2VydmljZUxvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvbG9jYXRvci9DWEZXZWJTZXJ2aWNlTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTUwZGVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvbG9jYXRvci9DWEZXZWJTZXJ2aWNlTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmxvY2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2ZpbmRlci5BYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRldlYlNlcnZpY2VMb2NhdG9yIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlTG9jYXRvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgTGlzdCBnZXRXZWJTZXJ2aWNlQ2xpZW50cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFdlYlNlcnZpY2VDbGllbnRzKG1vbml0b3IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBMaXN0IGdldFdlYlNlcnZpY2VDbGllbnRzKElQcm9qZWN0W10gcHJvamVjdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0V2ViU2VydmljZUNsaWVudHMocHJvamVjdHMsIG1vbml0b3IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBMaXN0IGdldFdlYlNlcnZpY2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgICAgICByZXR1cm4gZ2V0V2ViU2VydmljZXMocHJvamVjdHMsIG1vbml0b3IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBMaXN0IGdldFdlYlNlcnZpY2VzKElQcm9qZWN0W10gcHJvamVjdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBMaXN0IHdlYlNlcnZpY2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKElQcm9qZWN0IHByb2plY3QgOiBwcm9qZWN0cykgewotICAgICAgICAgICAgaWYgKEoyRUVVdGlscy5pc1dlYkNvbXBvbmVudChwcm9qZWN0KSkgewotICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VzLmFkZEFsbChnZXRXZWJTZXJ2aWNlc0Zyb21Qcm9qZWN0KHByb2plY3QpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViU2VydmljZXM7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBMaXN0IGdldFdlYlNlcnZpY2VzRnJvbVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjFkMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3MjFlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM1OGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgTm92IDA3IDIzOjU4OjUzIEVTVCAyMDA4Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1Zjc4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndzcnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1DcmVhdGVkLUJ5OiAxLjUuMF8xNC1iMDMgKFN1biBNaWNyb3N5c3RlbXMgSW5jLikKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGI4ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Mjc1MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBDb25zdW1wdGlvbiBVSQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotSkFYV1NfV0VCU0VSVklDRVRZUEU9UE9KTyBXZWIgU2VydmljZQotCi1KQVhXU19DTElFTlQ9SkFYLVdTIFN0dWIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTk4MWExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53c0ltcGwiPgotICAgICAgICA8d2ViU2VydmljZUltcGwKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLndzSW1wbC5qYXZhIgotICAgICAgICAgICAgbGFiZWw9IiVKQVhXU19XRUJTRVJWSUNFVFlQRSIKLSAgICAgICAgICAgIHJlc291cmNlVHlwZU1ldGFkYXRhPSJGaWxlIElSZXNvdXJjZSBDb21waWxhdGlvblVuaXQiCi0gICAgICAgICAgICBleHRlbnNpb25NZXRhZGF0YT0iLmphdmEgLmNsYXNzIgotICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkNYRkpBWFdTU2VsZWN0aW9uV2lkZ2V0IgotICAgICAgICAgICAgbWVyZ2VyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uSmF2YU1lcmdlciI+Ci0gICAgICAgIDwvd2ViU2VydmljZUltcGw+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICA8IS0tPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzQ2xpZW50SW1wbCI+Ci0gICAgICA8d2ViU2VydmljZUNsaWVudEltcGwKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNsaWVudC50eXBlLmphdmEiCi0gICAgICAgICAgICBsYWJlbD0iJUpBWFdTX0NMSUVOVCI+Ci0gICAgICA8L3dlYlNlcnZpY2VDbGllbnRJbXBsPgotICAgIDwvZXh0ZW5zaW9uPi0tPgotICAgCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLm9iamVjdFNlbGVjdGlvbldpZGdldCI+Ci0gICAgICAgIDxvYmplY3RTZWxlY3Rpb25XaWRnZXQKLSAgICAgICAgICAgIGNsYXNzPSIgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNYRkpBWFdTU2VsZWN0aW9uTGF1bmNoYWJsZSIKLSAgICAgICAgICAgIGV4dGVybmFsX21vZGlmeT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSIgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5DWEZKQVhXU1NlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkpBWFdTU2VsZWN0aW9uVHJhbnNmb3JtZXIiPgotICAgICAgICA8L29iamVjdFNlbGVjdGlvbldpZGdldD4KLSAgICA8L2V4dGVuc2lvbj4KLSAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgIDx3aWRnZXRGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzLldTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICBpZD0iV1NETDJKYXZhQ2xpZW50Q29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiPgotICAgICAgICA8L3dpZGdldEZhY3Rvcnk+Ci0gICAgPC9leHRlbnNpb24+Ci0KLSAgICA8IS0tIFdTREwySmF2YSAtLT4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYW50RGF0YU1hcHBpbmciPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9Ik1hcHBpbmdzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkluY2x1ZGVkTmFtZXNwYWNlcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5lbnYuYW50Lk1hcHBpbmdzVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJCaW5kaW5ncyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJCaW5kaW5nRmlsZXMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuZW52LmFudC5CaW5kaW5nc1RyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iSmF2YU91dHB1dCIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJKYXZhU291cmNlRm9sZGVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iU2VydmljZU5hbWUiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iU2VydmljZU5hbWUiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5DbGllbnQiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iR2VuZXJhdGVDbGllbnQiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5TZXJ2ZXIiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iR2VuZXJhdGVTZXJ2ZXIiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5JbXBsIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlSW1wbGVtZW50YXRpb24iCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJEZWZhdWx0VmFsdWVzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlVzZURlZmF1bHRWYWx1ZXMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJFeHRTT0FQSGVhZGVycyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJQcm9jZXNzU09BUEhlYWRlcnMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJEZWZhdWx0TmFtZXNwYWNlIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iRGVmYXVsdEV4Y2x1ZGVzTmFtZXNwYWNlIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iQXV0b05hbWVSZXNvbHV0aW9uIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkF1dG9OYW1lUmVzb2x1dGlvbiIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY19kdiIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNVc2VEZWZhdWx0VmFsdWVzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX3RzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY1RvU3RyaW5nIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX3RzX211bHRpIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY1RvU3RyaW5nTXVsdGlMaW5lIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX3RzX3NpbXBsZSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNUb1N0cmluZ1NpbXBsZSIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY19sb2NhdG9yIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY0xvY2F0b3IiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfc3luY19tZXRob2RzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY1N5bmNNZXRob2RzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX21hcmtfZ2VuZXJhdGVkIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY01hcmtHZW5lcmF0ZWQiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICA8L2V4dGVuc2lvbj4KLSAgPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg0N2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX01FU1NBR0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGSkFYV1NTRUxFQ1RJT05MQVVOQ0hBQkxFX1NFTEVDVElPTl9ESUFMT0dfVElUTEU7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0NMSUVOVF9QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9DTElFTlRfUEFHRV9ERVNDUklQVElPTjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQ2xJRU5UX0RFRkFVTFRTX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0NMSUVOVF9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9MQUJFTDsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5CVU5ETEVfTkFNRSwgQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MDZiNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUNYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFPUJyb3dzZSBXb3Jrc3BhY2UgQ2xhc3NlcyBhbmQgSW50ZXJmYWNlcwotQ1hGSkFYV1NTRUxFQ1RJT05MQVVOQ0hBQkxFX1NFTEVDVElPTl9ESUFMT0dfTUVTU0FHRT1TZWxlY3QgdGhlIEphdmEgQ2xhc3Mgb3IgSW50ZXJmYWNlIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIFdlYiBTZXJ2aWNlCi0KLSNXU0RMMkphdmEgQ2xpZW50IENvbmdpaCBXaWRnZXQgRmFjdG9yeQotV1NETDJKQVZBX0NMSUVOVF9QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgV1NETDJKYXZhIENsaWVudCBDb25maWd1cmF0aW9uCi1XU0RMMkpBVkFfQ0xJRU5UX1BBR0VfREVTQ1JJUFRJT049Q3VzdG9taXNlIHlvdXIgV2ViIFNlcnZpY2UgZ2VuZXJhdGlvbiBieSBzZWxlY3Rpbmcgb3B0aW9ucyBvbiB0aGlzIHBhZ2UKLQotV1NETDJKQVZBX0NsSUVOVF9ERUZBVUxUU19QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgV1NETDJKYXZhIENsaWVudCBDb25maWd1cmF0aW9uCi1XU0RMMkpBVkFfQ0xJRU5UX0RFRkFVTFRTX1BBR0VfREVTQ1JJUFRJT049Q3VzdG9taXNlIHlvdXIgV2ViIFNlcnZpY2UgZ2VuZXJhdGlvbiBieSBzZWxlY3Rpbmcgb3B0aW9ucyBvbiB0aGlzIHBhZ2UKLQotI1dTREwySmF2YSBDbGllbnQgRGVmYXVsdHMgQ29uZmlnIFdpZGdldAotV1NETDJKQVZBX0dST1VQX0xBQkVMPVdTREwySmF2YSBHZW5lcmF0aW9uIE9wdGlvbnMKLVdTREwySkFWQV9YSkNfQVJHX0dST1VQX0xBQkVMPVhKQyBBcmd1bWVudHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5YjVlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbiBwbHVnaW47Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZDb25zdW1wdGlvblVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBDWEZDb25zdW1wdGlvblVJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBDWEZDb25zdW1wdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBDWEZDb25zdW1wdGlvblVJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgIGV4Y2VwdGlvbi50b1N0cmluZygpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DWEZKQVhXU1NlbGVjdGlvbkxhdW5jaGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NYRkpBWFdTU2VsZWN0aW9uTGF1bmNoYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTNkMWQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NYRkpBWFdTU2VsZWN0aW9uTGF1bmNoYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25MYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQ1hGSkFYV1NTZWxlY3Rpb25MYXVuY2hhYmxlIGV4dGVuZHMgQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25MYXVuY2hhYmxlIHsKLSAgICBwcml2YXRlIElTdGF0dXMgdmFsaWRhdGlvblN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZlckNvbXBvbmVudE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lID0gIiI7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKSB7Ci0gICAgICAgIGlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwgJiYgIWluaXRpYWxTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgZmlyc3RFbGVtZW50ID0gaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBmaXJzdEVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgbGF1bmNoKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKHNoZWxsLAotICAgICAgICAgICAgICAgIG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKSwgbmV3IFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuQ1hGSkFYV1NTRUxFQ1RJT05MQVVOQ0hBQkxFX1NFTEVDVElPTl9ESUFMT0dfVElUTEUpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cKLSAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZShDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuQ1hGSkFYV1NTRUxFQ1RJT05MQVVOQ0hBQkxFX1NFTEVDVElPTl9ESUFMT0dfTUVTU0FHRSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRBbGxvd011bHRpcGxlKGZhbHNlKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldElucHV0KEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5hZGRGaWx0ZXIobmV3IEphdmFWaWV3ZXJGaWx0ZXIoKSk7Ci0KLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldFZhbGlkYXRvcihuZXcgSmF2YVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpKTsKLQotICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IHNlbGVjdGlvbkRpYWxvZy5vcGVuKCk7Ci0gICAgICAgIGlmIChyZXR1cm5Db2RlID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzZWxlY3RlZENvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBzZWxlY3Rpb25EaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBzZWxlY3RlZENvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKTsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElSZXNvdXJjZSB0eXBlUmVzb3VyY2UgPSB0eXBlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlUmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3QgPSB0eXBlUmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZih0eXBlUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lID0gY29tcC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBqbWUuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSVN0YXR1cy5DQU5DRUw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldE9iamVjdFNlbGVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmVyQ29tcG9uZW50TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgICAgIElTZWxlY3Rpb25TZXJ2aWNlIHNlbGVjdGlvblNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0gICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvblNlcnZpY2UoKTsKLSAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIFRyZWVTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBUcmVlU2VsZWN0aW9uIHRyZWVTZWxlY3Rpb24gPSAoVHJlZVNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEVsZW1lbnQgPSB0cmVlU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIGZpcnN0RWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikgewotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0YXR1czsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdFNlbGVjdGlvbkRpc3BsYXlhYmxlU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKFN0cmluZyBzdHJpbmdUb1ZhbGlkYXRlKSB7Ci0gICAgICAgIGNsYXNzTmFtZSA9IHN0cmluZ1RvVmFsaWRhdGU7Ci0KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0YXR1cyA9IEpEVFV0aWxzLnZhbGlkYXRlSmF2YVR5cGVOYW1lKHByb2plY3QuZ2V0TmFtZSgpLCBjbGFzc05hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmFsaWRhdGlvblN0YXR1cyA9IEpEVFV0aWxzLnZhbGlkYXRlSmF2YVR5cGVOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLQotLy8gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0vLyAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotLy8gICAgICAgICAgICBJVHlwZSB0eXBlID0gSkRUVXRpbHMuZ2V0VHlwZShwcm9qZWN0LCBjbGFzc05hbWUpOwotLy8gICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsIHx8ICF0eXBlLmV4aXN0cygpKSB7Ci0vLyAgICAgICAgICAgICAgICB2YWxpZGF0aW9uU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb25zdW1wdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOwotLy8gICAgICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0YXR1cyA9IEpEVFV0aWxzLnZhbGlkYXRlSmF2YVR5cGVOYW1lKHByb2plY3QuZ2V0TmFtZSgpLCBjbGFzc05hbWUpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RhdHVzLmlzT0soKTsKLS8vICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uU3RhdHVzLmlzT0soKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmF2YVZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0gICAgICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlRnJhZ21lbnQuaGFzQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIElUeXBlIHR5cGUgPSBjb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQ2xhc3MoKSB8fCB0eXBlLmlzSW50ZXJmYWNlKCk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKYXZhU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIGltcGxlbWVudHMgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB7Ci0gICAgICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25bMF0gaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4uUExVR0lOX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb25zdW1wdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDk0ZjgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnMuUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnMuUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuV1NETDJKYXZhV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIG5hbWVzcGFjZUNvbXBvc2l0ZTsKLSAgICBwcml2YXRlIGludCBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQgPSAtMTsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V1NETDJKYXZhRGF0YU1vZGVsKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXR1c0xpc3RlbmVyOwotCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIE91dHB1dCBEaXIKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVPdXRwdXREaXJlY3RvcnlMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBDb21ibyBvdXRwdXREaXJDb21ibyA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlT3V0cHV0RGlyZWN0b3J5Q29tYm8obWFpbkNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG91dHB1dERpckNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIFBhY2thZ2UgTmFtZToKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWNrYWdlTmFtZUxhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIGZpbmFsIFRleHQgcGFja2FnZU5hbWVUZXh0ID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWNrYWdlTmFtZVRleHQobWFpbkNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWVUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZVBhY2thZ2VOYW1lKG1vZGVsLmdldFByb2plY3ROYW1lKCksIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZmluYWwgQnV0dG9uIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uKG1haW5Db21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIucGFjaygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUgPSBnZXROYW1lc3BhY2VNYXBwaW5nQ29tcG9zaXRlKG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgZ3JvdXBTaXplID0gbmFtZXNwYWNlQ29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0ID0gZ3JvdXBTaXplLnk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgc2hlbGxTaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwuc2V0U2l6ZShzaGVsbFNpemUueCwgc2hlbGxTaXplLnkgKyBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIubGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5wYWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5sYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQb2ludCBzaGVsbFNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaGVsbC5zZXRTaXplKHNoZWxsU2l6ZS54LCBzaGVsbFNpemUueSAtIG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlciA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gU2VydmljZSBOYW1lOgotICAgICAgICAvLyAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVTZXJ2aWNlTmFtZUxhYmVsKG1haW5Db21wb3NpdGUpOwotICAgICAgICAvLwotICAgICAgICAvLyAgICAgICAgQ29tYm8gc2VydmljZU5hbWVDb21ibyA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlU2VydmljZU5hbWVDb21ibyhtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIC8vICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgLy8gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgLy8gICAgICAgIHNlcnZpY2VOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgYmluZGluZ0ZpbGVzTGFiZWwgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUJpbmRpbmdGaWxlc0xhYmVsKG1haW5Db21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDM7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExpc3QgYmluZGluZ0ZpbGVzTGlzdCA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQmluZGluZ0ZpbGVzTGlzdChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDM7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xpc3Quc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIGFkZEJpbmRpbmdGaWxlQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBZGRCaW5kaW5nRmlsZUJ1dHRvbihtYWluQ29tcG9zaXRlLCBtb2RlbCwKLSAgICAgICAgICAgICAgICBiaW5kaW5nRmlsZXNMaXN0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBhZGRCaW5kaW5nRmlsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBCdXR0b24gcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uKG1haW5Db21wb3NpdGUsCi0gICAgICAgICAgICAgICAgbW9kZWwsIGJpbmRpbmdGaWxlc0xpc3QpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIC8qCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWE1MQ2F0YWxvZ0xhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIFRleHQgeG1sQ2F0YWxvZ1RleHQgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dUZXh0KG1haW5Db21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHhtbENhdGFsb2dUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWE1MQ2F0YWxvZ0Jyb3dzZUJ1dHRvbihtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgICovCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBUYWJsZSBjcmVhdGVOYW1lc3BhY2VNYXBwaW5nVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBUYWJsZVZpZXdlciBwYWNrYWdlTmFtZVRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULkNIRUNLIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUgotICAgICAgICAgICAgICAgIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotICAgICAgICBmaW5hbCBUYWJsZSBwYWNrYWdlTmFtZVRhYmxlID0gcGFja2FnZU5hbWVUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVdTRExOYW1lc3BhY2VWaWV3ZXJDb2x1bW4ocGFja2FnZU5hbWVUYWJsZVZpZXdlcik7Ci0KLSAgICAgICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMTAwLCAxMDAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWNrYWdlTmFtZUNvbHVtbigKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLCBtb2RlbCk7Ci0KLSAgICAgICAgVGV4dENlbGxFZGl0b3IgdGV4dENlbGxFZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IocGFja2FnZU5hbWVUYWJsZVZpZXdlci5nZXRUYWJsZSgpKTsKLSAgICAgICAgdGV4dENlbGxFZGl0b3IuYWRkTGlzdGVuZXIoIG5ldyBJQ2VsbEVkaXRvckxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBlZGl0b3JWYWx1ZUNoYW5nZWQoYm9vbGVhbiBvbGRWYWxpZFN0YXRlLCBib29sZWFuIG5ld1ZhbGlkU3RhdGUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2FuY2VsRWRpdG9yKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseUVkaXRvclZhbHVlKCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0ZXh0Q2VsbEVkaXRvci5zZXRWYWxpZGF0b3IobmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSkRUVXRpbHMudmFsaWRhdGVQYWNrYWdlTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBwYWNrYWdlTmFtZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBQYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0KHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIsCi0gICAgICAgICAgICAgICAgdGV4dENlbGxFZGl0b3IsIG1vZGVsKSk7Ci0KLSAgICAgICAgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlci5zZXRJbnB1dChtb2RlbC5nZXRXc2RsRGVmaW5pdGlvbigpKTsKLQotICAgICAgICBUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gcGFja2FnZU5hbWVUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVJdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlSXRlbXNbaV07Ci0gICAgICAgICAgICBpZiAobW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuY29udGFpbnNLZXkodGFibGVJdGVtLmdldFRleHQoMCkpKSB7Ci0gICAgICAgICAgICAgICAgdGFibGVJdGVtLnNldENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lVGFibGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgZ2V0TmFtZXNwYWNlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVGFibGUgcGFja2FnZU5hbWVUYWJsZSA9IGNyZWF0ZU5hbWVzcGFjZU1hcHBpbmdUYWJsZShuYW1lc3BhY2VDb21wb3NpdGUpOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICByZXR1cm4gbmFtZXNwYWNlQ29tcG9zaXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4MjhhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS5DWEZDb25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yOwotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3Igd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNXaWRnZXRDb250cmlidXRvcjsKLQotICAgIHByaXZhdGUgV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0IHdzZGwySmF2YUNvbmZpZ1dpZGdldCA9IG5ldyBXU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQoKTsKLSAgICBwcml2YXRlIFdTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0IHdzZGwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0ID0gbmV3IFdTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0KCk7Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIHsKLSAgICAgICAgaWYgKHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCB3c2RsMkphdmFDbGllbnREZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ2xpZW50V2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldChJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcikgewotICAgICAgICBpZiAod2lkZ2V0Q29udHJpYnV0b3IgPT0gd3NkbDJKYXZhQ2xpZW50V2lkZ2V0Q29udHJpYnV0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiB3c2RsMkphdmFDbGllbnREZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLAotICAgICAgICAgICAgICAgICJXU0RMMkphdmFEYXRhTW9kZWwiLCBXU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5LmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgd3NkbDJKYXZhQ29uZmlnV2lkZ2V0LnNldFdTREwySmF2YURhdGFNb2RlbChtb2RlbCk7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0LnNldFdTREwySmF2YURhdGFNb2RlbChtb2RlbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdTREwySmF2YUNvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nIHdzZGwySmF2YUNsaWVudFBhZ2VUaXRsZSA9IENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfQ0xJRU5UX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCksIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgd3NkbDJKYXZhQ2xpZW50V2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUod3NkbDJKYXZhQ2xpZW50UGFnZVRpdGxlKTsKLSAgICAgICAgd3NkbDJKYXZhQ2xpZW50V2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfQ0xJRU5UX1BBR0VfREVTQ1JJUFRJT04pOwotICAgICAgICB3c2RsMkphdmFDbGllbnRXaWRnZXRDb250cmlidXRvci5zZXRGYWN0b3J5KG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB3c2RsMkphdmFDb25maWdXaWRnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHdzZGwySmF2YUNsaWVudERlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3IgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLSAgICAgICAgU3RyaW5nIHdzZGwySmF2YUNsaWVudERlZmF1bHRzUGFnZVRpdGxlID0gQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9DbElFTlRfREVGQVVMVFNfUEFHRV9USVRMRSwgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCksIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZSh3c2RsMkphdmFDbGllbnREZWZhdWx0c1BhZ2VUaXRsZSk7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudERlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfQ0xJRU5UX0RFRkFVTFRTX1BBR0VfREVTQ1JJUFRJT04pOwotICAgICAgICB3c2RsMkphdmFDbGllbnREZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdzZGwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzQ5ZjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5XU0RMMkphdmFXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLQotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHVibGljIFdTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIHdzZGwyamF2YUdyb3VwID0gbmV3IEdyb3VwKG1haW5Db21wb3NpdGUsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRUZXh0KENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGwyamF2YWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXQod3NkbDJqYXZhbGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRGVmYXVsdFZhbHVlc0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBdXRvTmFtZVJlc29sdXRpb25CdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlTm9BZGRyZXNzQmluZGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgR3JvdXAgeGpjQXJnR3JvdXAgPSBuZXcgR3JvdXAobWFpbkNvbXBvc2l0ZSwgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldFRleHQoQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfQVJHX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB4amNBcmdMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0KHhqY0FyZ0xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBUYWJsZSB4amNBcmdzVGFibGUgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0FyZ1RhYmxlKHhqY0FyZ0dyb3VwLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDRGVmYXVsdFZhbHVlc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNMb2NhdG9yVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1N5bmNNZXRob2RzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0pBWFdTU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KQVhXU1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTdlNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0pBWFdTU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS5DWEZDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSkFYV1NTZWxlY3Rpb25UcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyIHsKLQotICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmFsdWU7Ci0gICAgICAgICAgICBPYmplY3Qgc2VsZWN0aW9uID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIHNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRKYXZhTmFtZSA9IHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhTmFtZShmaWxlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZnVsbHlRdWFsaWZpZWRKYXZhTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKElDb21waWxhdGlvblVuaXQpIHNlbGVjdGlvbikuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUgPSB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmdWxseVF1YWxpZmllZEphdmFOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0cnVjdHVyZWRTZWxlY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUoSUZpbGUgcmVzb3VyY2UpIHsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQotICAgICAgICBJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQotICAgICAgICBpZiAocGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGphdmFGaWxlTmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKTsKLQotICAgICAgICBpZiAocGF0aC5pc0Fic29sdXRlKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSVBhdGggamF2YUZvbGRlclBhdGggPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLSAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KS5maW5kUGFja2FnZUZyYWdtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUZvbGRlclBhdGgpOwotICAgICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSArICIuIiArIGphdmFGaWxlTmFtZTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGphdmFGaWxlTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlQ2xpZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MDg2YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOiAKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud3NydDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUNsaWVudEluZm87Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQ1hGV2ViU2VydmljZUNsaWVudCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZUNsaWVudCB7Ci0KLSAgICBwdWJsaWMgQ1hGV2ViU2VydmljZUNsaWVudChXZWJTZXJ2aWNlQ2xpZW50SW5mbyBpbmZvKSB7Ci0gICAgICAgIHN1cGVyKGluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYXNzZW1ibGUoSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsCi0gICAgICAgICAgICBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRlcGxveShJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwKLSAgICAgICAgICAgIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGV2ZWxvcChJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgZWFyUHJvamVjdCkgewotCi0gICAgICAgIFZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgICBXU0RMMkphdmFEYXRhTW9kZWwgd3NkbDJKYXZhTW9kZWwgPSBDWEZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMMkphdmFEYXRhTW9kZWwoKTsKLSAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZCh3c2RsMkphdmFNb2RlbCwgcHJvamVjdE5hbWUsIAotICAgICAgICAJCWdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuZ2V0V3NkbFVSTCgpKSk7Ci0gICAgICAgIGNvbW1hbmRzLmFkZChuZXcgV1NETDJKYXZhQ2xpZW50Q29tbWFuZCh3c2RsMkphdmFNb2RlbCkpOwotCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwKLSAgICAgICAgICAgIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgcnVuKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LAotICAgICAgICAgICAgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMjgwODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTAyMzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0ZThlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgTm92IDA3IDIzOjU4OjU0IEVTVCAyMDA4Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZGRkZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWksCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWksb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmVudi5hbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWksCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZSxvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlsczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWksCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMi4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA1LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjYuMiwxLjcuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5jb25zb2xlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNCwxLjEuMCkiLAotIGphdmF4Lmp3cztidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDIuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIgotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQ3JlYXRlZC1CeTogMS41LjBfMTQtYjAzIChTdW4gTWljcm9zeXN0ZW1zIEluYy4pCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC53czt2ZXJzaW9uPSIyLjEuMCIsCi0gb3JnLmpkb207dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5qZG9tLmlucHV0O3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuamRvbS5vdXRwdXQ7dmVyc2lvbj0iMS4wLjAiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxNjliZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0LmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiOTNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgZmVhdHVyZSBkZXRhaWxzIGluIHRoZSAiQWJvdXQiIAotIyBkaWFsb2cgKHRyYW5zbGF0ZWQpLiAgTWF4aW11bSAxNSBsaW5lcyBhbmQgNzUgY2hhcmFjdGVycyBwZXIgbGluZS4KLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlOTI0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1DWEYgV2ViIFNlcnZpY2VzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDgsIDIwMTAuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9cblwKLVxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3YmEyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBqbWVyZ2VyLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvaWNvbnMvdmlldzE2L2NvbnNvbGVfdmlldy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9pY29ucy92aWV3MTYvY29uc29sZV92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5OGY2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9pY29ucy92aWV3MTYvY29uc29sZV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2ptZXJnZXIvbWVyZ2UueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvam1lcmdlci9tZXJnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMmRkMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvam1lcmdlci9tZXJnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBNZXJnZSBydWxlcyB1c2VkIGJ5IEpNZXJnZXIgLS0+Ci08bWVyZ2U6b3B0aW9ucyAKLQl4bWxuczptZXJnZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZWNsaXBzZS9lbWYvY29kZWdlbi9qbWVyZ2UvT3B0aW9ucyI+Ci0JCi0JPCEtLSBpZiB0YXJnZXQgaXMgZ2VuZXJhdGVkLCB0cmFuc2ZlciAtLT4KLSAgICA8IS0tIGNoYW5nZSB0byBzb3VyY2VNYXJrdXAgaWYgdGhlIHNvdXJjZSBpcyB0aGUgc3RhbmRhcmQgLS0+Ci0gICAgPG1lcmdlOnB1bGwgCi0gICAgICAgIHNvdXJjZUdldD0iTWV0aG9kL2dldEJvZHkiCi0gICAgICAgIHNvdXJjZVRyYW5zZmVyPSIoXHMqLy9ccypiZWdpbi11c2VyLWNvZGUuKj8vL1xzKmVuZC11c2VyLWNvZGVccyopXG4iCi0gICAgICAgIHRhcmdldFB1dD0iTWV0aG9kL3NldEJvZHkiLz4KLQkKLQk8bWVyZ2U6cHVsbCAKLQkJc291cmNlR2V0PSJNZXRob2QvZ2V0UmV0dXJuVHlwZSIgCi0JCXRhcmdldFB1dD0iTWV0aG9kL3NldFJldHVyblR5cGUiLz4KLQk8bWVyZ2U6cHVsbCAKLQkJc291cmNlR2V0PSJNZXRob2QvZ2V0RXhjZXB0aW9ucyIgCi0JCXRhcmdldFB1dD0iTWV0aG9kL2FkZEV4Y2VwdGlvbiIvPgotCQotICAgIDxtZXJnZTpwdWxsCi0gICAgICBzb3VyY2VHZXQ9Ik1lbWJlci9nZXRDb21tZW50IgotICAgICAgdGFyZ2V0UHV0PSJNZW1iZXIvc2V0Q29tbWVudCIvPgotICAgIDxtZXJnZTpwdWxsCi0gICAgICAgc291cmNlR2V0PSJJbXBvcnQvZ2V0TmFtZSIKLSAgICAgICB0YXJnZXRQdXQ9IkltcG9ydC9zZXROYW1lIi8+Ci0gICAgPG1lcmdlOnB1bGwKLSAgICAgICBzb3VyY2VHZXQ9IkNvbXBpbGF0aW9uVW5pdC9nZXRIZWFkZXIiCi0gICAgICAgdGFyZ2V0UHV0PSJDb21waWxhdGlvblVuaXQvc2V0SGVhZGVyIi8+Ci0KLTwhLS0gTWVyZ2UgcnVsZXMgdG8gaGFuZGxlIGFubm90YXRpb246Ci0JLSBXaXRoIHRoaXMgcHVsbCBydWxlLCBhbm5vdGF0aW9ucyBpbiB0aGUgdGFyZ2V0IGlzIHJlcGxhY2VkIGJ5IGFubm90YXRpb25zIG9mIHRoZSAKLQlzYW1lIG5hbWUgaW4gdGhlIHNvdXJjZS4KLQktIFdpdGggdGhpcyBzd2VlcCBydWxlLCBhbnkgYW5ub3RhdGlvbiBpbiB0aGUgdGFyZ2V0IHRoYXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgCi0gIAlzb3VyY2UgaXMgY29tbWVudGVkIG91dC4gCi0gIAktIEJ5IGRlZmF1bHQsIGFueSBhbm5vdGF0aW9uIGluIHRoZSBzb3VyY2UgdGhhdCBpcyBub3QgaW4gdGhlIHRhcmdldCBhcmUgcHVsbGVkIGludG8gdGhlIHRhcmdldC4KLS0tPgotCi0JPG1lcmdlOnB1bGwgCi0gICAgCXNvdXJjZUdldD0iQW5ub3RhdGlvbi9nZXRDb250ZW50cyIKLSAgICAJdGFyZ2V0UHV0PSJBbm5vdGF0aW9uL3NldENvbnRlbnRzIi8+Ci0gICAKLSAgCTxtZXJnZTpzd2VlcCBzZWxlY3Q9IkFubm90YXRpb24iIGFjdGlvbj0iY29tbWVudCIvPgotCQkKLTwvbWVyZ2U6b3B0aW9ucz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL21vZGVsL0NYRi5lY29yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL21vZGVsL0NYRi5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3OWYyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibW9kZWwiCi0gICAgbnNVUkk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDWEZDb250ZXh0IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFJ1bnRpbWVMb2NhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0UnVudGltZVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFJ1bnRpbWVWZXJzaW9uIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcmJvc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlQW50QnVpbGRGaWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVDbGllbnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZVNlcnZlciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRhdGFiaW5kaW5nIiBlVHlwZT0iIy8vRGF0YUJpbmRpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImpheGIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJvbnRlbmQiIGVUeXBlPSIjLy9Gcm9udGVuZCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iamF4d3MiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0IgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imluc3RhbGxhdGlvbnMiIHRyYW5zaWVudD0idHJ1ZSI+Ci0gICAgICA8ZUdlbmVyaWNUeXBlIGVDbGFzc2lmaWVyPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VNYXAiPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9IiMvL0NYRkluc3RhbGwiLz4KLSAgICAgIDwvZUdlbmVyaWNUeXBlPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ1hGRGF0YU1vZGVsIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NYRkNvbnRleHQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZURpcmVjdG9yeSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbGFzc0RpcmVjdG9yeSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsRmlsZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbFVSTCIgZVR5cGU9IiMvL1VSTCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25maWdXc2RsTG9jYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uZmlnSWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVuZHBvaW50TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXJ2aWNlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsRGVmaW5pdGlvbiIgZVR5cGU9IiMvL0RlZmluaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbExvY2F0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmEyV1NDb250ZXh0IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0NYRkNvbnRleHQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwMTJCaW5kaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVYU0RJbXBvcnRzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZVdTREwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhMldTRGF0YU1vZGVsIiBlU3VwZXJUeXBlcz0iIy8vQ1hGRGF0YU1vZGVsICMvL0phdmEyV1NDb250ZXh0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NwYXRoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImphdmFTdGFydGluZ1BvaW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0cmFjdEludGVyZmFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXRob2RNYXAiPgotICAgICAgPGVHZW5lcmljVHlwZSBlQ2xhc3NpZmllcj0iIy8vTWFwIj4KLSAgICAgICAgPGVUeXBlQXJndW1lbnRzIGVDbGFzc2lmaWVyPSIjLy9JTWV0aG9kIi8+Ci0gICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iIy8vTWFwIj4KLSAgICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIvPgotICAgICAgICA8L2VUeXBlQXJndW1lbnRzPgotICAgICAgPC9lR2VuZXJpY1R5cGU+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbm5vdGF0aW9uTWFwIj4KLSAgICAgIDxlR2VuZXJpY1R5cGUgZUNsYXNzaWZpZXI9IiMvL01hcCI+Ci0gICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIvPgotICAgICAgPC9lR2VuZXJpY1R5cGU+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb3VyY2VEaXJlY3RvcnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9ydE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETDJKYXZhQ29udGV4dCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9DWEZDb250ZXh0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvY2Vzc1NPQVBIZWFkZXJzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmciCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWxpZGF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbFZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEuMSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VEZWZhdWx0VmFsdWVzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4amNBcmdzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vQWRkcmVzc0JpbmRpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4amNVc2VEZWZhdWx0VmFsdWVzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieGpjVG9TdHJpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4amNUb1N0cmluZ011bHRpTGluZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhqY1RvU3RyaW5nU2ltcGxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieGpjTG9jYXRvciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhqY1N5bmNNZXRob2RzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieGpjTWFya0dlbmVyYXRlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhqY0VwaXNvZGVGaWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9OYW1lUmVzb2x1dGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldTREwySmF2YURhdGFNb2RlbCIgZVN1cGVyVHlwZXM9IiMvL0NYRkRhdGFNb2RlbCAjLy9XU0RMMkphdmFDb250ZXh0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5jbHVkZWROYW1lc3BhY2VzIj4KLSAgICAgIDxlR2VuZXJpY1R5cGUgZUNsYXNzaWZpZXI9IiMvL01hcCI+Ci0gICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8L2VHZW5lcmljVHlwZT4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJpbmRpbmdGaWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZWROYW1lc3BhY2VzIj4KLSAgICAgIDxlR2VuZXJpY1R5cGUgZUNsYXNzaWZpZXI9IiMvL01hcCI+Ci0gICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8L2VHZW5lcmljVHlwZT4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGFsb2dGaWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImphdmFTb3VyY2VGb2xkZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJGcm9udGVuZCI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJKQVhXUyIgbGl0ZXJhbD0iamF4d3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJEYXRhQmluZGluZyI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJKQVhCIiBsaXRlcmFsPSJqYXhiIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVSTCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSTCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmluaXRpb24iIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkRlZmluaXRpb24iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJNYXAiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTWFwIj4KLSAgICA8ZVR5cGVQYXJhbWV0ZXJzIG5hbWU9IlQiLz4KLSAgICA8ZVR5cGVQYXJhbWV0ZXJzIG5hbWU9IlQxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IklNZXRob2QiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ1hGSW5zdGFsbCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZWNvcmVfZGlhZ3JhbSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL21vZGVsL0NYRi5lY29yZV9kaWFncmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzMyM2Y2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL21vZGVsL0NYRi5lY29yZV9kaWFncmFtCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bm90YXRpb246RGlhZ3JhbSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczpub3RhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvcnVudGltZS8xLjAuMS9ub3RhdGlvbiIgeG1pOmlkPSJfeXJVTjBldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iRWNvcmUiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKdGFBT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDEiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTEFPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwMSIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTEFldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMSI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pTODFrT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9jeGZSdW50aW1lTG9jYXRpb24iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96Uzgxa2V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96Uzgxa3V1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvY3hmUnVudGltZUVkaXRpb24iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96Uzgxay11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96UzgxbE91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvY3hmUnVudGltZVZlcnNpb24iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96UzgxbGV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96UzgxbHV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvdmVyYm9zZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3pTODFsLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pTODFtT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9nZW5lcmF0ZUFudEJ1aWxkRmlsZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3pTODFtZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pTODFtdXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9nZW5lcmF0ZUNsaWVudCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3pTODFtLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pTODFuT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9nZW5lcmF0ZVNlcnZlciIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3pTODFuZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pTODFudXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9kYXRhYmluZGluZyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3pTODFuLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pTODFvT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9mcm9udGVuZCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3pTODFvZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pTODFvdXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC91c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96Uzgxby11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il8tSWh3b091bkVkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLUlod29ldW5FZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMQXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xBLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMQk91a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xCZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDIiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xCdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTEItdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xDT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTENldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTEN1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMQy11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTERPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfekp0YUFldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQiLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96SnRhQXV1a0VkMnBmSW1UMWpUN3ZRIiB4PSI0NjUiIHk9IjE1Ii8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTERldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwMSI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMRU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDAxIi8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMRWV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAxIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMRXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xFLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMRk91a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xGZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDIiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xGdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTEYtdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xHT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTEdldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTEd1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMRy11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTEhPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfekozTER1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkRhdGFNb2RlbCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pKM0xELXVrRWQycGZJbVQxalQ3dlEiIHg9IjQ2NSIgeT0iMjkwIi8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTEhldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwMSI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMSU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDAxIi8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMSWV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAxIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMSXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xJLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMSk91a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xKZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDIiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xKdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTEotdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xLT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTEtldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTEt1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMSy11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTExPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfekozTEh1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIGhyZWY9IkNYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0Ii8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfekozTEgtdWtFZDJwZkltVDFqVDd2USIgeD0iMTg1IiB5PSIyOTAiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMTGV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDAxIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xNT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDEiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xNZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDEiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xNdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTE0tdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xOT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTE5ldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMiI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTE51dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMTi11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTE9PdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FVOE91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAzIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FVOGV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVU4dXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FVOC11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96SjNMTHV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgaHJlZj0iQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pKM0xMLXVrRWQycGZJbVQxalQ3dlEiIHg9IjIzMCIgeT0iNjIwIi8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVTlPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwMSI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FVOS11a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDAxIi8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FVLU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAxIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dleklCOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L2dlbmVyYXRlSW1wbGVtZW50YXRpb24iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2V6SVI5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2V6SWg5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvcHJvY2Vzc1NPQVBIZWFkZXJzIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dmYU1COTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dmYU1SOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L2xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dmYU1oOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dmYU14OTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L2xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dmYU5COTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dmYU5SOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3ZhbGlkYXRlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dnQlFCOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dnQlFSOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3dzZGxWZXJzaW9uIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dnQlFoOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dnQlF4OTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3VzZURlZmF1bHRWYWx1ZXMiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2dCUkI5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2dCUlI5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjQXJncyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3Z0JSaDkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3Z29VQjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9ub0FkZHJlc3NCaW5kaW5nIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dnb1VSOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dnb1VoOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1VzZURlZmF1bHRWYWx1ZXMiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2dvVXg5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2hQWUI5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjVG9TdHJpbmciLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2hQWVI5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2hQWWg5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjVG9TdHJpbmdNdWx0aUxpbmUiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2hQWXg5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2hQWkI5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjVG9TdHJpbmdTaW1wbGUiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2hQWlI5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2gyY0I5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjTG9jYXRvciIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3aDJjUjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3aDJjaDkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNTeW5jTWV0aG9kcyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3aDJjeDkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3aDJkQjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNNYXJrR2VuZXJhdGVkIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3doMmRSOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dpZGdCOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY0VwaXNvZGVGaWxlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dpZGdSOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfalZoMGdCOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L2F1dG9OYW1lUmVzb2x1dGlvbiIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2pWaDBnUjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVS1ldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FVLXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVS0tdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FVX091a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAyIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FVX2V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVVfdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FVXy11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZBT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDMiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVZBZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVkF1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVZBLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pLQVU5ZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0Ii8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfektBVTl1dWtFZDJwZkltVDFqVDd2USIgeD0iNzI1IiB5PSIyOTAiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWQk91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDAxIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZCLXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDEiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZDT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDEiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVZDZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVkN1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVZDLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkRPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMiI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVkRldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWRHV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVkQtdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWRU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAzIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWRWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZFdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWRS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96S0FWQmV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhRGF0YU1vZGVsIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfektBVkJ1dWtFZDJwZkltVDFqVDd2USIgeD0iNzUwIiB5PSI2NzAiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWRk91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDA1Ij4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZGLXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDUiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZHT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMTEiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVZHZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVkd1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVZHLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkhPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAxMiI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVkhldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWSHV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVkgtdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfektBVkZldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFRW51bSIgaHJlZj0iQ1hGLmVjb3JlIy8vRnJvbnRlbmQiLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96S0FWRnV1a0VkMnBmSW1UMWpUN3ZRIiB4PSI3MzUiIHk9IjE1IiB3aWR0aD0iOTEiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWSU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDA1Ij4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZJLXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDUiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZKT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMTEiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVZKZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVkp1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVZKLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVktPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAxMiI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVktldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWS3V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVkstdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfektBVklldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFRW51bSIgaHJlZj0iQ1hGLmVjb3JlIy8vRGF0YUJpbmRpbmciLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96S0FWSXV1a0VkMnBmSW1UMWpUN3ZRIiB4PSI3MzUiIHk9Ijc1IiB3aWR0aD0iOTEiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWTE91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDA0Ij4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZMLXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDQiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZNT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMTAiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVZNZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVk11dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVZNLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pLQVZMZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJDWEYuZWNvcmUjLy9VUkwiLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96S0FWTHV1a0VkMnBmSW1UMWpUN3ZRIiB4PSIxODUiIHk9IjE1IiB3aWR0aD0iNzYiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWTk91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDA0Ij4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLS0Y4T3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDQiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLS0Y4ZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMTAiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLS0Y4dXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektLRjgtdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLS0Y5T3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pLQVZOZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJDWEYuZWNvcmUjLy9EZWZpbml0aW9uIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfektBVk51dWtFZDJwZkltVDFqVDd2USIgeD0iMTg1IiB5PSI2MCIgd2lkdGg9Ijc2Ii8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektLRjlldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwNCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0tGLU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDA0Ii8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0tGLWV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDEwIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0tGLXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLS0YtLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0tGX091a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96S0tGOXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iQ1hGLmVjb3JlIy8vTWFwIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfektLRjktdWtFZDJwZkltVDFqVDd2USIgeD0iMTg1IiB5PSIxMTAiIHdpZHRoPSI3NiIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLS0ZfZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDQiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektLR0FPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwNCIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektLR0FldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAxMCI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektLR0F1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0tHQS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektLR0JPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfektLRl91dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9IkNYRi5lY29yZSMvL0lNZXRob2QiLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96S0tGXy11a0VkMnBmSW1UMWpUN3ZRIiB4PSIxODUiIHk9IjE1NSIgd2lkdGg9Ijc2Ii8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW1TdHlsZSIgeG1pOmlkPSJfeXJVTjB1dWtFZDJwZkltVDFqVDd2USIvPgotICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9IkNYRi5lY29yZSMvIi8+Ci0gIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfelVsMFVPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNDAwNCIgc291cmNlPSJfekozTERldWtFZDJwZkltVDFqVDd2USIgdGFyZ2V0PSJfekp0YUFPdWtFZDJwZkltVDFqVDd2USI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3pVbDBVZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX3pVbDBVdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfelVsMFUtdWtFZDJwZkltVDFqVDd2USIgcG9pbnRzPSJbNCwgLTEsIDEsIDczXSRbNCwgLTczLCAxLCAxXSIvPgotICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5Q091a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuNDYsMC4wMDc0OTA2MzcpIi8+Ci0gICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlDZXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC41MDI3MDI3LDAuOTg1MjIxNykiLz4KLSAgPC9lZGdlcz4KLSAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il96VkNnUU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI0MDA0IiBzb3VyY2U9Il96SjNMSGV1a0VkMnBmSW1UMWpUN3ZRIiB0YXJnZXQ9Il96SnRhQU91a0VkMnBmSW1UMWpUN3ZRIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfelZDZ1FldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfelZDZ1F1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il96VkNnUS11a0VkMnBmSW1UMWpUN3ZRIiBwb2ludHM9IlswLCAxLCAtNDEsIDMxOF0kWzQxLCAtMzE3LCAwLCAwXSIvPgotICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5QU91a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuODk5NTgxNiwwLjA0Mjc4MDc1KSIvPgotICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5QWV1a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuMTA4MTA4MTEsMC45OTUwNzM5KSIvPgotICA8L2VkZ2VzPgotICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVkZ2UiIHhtaTppZD0iX3pWQ2dST3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjQwMDQiIHNvdXJjZT0iX3pKM0xMZXVrRWQycGZJbVQxalQ3dlEiIHRhcmdldD0iX3pKM0xEZXVrRWQycGZJbVQxalQ3dlEiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il96VkNnUmV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il96VkNnUnV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3pWQ2dSLXVrRWQycGZJbVQxalQ3dlEiIHBvaW50cz0iWzAsIDAsIC02MCwgLTEyMF0kWzYwLCAxMjAsIDAsIDBdIi8+Ci0gICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlDdXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC45MDgxNjMyNSwwLjAwNTM0NzU5MzcpIi8+Ci0gICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlDLXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC4yNTUsMC45ODg3NjQwNSkiLz4KLSAgPC9lZGdlcz4KLSAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il96VkNnU091a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI0MDA0IiBzb3VyY2U9Il96SjNMTGV1a0VkMnBmSW1UMWpUN3ZRIiB0YXJnZXQ9Il96SjNMSGV1a0VkMnBmSW1UMWpUN3ZRIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfelZDZ1NldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfelZDZ1N1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il96VkNnUy11a0VkMnBmSW1UMWpUN3ZRIiBwb2ludHM9IlswLCAwLCAtNjAsIDYyXSRbNjAsIC02MSwgMCwgMV0iLz4KLSAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOURPdWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjM4Nzc1NTEsMC4wMDUzNDc1OTM3KSIvPgotICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5RGV1a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuNTEwNDYwMjYsMC45ODkzMDQ4NCkiLz4KLSAgPC9lZGdlcz4KLSAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il96VkNnVE91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI0MDA0IiBzb3VyY2U9Il96S0FVOU91a0VkMnBmSW1UMWpUN3ZRIiB0YXJnZXQ9Il96SnRhQU91a0VkMnBmSW1UMWpUN3ZRIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfelZDZ1RldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfelZDZ1R1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il96VkNnVC11a0VkMnBmSW1UMWpUN3ZRIiBwb2ludHM9IlswLCAwLCAtNjAsIDMwMV0kWzYwLCAtMzAwLCAwLCAxXSIvPgotICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5QnV1a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDEuMCwwLjQ5ODQxMjcpIi8+Ci0gICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlCLXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC44NDg2NDg2NywwLjk2NTUxNzIpIi8+Ci0gIDwvZWRnZXM+Ci0gIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfelZDZ1VPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNDAwNCIgc291cmNlPSJfektBVkJPdWtFZDJwZkltVDFqVDd2USIgdGFyZ2V0PSJfekozTERldWtFZDJwZkltVDFqVDd2USI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3pWQ2dVZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX3pWQ2dVdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfelZDZ1UtdWtFZDJwZkltVDFqVDd2USIgcG9pbnRzPSJbLTU2LCAtMzAsIDM3NCwgMjAyXSRbLTI2NSwgLTE0MywgMTY1LCA4OV0iLz4KLSAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUF1dWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjA1NTE3MjQxNCwwLjAwODEzMDA4MSkiLz4KLSAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUEtdWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjAsMC42NjY2NjY3KSIvPgotICA8L2VkZ2VzPgotICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVkZ2UiIHhtaTppZD0iX3pWQ2dWT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjQwMDQiIHNvdXJjZT0iX3pLQVZCT3VrRWQycGZJbVQxalQ3dlEiIHRhcmdldD0iX3pLQVU5T3VrRWQycGZJbVQxalQ3dlEiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il96VkNnVmV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il96VkNnVnV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3pWQ2dWLXVrRWQycGZJbVQxalQ3dlEiIHBvaW50cz0iWzAsIDAsIC0xMTEsIDBdJFsxMTEsIDAsIDAsIDBdIi8+Ci0gICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlCT3VrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC41ODYyMDY5LDAuMCkiLz4KLSAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUJldWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjQwMjkzMDQsMC45OTM2NTA4KSIvPgotICA8L2VkZ2VzPgotPC9ub3RhdGlvbjpEaWFncmFtPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvbW9kZWwvQ1hGLmdlbm1vZGVsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvbW9kZWwvQ1hGLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmQ5ZDU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL21vZGVsL0NYRi5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgY29weXJpZ2h0VGV4dD0iQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQyYjeEQ7JiN4QTtBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzJiN4RDsmI3hBO2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCYjeEQ7JiN4QTt3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCYjeEQ7JiN4QTtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCYjeEQ7JiN4QTsgJiN4RDsmI3hBO0NvbnRyaWJ1dG9yczomI3hEOyYjeEE7SU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIgotICAgIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYyIgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlIgotICAgIG1vZGVsTmFtZT0iQ1hGIiByb290RXh0ZW5kc0ludGVyZmFjZT0iIiByb290SW1wbGVtZW50c0ludGVyZmFjZT0iIiBzdXBwcmVzc0VNRlR5cGVzPSJ0cnVlIgotICAgIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5lY29yZSIgY29tcGxpYW5jZUxldmVsPSI1LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiCi0gICAgbGFuZ3VhZ2U9IiI+Ci0gIDxmb3JlaWduTW9kZWw+Q1hGLmVjb3JlPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkNYRiIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGVjb3JlUGFja2FnZT0iQ1hGLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJDWEYuZWNvcmUjLy9Gcm9udGVuZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IkNYRi5lY29yZSMvL0Zyb250ZW5kL0pBWFdTIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iQ1hGLmVjb3JlIy8vRGF0YUJpbmRpbmciPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJDWEYuZWNvcmUjLy9EYXRhQmluZGluZy9KQVhCIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IkNYRi5lY29yZSMvL1VSTCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iQ1hGLmVjb3JlIy8vRGVmaW5pdGlvbiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iQ1hGLmVjb3JlIy8vTWFwIj4KLSAgICAgIDxnZW5UeXBlUGFyYW1ldGVycyBlY29yZVR5cGVQYXJhbWV0ZXI9IkNYRi5lY29yZSMvL01hcC9UIi8+Ci0gICAgICA8Z2VuVHlwZVBhcmFtZXRlcnMgZWNvcmVUeXBlUGFyYW1ldGVyPSJDWEYuZWNvcmUjLy9NYXAvVDEiLz4KLSAgICA8L2dlbkRhdGFUeXBlcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IkNYRi5lY29yZSMvL0lNZXRob2QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvY3hmUnVudGltZUxvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9jeGZSdW50aW1lRWRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvY3hmUnVudGltZVZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L3ZlcmJvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2dlbmVyYXRlQW50QnVpbGRGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9nZW5lcmF0ZUNsaWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvZ2VuZXJhdGVTZXJ2ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2RhdGFiaW5kaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9mcm9udGVuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9leHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2N4Zkluc3RhbGxMb2NhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9wcm9qZWN0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9yZXNvdXJjZURpcmVjdG9yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9jbGFzc0RpcmVjdG9yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC93c2RsRmlsZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvd3NkbFVSTCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9jb25maWdXc2RsTG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsL2Z1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvY29uZmlnSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsL2VuZHBvaW50TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9zZXJ2aWNlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC93c2RsRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC93c2RsTG9jYXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQvc29hcDEyQmluZGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0L2dlbmVyYXRlWFNESW1wb3J0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0L2dlbmVyYXRlV1NETCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0L2dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9hbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9nZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9nZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0L2dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQvZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IkNYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvY2xhc3NwYXRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbC9qYXZhU3RhcnRpbmdQb2ludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvdXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbC9leHRyYWN0SW50ZXJmYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbC9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbC9tZXRob2RNYXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsL2Fubm90YXRpb25NYXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsL3NvdXJjZURpcmVjdG9yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvcG9ydE5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L2dlbmVyYXRlSW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3Byb2Nlc3NTT0FQSGVhZGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L2xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC92YWxpZGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvd3NkbFZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3VzZURlZmF1bHRWYWx1ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY0FyZ3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L25vQWRkcmVzc0JpbmRpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1VzZURlZmF1bHRWYWx1ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1RvU3RyaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNUb1N0cmluZ011bHRpTGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjVG9TdHJpbmdTaW1wbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY0xvY2F0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1N5bmNNZXRob2RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNNYXJrR2VuZXJhdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNFcGlzb2RlRmlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvYXV0b05hbWVSZXNvbHV0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IkNYRi5lY29yZSMvL1dTREwySmF2YURhdGFNb2RlbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhRGF0YU1vZGVsL2luY2x1ZGVkTmFtZXNwYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YURhdGFNb2RlbC9iaW5kaW5nRmlsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFEYXRhTW9kZWwvZXhjbHVkZWROYW1lc3BhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhRGF0YU1vZGVsL2NhdGFsb2dGaWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhRGF0YU1vZGVsL2phdmFTb3VyY2VGb2xkZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3OTc5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgQ29yZQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotQ1hGX0ZBQ0VUX0NPUkVfTEFCRUw9Q1hGIDIueCBXZWIgU2VydmljZXMKLUNYRl9GQUNFVF9DT1JFX0RJU0NSSVBUSU9OPUVuYWJsZXMgV2ViIFNlcnZpY2VzIGdlbmVyYXRpb24gdGhyb3VnaCBDWEYgMi54Ci1DWEZfQ09SRV9URU1QTEFURV9MQUJFTD1DWEYgV2ViIFNlcnZpY2VzIFByb2plY3QKLUNYRl9GQUNFVF9KU1RfV0VCMjRfUFJFU0VUX0xBQkVMPUNYRiBXZWIgU2VydmljZXMgUHJvamVjdCB2Mi40Ci1DWEZfRkFDRVRfSlNUX1dFQjI1X1BSRVNFVF9MQUJFTD1DWEYgV2ViIFNlcnZpY2VzIFByb2plY3QgdjIuNQotQ1hGX0ZBQ0VUX0pTVF9XRUIyNF9QUkVTRVRfREVTQ1JJUFRJT049Q29uZmlndXJlcyBhIER5bmFtaWMgV2ViIFByb2plY3Qgd2l0aCBDWEYgdXNpbmcgV2ViIE1vZHVsZSB2Mi40IGFuZCBKYXZhIHY1LjAKLUNYRl9GQUNFVF9KU1RfV0VCMjVfUFJFU0VUX0RFU0NSSVBUSU9OPUNvbmZpZ3VyZXMgYSBEeW5hbWljIFdlYiBQcm9qZWN0IHdpdGggQ1hGIHVzaW5nIFdlYiBNb2R1bGUgdjIuNSBhbmQgSmF2YSB2NS4wCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlMTgyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgIDxwYWNrYWdlIAotICAgICAgICAgIHVyaSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC5lY29yZSIgCi0gICAgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UiCi0gICAgICAgICAgZ2VuTW9kZWwgPSAibW9kZWwvQ1hGLmdlbm1vZGVsIiAvPiAKLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAgICAgIDxwcm9qZWN0LWZhY2V0IGlkPSJjeGYuY29yZSI+Ci0gICAgICAgICAgPGxhYmVsPiVDWEZfRkFDRVRfQ09SRV9MQUJFTDwvbGFiZWw+Ci0JICAgICAgPGRlc2NyaXB0aW9uPiVDWEZfRkFDRVRfQ09SRV9ESVNDUklQVElPTjwvZGVzY3JpcHRpb24+Ci0JICAgPC9wcm9qZWN0LWZhY2V0PgotICAgICAgIAotCSAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImN4Zi5jb3JlIiB2ZXJzaW9uPSIxLjAiPgotCSAgICAgIDxjb25zdHJhaW50PgotCQkgICAgIDxhbmQ+Ci0gICAgICAJICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC53ZWIiIHZlcnNpb249IlsyLjUiLz4KLSAgICAgIAkgICAgICAgIDxyZXF1aXJlcyBmYWNldD0ianN0LmphdmEiIHZlcnNpb249Ils1LjAiLz4KLSAgICAgICAgICAgICAgICA8Y29uZmxpY3RzIGZhY2V0PSJheGlzMi5jb3JlIiB2ZXJzaW9uPSJbMS4wIi8+Ci0gICAgICAgICAgICAgICAgPGNvbmZsaWN0cyBmYWNldD0iYXhpczIuZXh0IiB2ZXJzaW9uPSJbMS4wIi8+Ci0gICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgPC9jb25zdHJhaW50PgotICAgICAgICAgIAotICAgICAgICAgIDxhY3Rpb24gaWQ9ImN4Zi5jb3JlLmluc3RhbGwiIHR5cGU9IklOU1RBTEwiPgotICAgICAgCSAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmZhY2V0LkNYRkZhY2V0SW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgICAgICAgICAgPGNvbmZpZy1mYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmZhY2V0LkNYRkZhY2V0SW5zdGFsbEFjdGlvbkNvbmZpZ0ZhY3RvcnkiLz4KLSAgICAJICA8L2FjdGlvbj4KLSAgICAgICAgICAKLSAgICAgICAgICA8YWN0aW9uIGlkPSJjeGYuY29yZS51bmluc3RhbGwiIHR5cGU9IlVOSU5TVEFMTCI+Ci0gICAgICAgICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmZhY2V0LkNYRkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgICAgICA8L2FjdGlvbj4KLSAgCSAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotICAgICAgIDx0ZW1wbGF0ZSBpZD0idGVtcGxhdGUuY3hmLmNvcmUiPgotICAgICAgICAgIDxsYWJlbD4lQ1hGX0NPUkVfVEVNUExBVEVfTEFCRUw8L2xhYmVsPgotICAgICAgICAgIDxmaXhlZAotICAgICAgICAgICAgICAgZmFjZXQ9ImN4Zi5jb3JlIj4KLSAgICAgICAgICA8L2ZpeGVkPgotICAgICAgICAgIDxmaXhlZAotICAgICAgICAgICAgICAgZmFjZXQ9ImpzdC53ZWIiPgotICAgICAgICAgIDwvZml4ZWQ+Ci0gICAgICAgICAgPGZpeGVkCi0gICAgICAgICAgICAgICBmYWNldD0ianN0LmphdmEiPgotICAgICAgICAgIDwvZml4ZWQ+Ci0gICAgICAgICAgPHByZXNldAotICAgICAgICAgICAgIGlkPSJjeGYuanN0LndlYjI1LnByZXNldCI+Ci0gICAgICAgICAgPC9wcmVzZXQ+Ci0gICAgICAgPC90ZW1wbGF0ZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0gICAgICAgPHN1cHBvcnRlZD4KLSAgICAgICAgICA8cnVudGltZS1jb21wb25lbnQgYW55PSJ0cnVlIi8+Ci0gICAgICAgICAgPGZhY2V0Ci0gICAgICAgICAgICAgaWQ9ImN4Zi5jb3JlIgotICAgICAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgICAgIDwvc3VwcG9ydGVkPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJlc2V0cyI+Ci0gICAgICAgPHN0YXRpYy1wcmVzZXQgaWQ9ImN4Zi5qc3Qud2ViMjUucHJlc2V0Ij4KLSAgICAgICAgICA8bGFiZWw+JUNYRl9GQUNFVF9KU1RfV0VCMjVfUFJFU0VUX0xBQkVMPC9sYWJlbD4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+JUNYRl9GQUNFVF9KU1RfV0VCMjVfUFJFU0VUX0RFU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICA8ZmFjZXQKLSAgICAgICAgICAgICBpZD0iY3hmLmNvcmUiCi0gICAgICAgICAgICAgdmVyc2lvbj0iMS4wIj4KLSAgICAgICAgICA8L2ZhY2V0PgotICAgICAgICAgIDxmYWNldAotICAgICAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgICAgIHZlcnNpb249IjIuNSI+Ci0gICAgICAgICAgPC9mYWNldD4KLSAgICAgICAgICA8ZmFjZXQKLSAgICAgICAgICAgICBpZD0ianN0LmphdmEiCi0gICAgICAgICAgICAgdmVyc2lvbj0iNS4wIj4KLSAgICAgICAgICA8L2ZhY2V0PgotICAgICAgIDwvc3RhdGljLXByZXNldD4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciI+Ci0gICAgICAgPGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLkNYRl9DTEFTU1BBVEhfQ09OVEFJTkVSIj4KLSAgICAgICA8L2NsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyPgotICAgIDwvZXh0ZW5zaW9uPiAgICAKLSAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDbGFzc3BhdGhDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOGM4NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDbGFzc3BhdGhDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGw7Ci0KLXB1YmxpYyBjbGFzcyBDWEZDbGFzc3BhdGhDb250YWluZXIgaW1wbGVtZW50cyBJQ2xhc3NwYXRoQ29udGFpbmVyIHsKLQotICAgIHByaXZhdGUgSVBhdGggcGF0aDsKLSAgICBwcml2YXRlIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBjbGFzc3BhdGhFbnRyaWVzOwotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBpbnN0YWxsZWQ7Ci0KLSAgICBwdWJsaWMgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyKElQYXRoIHBhdGgsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotICAgICAgICB0aGlzLnBhdGggPSBwYXRoOwotICAgICAgICB0aGlzLnByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIGNsYXNzcGF0aEVudHJpZXMgPSAgbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKSB7Ci0gICAgICAgIGlmICghaW5zdGFsbGVkLmVxdWFscyhDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDWEZSdW50aW1lVmVyc2lvbihwcm9qZWN0KSkpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aEVudHJpZXMuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbGFzc3BhdGhFbnRyaWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICBGaWxlIGN4ZkxpYkRpcmVjdG9yeSA9IGdldENYRkxpYnJhcnlEaXJlY3RvcnkoKTsKLSAgICAgICAgICAgIGlmIChjeGZMaWJEaXJlY3RvcnkuZXhpc3RzKCkgJiYgY3hmTGliRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGN4ZkxpYkRpcmVjdG9yeS5saXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShjeGZMaWJEaXJlY3RvcnkuZ2V0UGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUuaW5kZXhPZigiLiIpICE9IC0xIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKSwgZmlsZU5hbWUubGVuZ3RoKCkpLmVxdWFscyggLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoRW50cmllcy5hZGQoSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGF0aCgiLyIpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NwYXRoRW50cmllcy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbY2xhc3NwYXRoRW50cmllcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBpZiAoZ2V0Q3hmUnVudGltZUxvY2F0aW9uKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBGaWxlIGN4ZkxpYkRpcmVjdG9yeSA9IGdldENYRkxpYnJhcnlEaXJlY3RvcnkoKTsKLSAgICAgICAgICAgIHJldHVybiBjeGZMaWJEaXJlY3RvcnkuZXhpc3RzKCkgJiYgY3hmTGliRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAgTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ1hGQ29yZU1lc3NhZ2VzLkNYRl9DT05UQUlORVJfTElCUkFSWSwgZ2V0Q3hmUnVudGltZVR5cGUoKSwKLSAgICAgICAgICAgICAgICBnZXRDeGZSdW50aW1lVmVyc2lvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0gICAgICAgIHJldHVybiBLX0FQUExJQ0FUSU9OOwotICAgIH0KLQotICAgIHB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRkluc3RhbGwgZ2V0Q3hmSW5zdGFsbCgpIHsKLSAgICAgICAgU3RyaW5nIGluc3RhbGxlZCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENYRlJ1bnRpbWVWZXJzaW9uKHByb2plY3QpOwotICAgICAgICB0aGlzLmluc3RhbGxlZCA9IGluc3RhbGxlZDsKLSAgICAgICAgQ1hGQ29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAgICAgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsID0gY29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkuZ2V0KGluc3RhbGxlZCk7Ci0gICAgICAgIHJldHVybiBjeGZJbnN0YWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEN4ZlJ1bnRpbWVMb2NhdGlvbigpIHsKLSAgICAgICAgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsID0gZ2V0Q3hmSW5zdGFsbCgpOwotICAgICAgICBpZiAoY3hmSW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3hmSW5zdGFsbC5nZXRMb2NhdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEN4ZlJ1bnRpbWVWZXJzaW9uKCkgewotICAgICAgICBDWEZJbnN0YWxsIGN4Zkluc3RhbGwgPSBnZXRDeGZJbnN0YWxsKCk7Ci0gICAgICAgIGlmIChjeGZJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjeGZJbnN0YWxsLmdldFZlcnNpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEN4ZlJ1bnRpbWVUeXBlKCkgewotICAgICAgICBDWEZJbnN0YWxsIGN4Zkluc3RhbGwgPSBnZXRDeGZJbnN0YWxsKCk7Ci0gICAgICAgIGlmIChjeGZJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjeGZJbnN0YWxsLmdldFR5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmdldERlZmF1bHRSdW50aW1lVHlwZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZSBnZXRDWEZMaWJyYXJ5RGlyZWN0b3J5KCkgewotICAgICAgICBJUGF0aCBjeGZMaWJQYXRoID0gbmV3IFBhdGgoZ2V0Q3hmUnVudGltZUxvY2F0aW9uKCkpOwotICAgICAgICBpZiAoIWN4ZkxpYlBhdGguaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgY3hmTGliUGF0aCA9IGN4ZkxpYlBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICBjeGZMaWJQYXRoID0gY3hmTGliUGF0aC5hcHBlbmQoImxpYiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgRmlsZSBjeGZMaWJEaXJlY3RvcnkgPSBuZXcgRmlsZShjeGZMaWJQYXRoLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBjeGZMaWJEaXJlY3Rvcnk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U5NDZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLQotcHVibGljIGNsYXNzIENYRkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIGV4dGVuZHMgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyIGN4ZkNsYXNzcGF0aENvbnRhaW5lciA9IG5ldyBDWEZDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3QpOwotCi0gICAgICAgIGlmIChjeGZDbGFzc3BhdGhDb250YWluZXIuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgbmV3IElKYXZhUHJvamVjdFtdIHsgamF2YVByb2plY3QgfSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7IGN4ZkNsYXNzcGF0aENvbnRhaW5lciB9LCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNhblVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcihJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwKLSAgICAgICAgICAgIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyU3VnZ2VzdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgbmV3IElKYXZhUHJvamVjdFtdIHtqYXZhUHJvamVjdH0sCi0gICAgICAgICAgICAgICAgbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7IGNvbnRhaW5lclN1Z2dlc3Rpb24gfSwgbnVsbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2NTkyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIENYRkNvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX0ZBQ0VUX0lOU1RBTExfREVMRUdBVEVfUlVOVElNRV9MT0NBVElPTl9OT1RfU0VUOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX0NPTlRBSU5FUl9MSUJSQVJZOwotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENYRkNvcmVNZXNzYWdlcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZDb3JlTWVzc2FnZXMoKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkYWE3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNKRFRVdGlscwotQ1hGX0ZBQ0VUX0lOU1RBTExfREVMRUdBVEVfUlVOVElNRV9MT0NBVElPTl9OT1RfU0VUPUNYRiBSdW50aW1lIGxvY2F0aW9uIG5vdCBzZXQuIFBsZWFzZSBzZXQgbG9jYXRpb24gaW4gUHJlZmVyZW5jZXMgPiBXZWIgU2VydmljZXMgPiBDWGYgMi54IFByZWZlcmVuY2VzCi1DWEZfQ09OVEFJTkVSX0xJQlJBUlk9ezB9IExpYnJhcnkgW3sxfV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjMxZWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0LkphdmEyV1NQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5XU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1hGQ29yZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0gICAgLy8gVGhlIHBsdWctaW4gSUQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy9DWEYgQ2xhc3NwYXRoIGNvbnRhaW5lciBJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENYRl9DTEFTU1BBVEhfQ09OVEFJTkVSX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS5DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENYRl9WRVJTSU9OXzJfMCA9ICIyLjAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDWEZfVkVSU0lPTl8yXzEgPSAiMi4xIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRkNvcmVQbHVnaW4gcGx1Z2luOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgamF2YTJXU0NvbnRleHQ7Ci0gICAgcHJpdmF0ZSBXU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dCB3c2RsMkphdmFDb250ZXh0OwotCi0gICAgcHJpdmF0ZSBWZXJzaW9uIGN1cnJlbnRSdW50aW1lVmVyc2lvbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBDWEZDb3JlUGx1Z2luKCkgewotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENYRkNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0IGdldEphdmEyV1NDb250ZXh0KCkgewotICAgICAgICBpZiAoamF2YTJXU0NvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgamF2YTJXU0NvbnRleHQgPSBuZXcgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0KCk7Ci0gICAgICAgICAgICBqYXZhMldTQ29udGV4dC5sb2FkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGphdmEyV1NDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBXU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dCBnZXRXU0RMMkphdmFDb250ZXh0KCkgewotICAgICAgICBpZiAod3NkbDJKYXZhQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3c2RsMkphdmFDb250ZXh0ID0gbmV3IFdTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0KCk7Ci0gICAgICAgICAgICB3c2RsMkphdmFDb250ZXh0LmxvYWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVyc2lvbiBnZXRDdXJyZW50UnVudGltZVZlcnNpb24oKSB7Ci0gICAgICAgIC8vaWYgKGN1cnJlbnRSdW50aW1lVmVyc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgIFN0cmluZyBjeGZSdW50aW1lVmVyc2lvbiA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCk7Ci0gICAgICAgIGlmIChjeGZSdW50aW1lVmVyc2lvbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBjeGZSdW50aW1lVmVyc2lvbiA9ICIwLjAuMCI7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5jdXJyZW50UnVudGltZVZlcnNpb24gPSBuZXcgVmVyc2lvbihjeGZSdW50aW1lVmVyc2lvbik7Ci0gICAgICAgIC8vfQotICAgICAgICByZXR1cm4gY3VycmVudFJ1bnRpbWVWZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRSdW50aW1lVmVyc2lvbihWZXJzaW9uIHZlcnNpb24pIHsKLSAgICAgICAgdGhpcy5jdXJyZW50UnVudGltZVZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENYRlJ1bnRpbWVWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjeGZSdW50aW1lVmVyc2lvbikgewotICAgICAgICBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpOwotICAgICAgICBwcmVmcy5wdXQoUExVR0lOX0lEICsgIi5ydW50aW1lLnZlcnNpb24iLCBjeGZSdW50aW1lVmVyc2lvbik7Ci0gICAgICAgIGZsdXNoKHByZWZzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENYRlJ1bnRpbWVWZXJzaW9uKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKLSAgICAgICAgcmV0dXJuIHByZWZzLmdldChQTFVHSU5fSUQgKyAiLnJ1bnRpbWUudmVyc2lvbiIsCi0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmbHVzaChJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcmVmcy5mbHVzaCgpOwotICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gYnNlKSB7Ci0gICAgICAgICAgICBsb2coYnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgQ1hGIHByZWZlcmVuY2VzIGZvciB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUVjbGlwc2VQcmVmZXJlbmNlcyBnZXRQcm9qZWN0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpOwotICAgICAgICByZXR1cm4gY29udGV4dC5nZXROb2RlKFBMVUdJTl9JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgZXhjZXB0aW9uLnRvU3RyaW5nKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9DWEZQZXJzaXN0ZW50Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9jb250ZXh0L0NYRlBlcnNpc3RlbnRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMDkyOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9jb250ZXh0L0NYRlBlcnNpc3RlbnRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ1hGUGVyc2lzdGVudENvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dCBpbXBsZW1lbnRzIENYRkNvbnRleHQgewotICAgIHByaXZhdGUgTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4gaW5zdGFsbGF0aW9uczsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgQ1hGIHJ1bnRpbWUgbG9jYXRpb24gZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04gPSAiZGVmYXVsdFJ1bnRpbWVMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgQ1hGIHJ1bnRpbWUgdHlwZSBnZW5lcmFsIHByZWZlcmVuY2UgZnJvbQotICAgICAqIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0RFRkFVTFRfUlVOVElNRV9UWVBFID0gImRlZmF1bHRSdW50aW1lVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgQ1hGIHZlcnNpb24gZ2VuZXJhbCBwcmVmZXJlbmNlIGZyb20KLSAgICAgKiB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTiA9ICJkZWZhdWx0UnVudGltZVZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DWEZfUlVOVElNRV9WRVJTSU9OUyA9ICJjeGZSdW50aW1lVmVyc2lvbnMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfTE9DQVRJT05TID0gImN4ZlJ1bnRpbWVMb2NhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfVFlQRVMgPSAiY3hmUnVudGltZVR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSID0gImV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NYRl9WRVJCT1NFID0gImN4ZlZlcmJvc2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DWEZfVVNFX1NQUklOR19BUFBfQ09OVEVYVCA9ICJjeGZVc2VTcHJpbmdBcHBDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIENYRlBlcnNpc3RlbnRDb250ZXh0KFBsdWdpbiBwbHVnaW4pIHsKLSAgICAgICAgc3VwZXIoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB7Ci0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04sICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfREVGQVVMVF9SVU5USU1FX1RZUEUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfREVGQVVMVF9SVU5USU1FX1ZFUlNJT04sICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9DWEZfUlVOVElNRV9WRVJTSU9OUywgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9DWEZfUlVOVElNRV9MT0NBVElPTlMsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfVFlQRVMsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhULCBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQ1hGX1ZFUkJPU0UsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkNYRl9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX1ZFUkJPU0UpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQ1hGX1VTRV9TUFJJTkdfQVBQX0NPTlRFWFQsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhULCBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4gZ2V0SW5zdGFsbGF0aW9ucygpIHsKLSAgICAgICAgaWYgKGluc3RhbGxhdGlvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5zdGFsbGF0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4oKTsKLSAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9ucyA9IGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9DWEZfUlVOVElNRV9WRVJTSU9OUykudHJpbSgpOwotICAgICAgICAgICAgU3RyaW5nIGxvY3Rpb25zID0gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0NYRl9SVU5USU1FX0xPQ0FUSU9OUykudHJpbSgpOwotICAgICAgICAgICAgU3RyaW5nIHR5cGVzID0gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0NYRl9SVU5USU1FX1RZUEVTKS50cmltKCk7Ci0gICAgICAgICAgICBpZiAodmVyc2lvbnMudHJpbSgpLmxlbmd0aCgpID4gMCAmJiBsb2N0aW9ucy50cmltKCkubGVuZ3RoKCkgPiAwICYmIHR5cGVzLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjeGZWZXJzaW9ucyA9IHZlcnNpb25zLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gY3hmTG9jYXRpb25zID0gbG9jdGlvbnMuc3BsaXQoIiwiKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjeGZUeXBlcyA9IHR5cGVzLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjeGZWZXJzaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBDWEZJbnN0YWxsIGN4Zkluc3RhbGwgPSBDWEZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDWEZJbnN0YWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgIGN4Zkluc3RhbGwuc2V0VmVyc2lvbihjeGZWZXJzaW9uc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGN4Zkluc3RhbGwuc2V0TG9jYXRpb24oY3hmTG9jYXRpb25zW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgY3hmSW5zdGFsbC5zZXRUeXBlKGN4ZlR5cGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9ucy5wdXQoY3hmVmVyc2lvbnNbaV0sIGN4Zkluc3RhbGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5zdGFsbGF0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnN0YWxsYXRpb25zKE1hcDxTdHJpbmcsIENYRkluc3RhbGw+IGluc3RhbGxhdGlvbnMpIHsKLSAgICAgICAgdGhpcy5pbnN0YWxsYXRpb25zID0gaW5zdGFsbGF0aW9uczsKLQotICAgICAgICBDb2xsZWN0aW9uPENYRkluc3RhbGw+IGluc3RhbGxzID0gaW5zdGFsbGF0aW9ucy52YWx1ZXMoKTsKLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHZlcnNpb25zID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBsb2NhdGlvbnMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIHR5cGVzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgSXRlcmF0b3I8Q1hGSW5zdGFsbD4gaW5zdGFsbEl0ZXIgPSBpbnN0YWxscy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW5zdGFsbEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBDWEZJbnN0YWxsIGN4Zkluc3RhbGwgPSBpbnN0YWxsSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB2ZXJzaW9ucy5hcHBlbmQoY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgbG9jYXRpb25zLmFwcGVuZChjeGZJbnN0YWxsLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgdHlwZXMuYXBwZW5kKGN4Zkluc3RhbGwuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGlmIChpbnN0YWxsSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICB2ZXJzaW9ucy5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgICAgICBsb2NhdGlvbnMuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICAgICAgdHlwZXMuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9DWEZfUlVOVElNRV9WRVJTSU9OUywgdmVyc2lvbnMudG9TdHJpbmcoKSk7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfTE9DQVRJT05TLCBsb2NhdGlvbnMudG9TdHJpbmcoKSk7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfVFlQRVMsIHR5cGVzLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRSdW50aW1lTG9jYXRpb24oU3RyaW5nIHJ1bnRpbWVMb2NhdGlvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTiwgcnVudGltZUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9ERUZBVUxUX1JVTlRJTUVfVFlQRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKFN0cmluZyBydW50aW1lRWRpdGlvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0RFRkFVTFRfUlVOVElNRV9UWVBFLCBydW50aW1lRWRpdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfREVGQVVMVF9SVU5USU1FX1ZFUlNJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRSdW50aW1lVmVyc2lvbihTdHJpbmcgcnVudGltZVZlcnNpb24pIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTiwgcnVudGltZVZlcnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcihib29sZWFuIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiwgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0NYRl9WRVJCT1NFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0NYRl9WRVJCT1NFLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfQ1hGX1VTRV9TUFJJTkdfQVBQX0NPTlRFWFQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dChib29sZWFuIHVzZVNwcmluZ0FwcENvbnRleHQpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9DWEZfVVNFX1NQUklOR19BUFBfQ09OVEVYVCwgdXNlU3ByaW5nQXBwQ29udGV4dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9jb250ZXh0L0phdmEyV1NQZXJzaXN0ZW50Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9jb250ZXh0L0phdmEyV1NQZXJzaXN0ZW50Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDIwOTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9KYXZhMldTUGVyc2lzdGVudENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBleHRlbmRzIENYRlBlcnNpc3RlbnRDb250ZXh0IGltcGxlbWVudHMgSmF2YTJXU0NvbnRleHQgewotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIHNvYXAgYmluZGluZyBnZW5lcmFsIHByZWZlcmVuY2UKLSAgICAgKiBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfU09BUDEyX0JJTkRJTkcgPSAiY3hmSjJXU1NvYXAxMkJpbmRpbmciOyAvLyROT04tTkxTLTEkCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBjeGYgZ2VuZXJhdGUgeHNkIGltcG9ydHMgZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1hTRF9JTVBPUlRTID0gImN4ZkoyV1NYU0RJbXBvcnRzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBjeGYgZGVmYXVsdCBmcm9udGVuZCBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19ERUZBVUxUX0ZST05URU5EID0gImN4ZkoyV1NEZWZhdWx0RnJvbnRlbmQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiBkZWZhdWx0IERhdGFiaW5kaW5nIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX0RFRkFVTFRfREFUQUJJTkRJTkcgPSAiY3hmSjJXU0RlZmF1bHREYXRhYmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIGdlbmVyYXRlIGNsaWVudCBnZW5lcmFsIHByZWZlcmVuY2UKLSAgICAgKiBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9DTElFTlQgPSAiY3hmSjJXU0dlbmVyYXRlQ2xpZW50IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBjeGYgZ2VuZXJhdGUgc2VydmVyIGdlbmVyYWwgcHJlZmVyZW5jZQotICAgICAqIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1NFUlZFUiA9ICJjeGZKMldTR2VuZXJhdGVTZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiBnZW5lcmF0ZSB3cmFwcGVyIGFuZCBmYXVsdCBiZWFucwotICAgICAqIGdlbmVyYWwgcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TID0gImN4ZkoyV1NHZW5lcmF0ZVdyYXBwZXJGYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIGdlbmVyYXRlIHdzZGwgZ2VuZXJhbCBwcmVmZXJlbmNlCi0gICAgICogZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfV1NETCA9ICJjeGZKMldTR2VuZXJhdGVXU0RMIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBjeGYgZ2VuZXJhdGUgYW50IGJ1aWxkIGZpbGUgZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSAiY3hmSjJXU0dlbmVyYXRlQU5UQnVpbGRGaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBBUFQgYW5ub3RhdGlvbiBwcm9jZXNzaW5nIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkcKLSAgICA9ICJjeGZKMldTRW5hYmxlQW5ub3RhdGlvblByb2Nlc3NpbmciOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGdlbmVyYXRlIDxjb2RlPkBXZWJNZXRob2Q8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTgotICAgID0gImN4ZkoyV1NHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGdlbmVyYXRlIDxjb2RlPkBXZWJQYXJhbTwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04KLSAgICA9ICJjeGZKMldTR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGdlbmVyYXRlIDxjb2RlPkBSZXF1ZXN0V3JhcHBlcjwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04KLSAgICA9ICJjeGZKMldTR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGdlbmVyYXRlIDxjb2RlPkBSZXNwb25zZVdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTgotICAgID0gImN4ZkoyV1NHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0KCkgewotICAgICAgICBzdXBlcihDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbG9hZCgpIHsKLSAgICAgICAgc3VwZXIubG9hZCgpOwotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19TT0FQMTJfQklORElORywgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19TT0FQMTJfQklORElORykpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1hTRF9JTVBPUlRTLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9EQVRBQklORElORywgRGF0YUJpbmRpbmcuSkFYQi5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9KMldTX0RFRkFVTFRfRlJPTlRFTkQsIEZyb250ZW5kLkpBWFdTLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfQ0xJRU5ULCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfU0VSVkVSLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUywgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfV1NETCwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XU0RMKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lORywgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRCkpOwotCi0gICAgICAgIC8vVE9ETyBNT1ZFIFRIRSBGT0xMT1dJTkcgNAotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTikpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTiwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTikpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTiwgQ1hGTW9kZWxVdGlscwotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04pKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTb2FwMTJCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9KMldTX1NPQVAxMl9CSU5ESU5HKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb2FwMTJCaW5kaW5nKGJvb2xlYW4gc29hcDEyQmluZGluZykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfU09BUDEyX0JJTkRJTkcsIHNvYXAxMkJpbmRpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVYU0RJbXBvcnRzKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1hTRF9JTVBPUlRTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVhTREltcG9ydHMoYm9vbGVhbiBnZW5lcmF0ZVhTREltcG9ydHMpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1hTRF9JTVBPUlRTLCBnZW5lcmF0ZVhTREltcG9ydHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhQmluZGluZyBnZXREYXRhYmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIERhdGFCaW5kaW5nLmdldChnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfSjJXU19ERUZBVUxUX0RBVEFCSU5ESU5HKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YWJpbmRpbmcoRGF0YUJpbmRpbmcgZGF0YUJpbmRpbmcpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9KMldTX0RFRkFVTFRfREFUQUJJTkRJTkcsIGRhdGFCaW5kaW5nLmdldExpdGVyYWwoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEZyb250ZW5kIGdldEZyb250ZW5kKCkgewotICAgICAgICByZXR1cm4gRnJvbnRlbmQuZ2V0KGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9KMldTX0RFRkFVTFRfRlJPTlRFTkQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9udGVuZChGcm9udGVuZCBkZWZhdWx0RnJvbnRlbmQpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9KMldTX0RFRkFVTFRfRlJPTlRFTkQsIGRlZmF1bHRGcm9udGVuZC5nZXRMaXRlcmFsKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfQ0xJRU5UKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUNsaWVudChib29sZWFuIGdlbmVyYXRlQ2xpZW50KSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9DTElFTlQsIGdlbmVyYXRlQ2xpZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlU2VydmVyKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1NFUlZFUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVTZXJ2ZXIoYm9vbGVhbiBnZW5lcmF0ZVNlcnZlcikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfU0VSVkVSLCBnZW5lcmF0ZVNlcnZlcik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoYm9vbGVhbiBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TLCBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlV1NETCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9XU0RMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdTREwoYm9vbGVhbiBnZW5lcmF0ZVdTREwpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1dTREwsIGdlbmVyYXRlV1NETCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9BTlRfQlVJTERfRklMRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVBbnRCdWlsZEZpbGUoYm9vbGVhbiBnZW5lcmF0ZUFudEJ1aWxkRmlsZSkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUsIGdlbmVyYXRlQW50QnVpbGRGaWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfSjJXU19FTkFCTEVfQU5OT1RBVElPTl9QUk9DRVNTSU5HKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oYm9vbGVhbiBnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OLCBnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKGJvb2xlYW4gZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OLCBnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZChib29sZWFuIGVuYWJsZUFubm90YXRpb25Qcm9jZXNzaW5nKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19FTkFCTEVfQU5OT1RBVElPTl9QUk9DRVNTSU5HLCBlbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKGJvb2xlYW4gZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24pIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTiwgZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbihib29sZWFuIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTiwgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2NvbnRleHQvV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9XU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODJkM2YxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9XU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5Gcm9udGVuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dCBleHRlbmRzIENYRlBlcnNpc3RlbnRDb250ZXh0IGltcGxlbWVudHMgV1NETDJKYXZhQ29udGV4dCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQ0xJRU5UID0gImN4ZlcySkdlbmVyYXRlQ2xpZW50IjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX1NFUlZFUiA9ICJjeGZXMkpHZW5lcmF0ZVNlcnZlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9JTVBMRU1FTlRBVElPTiA9ICJjeGZXMkpHZW5lcmF0ZUltcGxlbWVudGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFID0gImN4ZlcySkdlbmVyYXRlQW50QnVpbGRGaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfUFJPQ0VTU19TT0FQX0hFQURFUlMgPSAiY3hmVzJKUHJvY2Vzc1NPQVBIZWFkZXJzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRU5BTUVfTUFQUElORyAKLSAgICAgICAgPSAiY3hmVzJKTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlbmFtZU1hcHBpbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVTUEFDRV9NQVBQSU5HIAotICAgICAgICA9ICJjeGZXMkpMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX1ZBTElEQVRFX1dTREwgPSAiY3hmVzJKVmFsaWRhdGVXU0RMIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfREFUQUJJTkRJTkcgPSAiY3hmVzJKRGF0YWJpbmRpbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfRlJPTlRFTkQgPSAiY3hmVzJKRnJvbnRlbmQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfV1NETF9WRVJTSU9OID0gImN4ZlcySldTRExWZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX1hKQ19BUkdTID0gImN4ZlcySlhKQ0FyZ3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfTk9fQUREUkVTU19CSU5ESU5HID0gImN4ZlcySk5vQWRkcmVzc0JpbmRpbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfVVNFX0RFRkFVTFRfVkFMVUVTID0gImN4ZlcySlVzZURlZmF1bHRWYWx1ZXMiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfQVVUT19OQU1FX1JFU09MVVRJT04gPSAiY3hmVzJKQXV0b05hbWVSZXNvbHV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUyA9ICJ4amNVc2VEZWZhdWx0VmFsdWVzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19UT19TVFJJTkcgPSAieGpjVG9TdHJpbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RPX1NUUklOR19NVUxUSSA9ICJ4amNUb1N0cmluZ011bHRpIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19UT19TVFJJTkdfU0lNUExFID0gInhqY1RvU3RyaW5nU2ltcGxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19MT0NBVE9SID0gInhqY0xvY2F0b3IiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1NZTkNfTUVUSE9EUyA9ICJ4amNTeW5jTWV0aG9kcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfTUFSS19HRU5FUkFURUQgPSAieGpjTWFya0dlbmVyYXRlZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfRVBJU09ERV9GSUxFID0gInhqY0VwaXNvZGVGaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIFdTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0KCkgewotICAgICAgICBzdXBlcihDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbG9hZCgpIHsKLSAgICAgICAgc3VwZXIubG9hZCgpOwotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0NMSUVOVCwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVCkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfU0VSVkVSLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9JTVBMRU1FTlRBVElPTiwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT04pKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX1hKQ19BUkdTLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX1BST0NFU1NfU09BUF9IRUFERVJTLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUykpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFTkFNRV9NQVBQSU5HLCBDWEZNb2RlbFV0aWxzCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORykpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVTUEFDRV9NQVBQSU5HLCBDWEZNb2RlbFV0aWxzCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9WQUxJREFURV9XU0RMLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19WQUxJREFURSkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfREFUQUJJTkRJTkcsIERhdGFCaW5kaW5nLkpBWEIuZ2V0TGl0ZXJhbCgpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX0ZST05URU5ELCBGcm9udGVuZC5KQVhXUy5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfV1NETF9WRVJTSU9OLCBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1dzZGxWZXJzaW9uKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX05PX0FERFJFU1NfQklORElORywgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTk9fQUREUkVTU19CSU5ESU5HKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9VU0VfREVGQVVMVF9WQUxVRVMsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUykpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfQVVUT19OQU1FX1JFU09MVVRJT04sIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChYSkNfVVNFX0RFRkFVTFRfVkFMVUVTLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChYSkNfVE9fU1RSSU5HLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkcpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFhKQ19UT19TVFJJTkdfTVVMVEksIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChYSkNfVE9fU1RSSU5HX1NJTVBMRSwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRSkpOwotCi0gICAgICAgIHNldERlZmF1bHQoWEpDX0xPQ0FUT1IsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0xPQ0FUT1IpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFhKQ19TWU5DX01FVEhPRFMsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1NZTkNfTUVUSE9EUykpOwotCi0gICAgICAgIHNldERlZmF1bHQoWEpDX01BUktfR0VORVJBVEVELCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19NQVJLX0dFTkVSQVRFRCkpOwotCi0gICAgICAgIHNldERlZmF1bHQoWEpDX0VQSVNPREVfRklMRSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUFudEJ1aWxkRmlsZShib29sZWFuIGdlbmVyYXRlQW50QnVpbGRGaWxlKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFLCBnZW5lcmF0ZUFudEJ1aWxkRmlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUNsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0NMSUVOVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVDbGllbnQoYm9vbGVhbiBnZW5lcmF0ZUNsaWVudCkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9DTElFTlQsIGdlbmVyYXRlQ2xpZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9JTVBMRU1FTlRBVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihib29sZWFuIGdlbmVyYXRlSW1wbGVtZW50YXRpb24pIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfSU1QTEVNRU5UQVRJT04sIGdlbmVyYXRlSW1wbGVtZW50YXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVTZXJ2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9TRVJWRVIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VydmVyKGJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXIpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfU0VSVkVSLCBnZW5lcmF0ZVNlcnZlcik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRU5BTUVfTUFQUElORyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoYm9vbGVhbiBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VOQU1FX01BUFBJTkcsCi0gICAgICAgICAgICAgICAgbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGJvb2xlYW4gbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVTUEFDRV9NQVBQSU5HLCBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9jZXNzU09BUEhlYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9QUk9DRVNTX1NPQVBfSEVBREVSUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKGJvb2xlYW4gcHJvY2Vzc1NvYXBIZWFkZXJzKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX1BST0NFU1NfU09BUF9IRUFERVJTLCBwcm9jZXNzU29hcEhlYWRlcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9WQUxJREFURV9XU0RMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZShib29sZWFuIHZhbGlkYXRlKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX1ZBTElEQVRFX1dTREwsIHZhbGlkYXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0YUJpbmRpbmcgZ2V0RGF0YWJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBEYXRhQmluZGluZy5nZXQoZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX1cySl9EQVRBQklORElORykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGFiaW5kaW5nKERhdGFCaW5kaW5nIGRhdGFCaW5kaW5nKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX0RBVEFCSU5ESU5HLCBkYXRhQmluZGluZy5nZXRMaXRlcmFsKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBGcm9udGVuZCBnZXRGcm9udGVuZCgpIHsKLSAgICAgICAgcmV0dXJuIEZyb250ZW5kLmdldChnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfVzJKX0ZST05URU5EKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnJvbnRlbmQoRnJvbnRlbmQgZnJvbnRlbmQpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfRlJPTlRFTkQsIGZyb250ZW5kLmdldExpdGVyYWwoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRXc2RsVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9XMkpfV1NETF9WRVJTSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsVmVyc2lvbihTdHJpbmcgd3NkbFZlcnNpb24pIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfV1NETF9WRVJTSU9OLCB3c2RsVmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRYamNBcmdzKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX1cySl9YSkNfQVJHUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjQXJncyhTdHJpbmcgeGpjQXJncykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9YSkNfQVJHUywgeGpjQXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOb0FkZHJlc3NCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfTk9fQUREUkVTU19CSU5ESU5HKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROb0FkZHJlc3NCaW5kaW5nKGJvb2xlYW4gbm9BZGRyZXNzQmluZGluZykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9OT19BRERSRVNTX0JJTkRJTkcsIG5vQWRkcmVzc0JpbmRpbmcpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9OYW1lUmVzb2x1dGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX0FVVE9fTkFNRV9SRVNPTFVUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvTmFtZVJlc29sdXRpb24oYm9vbGVhbiBhdXRvTmFtZVJlc29sdXRpb24pIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfQVVUT19OQU1FX1JFU09MVVRJT04sIGF1dG9OYW1lUmVzb2x1dGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VEZWZhdWx0VmFsdWVzKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfVVNFX0RFRkFVTFRfVkFMVUVTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VEZWZhdWx0VmFsdWVzKGJvb2xlYW4gdXNlRGVmYXVsdFZhbHVlcykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9VU0VfREVGQVVMVF9WQUxVRVMsIHVzZURlZmF1bHRWYWx1ZXMpOwotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjVXNlRGVmYXVsdFZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFhKQ19VU0VfREVGQVVMVF9WQUxVRVMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1VzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiB1c2VYSkNEZWZhdWx0VmFsdWVzKSB7Ci0gICAgICAgIHNldFZhbHVlKFhKQ19VU0VfREVGQVVMVF9WQUxVRVMsIHVzZVhKQ0RlZmF1bHRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjVG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihYSkNfVE9fU1RSSU5HKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZyhib29sZWFuIHhqY1RvU3RyaW5nKSB7Ci0gICAgICAgIHNldFZhbHVlKFhKQ19UT19TVFJJTkcsIHhqY1RvU3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oWEpDX1RPX1NUUklOR19NVUxUSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoYm9vbGVhbiB4amNUb1N0cmluZ011bHRpTGluZSkgewotICAgICAgICBzZXRWYWx1ZShYSkNfVE9fU1RSSU5HX01VTFRJLCB4amNUb1N0cmluZ011bHRpTGluZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNUb1N0cmluZ1NpbXBsZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFhKQ19UT19TVFJJTkdfU0lNUExFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZ1NpbXBsZShib29sZWFuIHhqY1RvU3RyaW5nU2ltcGxlKSB7Ci0gICAgICAgIHNldFZhbHVlKFhKQ19UT19TVFJJTkdfU0lNUExFLCB4amNUb1N0cmluZ1NpbXBsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNMb2NhdG9yKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oWEpDX0xPQ0FUT1IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY0xvY2F0b3IoYm9vbGVhbiB4amNMb2NhdG9yKSB7Ci0gICAgICAgIHNldFZhbHVlKFhKQ19MT0NBVE9SLCB4amNMb2NhdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1N5bmNNZXRob2RzKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oWEpDX1NZTkNfTUVUSE9EUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjU3luY01ldGhvZHMoYm9vbGVhbiB4amNTeW5jTWV0aG9kcykgewotICAgICAgICBzZXRWYWx1ZShYSkNfU1lOQ19NRVRIT0RTLCB4amNTeW5jTWV0aG9kcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNNYXJrR2VuZXJhdGVkKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oWEpDX01BUktfR0VORVJBVEVEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNNYXJrR2VuZXJhdGVkKGJvb2xlYW4geGpjTWFya0dlbmVyYXRlZCkgewotICAgICAgICBzZXRWYWx1ZShYSkNfTUFSS19HRU5FUkFURUQsIHhqY01hcmtHZW5lcmF0ZWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WGpjRXBpc29kZUZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFhKQ19FUElTT0RFX0ZJTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY0VwaXNvZGVGaWxlKFN0cmluZyB4amNFcGlzb2RlRmlsZSkgewotICAgICAgICBzZXRWYWx1ZShYSkNfRVBJU09ERV9GSUxFLCB4amNFcGlzb2RlRmlsZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2Vudi9hbnQvQmluZGluZ3NUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9lbnYvYW50L0JpbmRpbmdzVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM2MDA1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2Vudi9hbnQvQmluZGluZ3NUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5lbnYuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ3NUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyIHsKLQotICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBMaXN0PFN0cmluZz4gYmluZGluZ0ZpbGVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBTdHJpbmdbXSBhYnNvbHV0ZVBhdGhzID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdCgiLCIpOwotICAgICAgICBmb3IgKFN0cmluZyBhYnNvdWx1dGVQYXRoIDogYWJzb2x1dGVQYXRocykgewotICAgICAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKGFic291bHV0ZVBhdGgpOwotICAgICAgICAgICAgaWYgKHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwgJiYgcGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJ4bWwiKSkgewotICAgICAgICAgICAgICAgIGJpbmRpbmdGaWxlc0xpc3QuYWRkKGFic291bHV0ZVBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kaW5nRmlsZXNMaXN0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9lbnYvYW50L01hcHBpbmdzVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvZW52L2FudC9NYXBwaW5nc1RyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOGYyZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9lbnYvYW50L01hcHBpbmdzVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuZW52LmFudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIE1hcHBpbmdzVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciB7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aCgoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgSUZpbGUgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgIHByb3BzLmxvYWQocmVzb3VyY2UuZ2V0Q29udGVudHMoKSk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dEFsbChwcm9wcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpICB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyN2UxMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiAKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENYRkNvbnRleHQgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IENYRiBIb21lIERpcmVjdG9yeSBsb2NhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldERlZmF1bHRSdW50aW1lTG9jYXRpb24oU3RyaW5nKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZUxvY2F0aW9uKCkKLSAgICAgKiBAbW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERlZmF1bHRSdW50aW1lTG9jYXRpb24gPGVtPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgZGVmYXVsdCBDWEYgcnVudGltZSBsb2NhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldERlZmF1bHRSdW50aW1lTG9jYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiAgUmV0dXJucyB0aGUgZGVmYXVsdCBDWEYgcnVudGltZSB0eXBlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgUnVudGltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXREZWZhdWx0UnVudGltZVR5cGUoU3RyaW5nKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZVR5cGUoKQotICAgICAqIEBtb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXREZWZhdWx0UnVudGltZVR5cGUgPGVtPkRlZmF1bHQgUnVudGltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IENYRiBydW50aW1lIHR5cGUuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldERlZmF1bHRSdW50aW1lVHlwZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogIFJldHVybnMgdGhlIGRlZmF1bHQgQ1hGIHJ1bnRpbWUgdmVyc2lvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKFN0cmluZykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2dldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkKLSAgICAgKiBAbW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uIDxlbT5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgZGVmYXVsdCBDWEYgcnVudGltZSB2ZXJzaW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXREZWZhdWx0UnVudGltZVZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldERlZmF1bHRSdW50aW1lVmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIGNvbW1lbnRzIGFyZSBzaG93biBkdXJpbmcgdGhlIGNvZGUgZ2VuZXJhdGlvbiBwcm9jZXNzLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNWZXJib3NlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc1ZlcmJvc2UgPGVtPlZlcmJvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIERpc3BsYXlzIGNvbW1lbnRzIGR1cmluZyB0aGUgY29kZSBnZW5lcmF0aW9uIHByb2Nlc3MuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyYm9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNWZXJib3NlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGdlbmVyYXRlIGFuIEFudCBidWlsZC54bWwgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0dlbmVyYXRlQW50QnVpbGRGaWxlIDxlbT5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0IHRvIGdlbmVyYXRlIGFuIEFudCBidWlsZC54bWwgZmlsZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVBbnRCdWlsZEZpbGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gZ2VuZXJhdGUgYSBjbGllbnQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZUNsaWVudCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNHZW5lcmF0ZUNsaWVudCA8ZW0+R2VuZXJhdGUgQ2xpZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTcGVjaWZ5IHRvIGdlbmVyYXRlIGNsaWVudCBzaWRlIGNvZGUuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgQ2xpZW50PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlQ2xpZW50KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZUNsaWVudChib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBnZW5lcmF0ZSBhIHNlcnZlci4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlU2VydmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0dlbmVyYXRlU2VydmVyIDxlbT5HZW5lcmF0ZSBTZXJ2ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNwZWNpZnkgdG8gZ2VuZXJhdGUgc2VydmVyIHNpZGUgY29kZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBTZXJ2ZXI8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVTZXJ2ZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlU2VydmVyKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGF0YSBiaW5kaW5nIHVzZWQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImpheGIiCi0gICAgICovCi0gICAgRGF0YUJpbmRpbmcgZ2V0RGF0YWJpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERhdGFiaW5kaW5nIDxlbT5EYXRhYmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YWJpbmRpbmc8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nCi0gICAgICogQHNlZSAjZ2V0RGF0YWJpbmRpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldERhdGFiaW5kaW5nKERhdGFCaW5kaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZyb250ZW5kIHVzZWQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImpheHdzIgotICAgICAqLwotICAgIEZyb250ZW5kIGdldEZyb250ZW5kKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXRGcm9udGVuZCA8ZW0+RnJvbnRlbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZyb250ZW5kPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5Gcm9udGVuZAotICAgICAqIEBzZWUgI2dldEZyb250ZW5kKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRGcm9udGVuZChGcm9udGVuZCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dCBpcyB1c2VkIGluc3RlYWQgb2YgY3hmLXNlcnZsZXQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQgPGVtPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogSWYgdHJ1ZSB0aGUgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQgaXMgdXNlZCBvdGhlcndpc2UgY3hmIHNlcnZsZXQuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcihib29sZWFuKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0Q1hGQ29udGV4dF9FeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKQotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciA8ZW0+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnN0YWxsYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnN0YWxsYXRpb25zPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zdGFsbGF0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0SW5zdGFsbGF0aW9ucyhNYXApCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRDWEZDb250ZXh0X0luc3RhbGxhdGlvbnMoKQotICAgICAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIE1hcDxTdHJpbmcsIENYRkluc3RhbGw+IGdldEluc3RhbGxhdGlvbnMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldEluc3RhbGxhdGlvbnMgPGVtPkluc3RhbGxhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc3RhbGxhdGlvbnM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEluc3RhbGxhdGlvbnMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEluc3RhbGxhdGlvbnMoTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4gdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZEYXRhTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGRGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYTFjZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZEYXRhTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi0vKioKLSAqIAotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENYRkRhdGFNb2RlbCBleHRlbmRzIENYRkNvbnRleHQgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9yaWdpbmF0aW5nIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgamF2YSBvciB3c2RsIHJlc291cmNlLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRQcm9qZWN0TmFtZSA8ZW0+UHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBvcmlnaW5hdGluZyBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIGphdmEgb3Igd3NkbCByZXNvdXJjZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFByb2plY3ROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBvdXRwdXQgZmlsZXMgYXJlIHBsYWNlZC4KLSAgICAgKiAgCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFJlc291cmNlRGlyZWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFJlc291cmNlRGlyZWN0b3J5IDxlbT5SZXNvdXJjZSBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgb3V0cHV0IGZpbGVzIGFyZSBwbGFjZWQuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRGlyZWN0b3J5PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRSZXNvdXJjZURpcmVjdG9yeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0UmVzb3VyY2VEaXJlY3RvcnkoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMgYXJlIGNvbXBpbGVkIGludG8uCi0gICAgICogSWYgbm90IHNwZWNpZmllZCwgdGhlIGZpbGVzIGFyZSBub3QgY29tcGlsZWQuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldENsYXNzRGlyZWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENsYXNzRGlyZWN0b3J5IDxlbT5DbGFzcyBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgc291cmNlcyBhcmUgY29tcGlsZWQgaW50by4gSWYgbm90Ci0gICAgICogc3BlY2lmaWVkLCB0aGUgZmlsZXMgYXJlIG5vdCBjb21waWxlZC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBEaXJlY3Rvcnk8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldENsYXNzRGlyZWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRDbGFzc0RpcmVjdG9yeShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgV1NETCBGaWxlIHRoYXQgaXMgdXNlZCBhcyBpbnB1dCB0byBXU0RMMkphdmEgb3IKLSAgICAgKiBpcyB0aGUgb3V0cHV0IG9mIEphdmEyV1MuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFdzZGxGaWxlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsRmlsZU5hbWUgPGVtPldzZGwgRmlsZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIEZpbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0V3NkbEZpbGVOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRXc2RsRmlsZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFdTREwgVVJMLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFVSTCBnZXRXc2RsVVJMKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxVUkwgPGVtPldzZGwgVVJMPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFVSTDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0V3NkbFVSTCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0V3NkbFVSTChVUkwgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd3NkbCBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgV2ViQ29udGVudCBkaXJlY3RvcnkuCi0gICAgICogVXNlZCBpbiB0aGUgc3ByaW5nIGNvbmZpZ3VyYXRpb24uCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldENvbmZpZ1dzZGxMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRDb25maWdXc2RsTG9jYXRpb24gPGVtPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maWcgV3NkbCBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRDb25maWdXc2RsTG9jYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEphdmEgQ2xhc3MgdGhhdCBtYXkgYmUgdXNlZCBhcyBpbnB1dCB0byBKYXZhMldTIG9yIGlzIHRoZSBvdXRwdXQKLSAgICAgKiBvZiBXU0RMMkphdmEuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUgPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIEphdmEgQ2xhc3MgdGhhdCBtYXkgYmUgdXNlZCBhcyBpbnB1dCB0byBKYXZhMldTIG9yIGlzIHRoZSBvdXRwdXQgb2YgV1NETDJKYXZhLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBKYXZhIEludGVyZmFjZSB0aGF0IG1heSBiZSB1c2VkIGFzIGlucHV0IHRvIEphdmEyV1MuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUgPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBKYXZhIEludGVyZmFjZSB0aGF0IG1heSBiZSB1c2VkIGFzIGlucHV0IHRvIEphdmEyV1MuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgaW4gdGhlIENYRiBTcHJpbmcgQ29uZmlndXJhdGlvbiB0byB1bmlxdWVseSBpZGVudGlmeSBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q29uZmlnSWQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0Q29uZmlnSWQgPGVtPkNvbmZpZyBJZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIElkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRDb25maWdJZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlnSWQoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRhcmdldE5hbWVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIHRhcmdldE5hbWVzcGFjZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZW5kb2ludE5hbWUgYXR0cmlidXRlIHVzZWQgaW4gdGhlIGpheHdzOmVuZHBvaW50IGVsZW1lbnQgaW4gdGhlIENYRiBTcHJpbmcgQ29uZmlndXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RW5kcG9pbnROYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRFbmRwb2ludE5hbWUgPGVtPkVuZHBvaW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGVuZHBvaW50TmFtZSBhdHRyaWJ1dGUgdXNlZCBpbiB0aGUgamF4d3M6ZW5kcG9pbnQgZWxlbWVudCBpbiB0aGUgQ1hGIFNwcmluZyBDb25maWd1cmF0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVuZHBvaW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEVuZHBvaW50TmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RW5kcG9pbnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2aWNlTmFtZSBhdHRyaWJ1dGUgdXNlZCBpbiB0aGUgamF4d3M6ZW5kcG9pbnQgZWxlbWVudCBpbiB0aGUgQ1hGIFNwcmluZyBDb25maWd1cmF0aW9uLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRTZXJ2aWNlTmFtZSA8ZW0+U2VydmljZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBzZXJ2aWNlTmFtZSBhdHRyaWJ1dGUgdXNlZCBpbiB0aGUgamF4d3M6ZW5kcG9pbnQgZWxlbWVudCBpbiB0aGUgQ1hGIFNwcmluZyBDb25maWd1cmF0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0U2VydmljZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBEZWZpbml0aW9uIGdldFdzZGxEZWZpbml0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxEZWZpbml0aW9uIDxlbT5Xc2RsIERlZmluaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgRGVmaW5pdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0V3NkbERlZmluaXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFdzZGxEZWZpbml0aW9uKERlZmluaXRpb24gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFdzZGxMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsTG9jYXRpb24gPGVtPldzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFdzZGxMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0V3NkbExvY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0gICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMjM5ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IENYRkZhY3RvcnkuamF2YSx2IDEuMiAyMDEwLzAxLzE3IDE5OjU2OjU2IHNjbGFya2UgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDWEZGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotICAgIC8qKgotICAgICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQ1hGRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPicuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEphdmEyV1NEYXRhTW9kZWwgY3JlYXRlSmF2YTJXU0RhdGFNb2RlbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XU0RMMiBKYXZhIERhdGEgTW9kZWw8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgV1NETDJKYXZhRGF0YU1vZGVsIGNyZWF0ZVdTREwySmF2YURhdGFNb2RlbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnN0YWxsPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnN0YWxsPC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBDWEZJbnN0YWxsIGNyZWF0ZUNYRkluc3RhbGwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQ1hGUGFja2FnZSBnZXRDWEZQYWNrYWdlKCk7Ci0KLX0gLy9DWEZGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkluc3RhbGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzIxNzI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGSW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogQ1hGSW5zdGFsbC5qYXZhLHYgMS4xIDIwMTAvMDEvMTcgMTk6NTY6NTYgc2NsYXJrZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnN0YWxsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0Q1hGSW5zdGFsbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDWEZJbnN0YWxsIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0Q1hGSW5zdGFsbF9WZXJzaW9uKCkKLSAgICAgKiBAbW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldFZlcnNpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0TG9jYXRpb24oU3RyaW5nKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0Q1hGSW5zdGFsbF9Mb2NhdGlvbigpCi0gICAgICogQG1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFN0cmluZyBnZXRMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0TG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldExvY2F0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldFR5cGUoU3RyaW5nKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0Q1hGSW5zdGFsbF9UeXBlKCkKLSAgICAgKiBAbW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFR5cGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDWEZJbnN0YWxsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRlBhY2thZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2VjZGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0NiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IENYRlBhY2thZ2UuamF2YSx2IDEuNCAyMDEwLzAxLzE3IDE5OjU2OjU2IHNjbGFya2UgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1hGUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLSAgICAvKioKLSAgICAgKiBUaGUgcGFja2FnZSBuYW1lLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFN0cmluZyBlTkFNRSA9ICJtb2RlbCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsLmVjb3JlIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIENYRlBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwuaW5pdCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCA8ZW0+Q29udGV4dDwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUID0gMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OID0gMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVFlQRSA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT04gPSAyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmJvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fVkVSQk9TRSA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSA0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIENsaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQgPSA1OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFNlcnZlcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVIgPSA2OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGFiaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX0RBVEFCSU5ESU5HID0gNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19GUk9OVEVORCA9IDg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCA9IDk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IDEwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbGxhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fSU5TVEFMTEFUSU9OUyA9IDExOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRleHQ8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCA9IDEyOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsIDxlbT5EYXRhIE1vZGVsPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OID0gQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVFlQRSA9IENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVFlQRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTiA9IENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJib3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0UgPSBDWEZfQ09OVEVYVF9fVkVSQk9TRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSA9IENYRl9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDbGllbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5UID0gQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBTZXJ2ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSID0gQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhYmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19EQVRBQklORElORyA9IENYRl9DT05URVhUX19EQVRBQklORElORzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19GUk9OVEVORCA9IENYRl9DT05URVhUX19GUk9OVEVORDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUID0gQ1hGX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSID0gQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YWxsYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0lOU1RBTExBVElPTlMgPSBDWEZfQ09OVEVYVF9fSU5TVEFMTEFUSU9OUzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlkgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIEZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFdzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19DT05GSUdfSUQgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgODsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0UgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmRwb2ludCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDEyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EYXRhIE1vZGVsPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCA8ZW0+SmF2YTIgV1MgQ29udGV4dDwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVCA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OID0gQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9UWVBFID0gQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9UWVBFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT04gPSBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyYm9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX1ZFUkJPU0UgPSBDWEZfQ09OVEVYVF9fVkVSQk9TRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFID0gQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIENsaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVCA9IENYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgU2VydmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSID0gQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhYmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0RBVEFCSU5ESU5HID0gQ1hGX0NPTlRFWFRfX0RBVEFCSU5ESU5HOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fRlJPTlRFTkQgPSBDWEZfQ09OVEVYVF9fRlJPTlRFTkQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUID0gQ1hGX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIgPSBDWEZfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbGxhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19JTlNUQUxMQVRJT05TID0gQ1hGX0NPTlRFWFRfX0lOU1RBTExBVElPTlM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcDEyIEJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19TT0FQMTJfQklORElORyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfWFNEX0lNUE9SVFMgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXU0RMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1NETCA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRCA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdlYiBQYXJhbSBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBSZXF1ZXN0IFdyYXBwZXIgQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SmF2YTIgV1MgQ29udGV4dDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX0ZFQVRVUkVfQ09VTlQgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwgPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMID0gMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04gPSBDWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1RZUEUgPSBDWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1RZUEU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTiA9IENYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJib3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fVkVSQk9TRSA9IENYRl9EQVRBX01PREVMX19WRVJCT1NFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSBDWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ2xpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5UID0gQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBTZXJ2ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVIgPSBDWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGFiaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fREFUQUJJTkRJTkcgPSBDWEZfREFUQV9NT0RFTF9fREFUQUJJTkRJTkc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19GUk9OVEVORCA9IENYRl9EQVRBX01PREVMX19GUk9OVEVORDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQgPSBDWEZfREFUQV9NT0RFTF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IENYRl9EQVRBX01PREVMX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFsbGF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0lOU1RBTExBVElPTlMgPSBDWEZfREFUQV9NT0RFTF9fSU5TVEFMTEFUSU9OUzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19QUk9KRUNUX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWSA9IENYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZID0gQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIEZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fV1NETF9VUkwgPSBDWEZfREFUQV9NT0RFTF9fV1NETF9VUkw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFdzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTiA9IENYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRSA9IENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fQ09ORklHX0lEID0gQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRSA9IENYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuZHBvaW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT04gPSBDWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OID0gQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcDEyIEJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19TT0FQMTJfQklORElORyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFMgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXU0RMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1NETCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTiA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdlYiBQYXJhbSBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04gPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBSZXF1ZXN0IFdyYXBwZXIgQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3NwYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NQQVRIID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBTdGFydGluZyBQb2ludDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0pBVkFfU1RBUlRJTkdfUE9JTlQgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDExOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dHJhY3QgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhUUkFDVF9JTlRFUkZBQ0UgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUUgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE1hcDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX01FVEhPRF9NQVAgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5ub3RhdGlvbiBNYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX01BUCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19QT1JUX05BTUUgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0IDxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFQgPSA0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OID0gQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1RZUEUgPSBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1RZUEU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OID0gQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmJvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1ZFUkJPU0UgPSBDWEZfQ09OVEVYVF9fVkVSQk9TRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ2xpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9DTElFTlQgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFNlcnZlcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSID0gQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhYmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fREFUQUJJTkRJTkcgPSBDWEZfQ09OVEVYVF9fREFUQUJJTkRJTkc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0ZST05URU5EID0gQ1hGX0NPTlRFWFRfX0ZST05URU5EOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUID0gQ1hGX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IENYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFsbGF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fSU5TVEFMTEFUSU9OUyA9IENYRl9DT05URVhUX19JTlNUQUxMQVRJT05TOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkcgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2FkIERlZmF1bHQgRXhjbHVkZXMgTmFtZXBzYWNlIE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19WQUxJREFURSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fV1NETF9WRVJTSU9OID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIERlZmF1bHQgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19VU0VfREVGQVVMVF9WQUxVRVMgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgQXJnczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0FSR1MgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5ObyBBZGRyZXNzIEJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgVG8gU3RyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDExOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgTG9jYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0xPQ0FUT1IgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIFN5bmMgTWV0aG9kczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1NZTkNfTUVUSE9EUyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgTWFyayBHZW5lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19NQVJLX0dFTkVSQVRFRCA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgRXBpc29kZSBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19YSkNfRVBJU09ERV9GSUxFID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDE2OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19BVVRPX05BTUVfUkVTT0xVVElPTiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX0ZFQVRVUkVfQ09VTlQgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwgPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldFdTREwySmF2YURhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUwgPSA1OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OID0gQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1RZUEUgPSBDWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1RZUEU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OID0gQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmJvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1ZFUkJPU0UgPSBDWEZfREFUQV9NT0RFTF9fVkVSQk9TRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSBDWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ2xpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9DTElFTlQgPSBDWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5UOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFNlcnZlcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSID0gQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhYmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fREFUQUJJTkRJTkcgPSBDWEZfREFUQV9NT0RFTF9fREFUQUJJTkRJTkc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0ZST05URU5EID0gQ1hGX0RBVEFfTU9ERUxfX0ZST05URU5EOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUID0gQ1hGX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IENYRl9EQVRBX01PREVMX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFsbGF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fSU5TVEFMTEFUSU9OUyA9IENYRl9EQVRBX01PREVMX19JTlNUQUxMQVRJT05TOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWSA9IENYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlkgPSBDWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgRmlsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRSA9IENYRl9EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFVSTDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9VUkwgPSBDWEZfREFUQV9NT0RFTF9fV1NETF9VUkw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFdzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OID0gQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19DT05GSUdfSUQgPSBDWEZfREFUQV9NT0RFTF9fQ09ORklHX0lEOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0UgPSBDWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmRwb2ludCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19TRVJWSUNFX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OID0gQ1hGX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OID0gQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1BST0NFU1NfU09BUF9IRUFERVJTID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1ZBTElEQVRFID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX1ZFUlNJT04gPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9ERUZBVUxUX1ZBTFVFUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBBcmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfQVJHUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vIEFkZHJlc3MgQmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fTk9fQUREUkVTU19CSU5ESU5HID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIFVzZSBEZWZhdWx0IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkcgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkUgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIFRvIFN0cmluZyBTaW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfU0lNUExFID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDEyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBMb2NhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTE9DQVRPUiA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgU3luYyBNZXRob2RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfU1lOQ19NRVRIT0RTID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBNYXJrIEdlbmVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX01BUktfR0VORVJBVEVEID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE1OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBFcGlzb2RlIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19FUElTT0RFX0ZJTEUgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0byBOYW1lIFJlc29sdXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0FVVE9fTkFNRV9SRVNPTFVUSU9OID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE3OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVkIE5hbWVzcGFjZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0lOQ0xVREVEX05BTUVTUEFDRVMgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmluZGluZyBGaWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19CSU5ESU5HX0ZJTEVTID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE5OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGVkIE5hbWVzcGFjZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0VYQ0xVREVEX05BTUVTUEFDRVMgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZyBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19DQVRBTE9HX0ZJTEUgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBTb3VyY2UgRm9sZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19KQVZBX1NPVVJDRV9GT0xERVIgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDIzOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZJbnN0YWxsSW1wbCA8ZW0+SW5zdGFsbDwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkluc3RhbGxJbXBsCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRDWEZJbnN0YWxsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IENYRl9JTlNUQUxMID0gNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0lOU1RBTExfX1ZFUlNJT04gPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0lOU1RBTExfX0xPQ0FUSU9OID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0lOU1RBTExfX1RZUEUgPSAyOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkluc3RhbGw8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0lOU1RBTExfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5Gcm9udGVuZCA8ZW0+RnJvbnRlbmQ8L2VtPn0nIGVudW0uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5Gcm9udGVuZAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0RnJvbnRlbmQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgRlJPTlRFTkQgPSA3OwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmcgPGVtPkRhdGEgQmluZGluZzwvZW0+fScgZW51bS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXREYXRhQmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBEQVRBX0JJTkRJTkcgPSA4OwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5VUkw8L2VtPicgZGF0YSB0eXBlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBqYXZhLm5ldC5VUkwKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldFVSTCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBVUkwgPSA5OwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZpbml0aW9uPC9lbT4nIGRhdGEgdHlwZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgamF2YXgud3NkbC5EZWZpbml0aW9uCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXREZWZpbml0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IERFRklOSVRJT04gPSAxMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TWFwPC9lbT4nIGRhdGEgdHlwZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgamF2YS51dGlsLk1hcAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0TWFwKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IE1BUCA9IDExOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5JTWV0aG9kPC9lbT4nIGRhdGEgdHlwZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0SU1ldGhvZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBJTUVUSE9EID0gMTI7Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0IDxlbT5Db250ZXh0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRleHQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0Q1hGQ29udGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uIDxlbT5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lTG9jYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlIDxlbT5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgUnVudGltZSBUeXBlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXREZWZhdWx0UnVudGltZVZlcnNpb24gPGVtPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXREZWZhdWx0UnVudGltZVZlcnNpb24oKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzVmVyYm9zZSA8ZW0+VmVyYm9zZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcmJvc2U8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc1ZlcmJvc2UoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfVmVyYm9zZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0dlbmVyYXRlQW50QnVpbGRGaWxlIDxlbT5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZUFudEJ1aWxkRmlsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0dlbmVyYXRlQ2xpZW50IDxlbT5HZW5lcmF0ZSBDbGllbnQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBDbGllbnQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0dlbmVyYXRlQ2xpZW50KCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0dlbmVyYXRlQ2xpZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzR2VuZXJhdGVTZXJ2ZXIgPGVtPkdlbmVyYXRlIFNlcnZlcjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIFNlcnZlcjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzR2VuZXJhdGVTZXJ2ZXIoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfR2VuZXJhdGVTZXJ2ZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGF0YWJpbmRpbmcgPGVtPkRhdGFiaW5kaW5nPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF0YWJpbmRpbmc8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXREYXRhYmluZGluZygpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9EYXRhYmluZGluZygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXRGcm9udGVuZCA8ZW0+RnJvbnRlbmQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Gcm9udGVuZDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldEZyb250ZW5kKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0Zyb250ZW5kKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0IDxlbT5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9Vc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIgPGVtPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXRJbnN0YWxsYXRpb25zIDxlbT5JbnN0YWxsYXRpb25zPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5zdGFsbGF0aW9uczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldEluc3RhbGxhdGlvbnMoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfSW5zdGFsbGF0aW9ucygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCA8ZW0+RGF0YSBNb2RlbDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0Q1hGRGF0YU1vZGVsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0UHJvamVjdE5hbWUgPGVtPlByb2plY3QgTmFtZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2plY3QgTmFtZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0UHJvamVjdE5hbWUoKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1Byb2plY3ROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0UmVzb3VyY2VEaXJlY3RvcnkgPGVtPlJlc291cmNlIERpcmVjdG9yeTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIERpcmVjdG9yeTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0UmVzb3VyY2VEaXJlY3RvcnkoKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1Jlc291cmNlRGlyZWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0Q2xhc3NEaXJlY3RvcnkgPGVtPkNsYXNzIERpcmVjdG9yeTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNsYXNzIERpcmVjdG9yeTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0Q2xhc3NEaXJlY3RvcnkoKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0NsYXNzRGlyZWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbEZpbGVOYW1lIDxlbT5Xc2RsIEZpbGUgTmFtZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgRmlsZSBOYW1lPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsRmlsZU5hbWUoKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1dzZGxGaWxlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxVUkwgPGVtPldzZGwgVVJMPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBVUkw8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxVUkwoKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1dzZGxVUkwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRDb25maWdXc2RsTG9jYXRpb24gPGVtPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uZmlnIFdzZGwgTG9jYXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENvbmZpZ1dzZGxMb2NhdGlvbigpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfQ29uZmlnV3NkbExvY2F0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9GdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9GdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0Q29uZmlnSWQgPGVtPkNvbmZpZyBJZDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbmZpZyBJZDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0Q29uZmlnSWQoKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0NvbmZpZ0lkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9UYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRFbmRwb2ludE5hbWUgPGVtPkVuZHBvaW50IE5hbWU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbmRwb2ludCBOYW1lPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRFbmRwb2ludE5hbWUoKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0VuZHBvaW50TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFNlcnZpY2VOYW1lIDxlbT5TZXJ2aWNlIE5hbWU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2aWNlIE5hbWU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFNlcnZpY2VOYW1lKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9TZXJ2aWNlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxEZWZpbml0aW9uIDxlbT5Xc2RsIERlZmluaXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIERlZmluaXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxEZWZpbml0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Xc2RsRGVmaW5pdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxMb2NhdGlvbiA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgTG9jYXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxMb2NhdGlvbigpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfV3NkbExvY2F0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQgPGVtPkphdmEyIFdTIENvbnRleHQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SmF2YTIgV1MgQ29udGV4dDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0SmF2YTJXU0NvbnRleHQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzU29hcDEyQmluZGluZyA8ZW0+U29hcDEyIEJpbmRpbmc8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb2FwMTIgQmluZGluZzwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc1NvYXAxMkJpbmRpbmcoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9Tb2FwMTJCaW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlWFNESW1wb3J0cyA8ZW0+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlWFNESW1wb3J0cygpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlWFNESW1wb3J0cygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdTREwgPGVtPkdlbmVyYXRlIFdTREw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBXU0RMPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXU0RMKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXU0RMKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMgPGVtPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkIDxlbT5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIFdlYiBQYXJhbSBBbm5vdGF0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBSZXF1ZXN0IFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsIDxlbT5KYXZhMiBXUyBEYXRhIE1vZGVsPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0SmF2YTJXU0RhdGFNb2RlbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRDbGFzc3BhdGggPGVtPkNsYXNzcGF0aDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNsYXNzcGF0aDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldENsYXNzcGF0aCgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9DbGFzc3BhdGgoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQgPGVtPkphdmEgU3RhcnRpbmcgUG9pbnQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KYXZhIFN0YXJ0aW5nIFBvaW50PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfSmF2YVN0YXJ0aW5nUG9pbnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNpc0V4dHJhY3RJbnRlcmZhY2UgPGVtPkV4dHJhY3QgSW50ZXJmYWNlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXh0cmFjdCBJbnRlcmZhY2U8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNpc0V4dHJhY3RJbnRlcmZhY2UoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfRXh0cmFjdEludGVyZmFjZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBOYW1lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRNZXRob2RNYXAgPGVtPk1ldGhvZCBNYXA8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRob2QgTWFwPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0TWV0aG9kTWFwKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX01ldGhvZE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRBbm5vdGF0aW9uTWFwIDxlbT5Bbm5vdGF0aW9uIE1hcDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFubm90YXRpb24gTWFwPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0QW5ub3RhdGlvbk1hcCgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9Bbm5vdGF0aW9uTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldFNvdXJjZURpcmVjdG9yeSA8ZW0+U291cmNlIERpcmVjdG9yeTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvdXJjZSBEaXJlY3Rvcnk8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRTb3VyY2VEaXJlY3RvcnkoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfU291cmNlRGlyZWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldFBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRQb3J0TmFtZSgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9Qb3J0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQgPGVtPldTREwyIEphdmEgQ29udGV4dDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0V1NETDJKYXZhQ29udGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24gPGVtPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1Byb2Nlc3NTT0FQSGVhZGVycyA8ZW0+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9jZXNzIFNPQVAgSGVhZGVyczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzUHJvY2Vzc1NPQVBIZWFkZXJzKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1Byb2Nlc3NTT0FQSGVhZGVycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nIDxlbT5Mb2FkIERlZmF1bHQgTmFtZXNwYWNlIFBhY2thZ2UgTmFtZSBNYXBwaW5nPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyA8ZW0+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Mb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1ZhbGlkYXRlIDxlbT5WYWxpZGF0ZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbGlkYXRlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNWYWxpZGF0ZSgpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9WYWxpZGF0ZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRXc2RsVmVyc2lvbiA8ZW0+V3NkbCBWZXJzaW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBWZXJzaW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjZ2V0V3NkbFZlcnNpb24oKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfV3NkbFZlcnNpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNVc2VEZWZhdWx0VmFsdWVzIDxlbT5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1VzZURlZmF1bHRWYWx1ZXMoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfVXNlRGVmYXVsdFZhbHVlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRYamNBcmdzIDxlbT5YamMgQXJnczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhqYyBBcmdzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjZ2V0WGpjQXJncygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNBcmdzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTm9BZGRyZXNzQmluZGluZyA8ZW0+Tm8gQWRkcmVzcyBCaW5kaW5nPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm8gQWRkcmVzcyBCaW5kaW5nPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNOb0FkZHJlc3NCaW5kaW5nKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X05vQWRkcmVzc0JpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNVc2VEZWZhdWx0VmFsdWVzIDxlbT5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIFVzZSBEZWZhdWx0IFZhbHVlczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVXNlRGVmYXVsdFZhbHVlcygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNVc2VEZWZhdWx0VmFsdWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVG9TdHJpbmcgPGVtPlhqYyBUbyBTdHJpbmc8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YamMgVG8gU3RyaW5nPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNUb1N0cmluZygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nTXVsdGlMaW5lIDxlbT5YamMgVG8gU3RyaW5nIE11bHRpIExpbmU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YamMgVG8gU3RyaW5nIE11bHRpIExpbmU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nTXVsdGlMaW5lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVG9TdHJpbmdTaW1wbGUgPGVtPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIFRvIFN0cmluZyBTaW1wbGU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nU2ltcGxlKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nU2ltcGxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjTG9jYXRvciA8ZW0+WGpjIExvY2F0b3I8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YamMgTG9jYXRvcjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjTG9jYXRvcigpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNMb2NhdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjU3luY01ldGhvZHMgPGVtPlhqYyBTeW5jIE1ldGhvZHM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YamMgU3luYyBNZXRob2RzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNTeW5jTWV0aG9kcygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNTeW5jTWV0aG9kcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY01hcmtHZW5lcmF0ZWQgPGVtPlhqYyBNYXJrIEdlbmVyYXRlZDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhqYyBNYXJrIEdlbmVyYXRlZDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjTWFya0dlbmVyYXRlZCgpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNNYXJrR2VuZXJhdGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2dldFhqY0VwaXNvZGVGaWxlIDxlbT5YamMgRXBpc29kZSBGaWxlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIEVwaXNvZGUgRmlsZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2dldFhqY0VwaXNvZGVGaWxlKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY0VwaXNvZGVGaWxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzQXV0b05hbWVSZXNvbHV0aW9uIDxlbT5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNBdXRvTmFtZVJlc29sdXRpb24oKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfQXV0b05hbWVSZXNvbHV0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsIDxlbT5XU0RMMiBKYXZhIERhdGEgTW9kZWw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQ2xhc3MgZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0SW5jbHVkZWROYW1lc3BhY2VzIDxlbT5JbmNsdWRlZCBOYW1lc3BhY2VzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5jbHVkZWQgTmFtZXNwYWNlczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YURhdGFNb2RlbF9JbmNsdWRlZE5hbWVzcGFjZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEJpbmRpbmdGaWxlcyA8ZW0+QmluZGluZyBGaWxlczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QmluZGluZyBGaWxlczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0QmluZGluZ0ZpbGVzKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YURhdGFNb2RlbF9CaW5kaW5nRmlsZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRFeGNsdWRlZE5hbWVzcGFjZXMgPGVtPkV4Y2x1ZGVkIE5hbWVzcGFjZXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlZCBOYW1lc3BhY2VzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRFeGNsdWRlZE5hbWVzcGFjZXMoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YURhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0V4Y2x1ZGVkTmFtZXNwYWNlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldENhdGFsb2dGaWxlIDxlbT5DYXRhbG9nIEZpbGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXRhbG9nIEZpbGU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldENhdGFsb2dGaWxlKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YURhdGFNb2RlbF9DYXRhbG9nRmlsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEphdmFTb3VyY2VGb2xkZXIgPGVtPkphdmEgU291cmNlIEZvbGRlcjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkphdmEgU291cmNlIEZvbGRlcjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0SmF2YVNvdXJjZUZvbGRlcigpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfSmF2YVNvdXJjZUZvbGRlcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwgPGVtPkluc3RhbGw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW5zdGFsbDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRDWEZJbnN0YWxsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwjZ2V0VmVyc2lvbigpCi0gICAgICogQHNlZSAjZ2V0Q1hGSW5zdGFsbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGSW5zdGFsbF9WZXJzaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2F0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwjZ2V0TG9jYXRpb24oKQotICAgICAqIEBzZWUgI2dldENYRkluc3RhbGwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkluc3RhbGxfTG9jYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCNnZXRUeXBlKCkKLSAgICAgKiBAc2VlICNnZXRDWEZJbnN0YWxsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZJbnN0YWxsX1R5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kIDxlbT5Gcm9udGVuZDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkZyb250ZW5kPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVFbnVtIGdldEZyb250ZW5kKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZyA8ZW0+RGF0YSBCaW5kaW5nPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RGF0YSBCaW5kaW5nPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVFbnVtIGdldERhdGFCaW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5uZXQuVVJMIDxlbT5VUkw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlVSTDwvZW0+Jy4KLSAgICAgKiBAc2VlIGphdmEubmV0LlVSTAotICAgICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm5ldC5VUkwiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVEYXRhVHlwZSBnZXRVUkwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZheC53c2RsLkRlZmluaXRpb24gPGVtPkRlZmluaXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRlZmluaXRpb248L2VtPicuCi0gICAgICogQHNlZSBqYXZheC53c2RsLkRlZmluaXRpb24KLSAgICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5EZWZpbml0aW9uIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFRGF0YVR5cGUgZ2V0RGVmaW5pdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEudXRpbC5NYXAgPGVtPk1hcDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TWFwPC9lbT4nLgotICAgICAqIEBzZWUgamF2YS51dGlsLk1hcAotICAgICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuTWFwIiB0eXBlUGFyYW1ldGVycz0iVCBUMSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRURhdGFUeXBlIGdldE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QgPGVtPklNZXRob2Q8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPklNZXRob2Q8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kCi0gICAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVEYXRhVHlwZSBnZXRJTWV0aG9kKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBDWEZGYWN0b3J5IGdldENYRkZhY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotICAgICAqIDx1bD4KLSAgICAgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gICAgICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAgICAgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAgICAgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludGVyZmFjZSBMaXRlcmFscyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQgPGVtPkNvbnRleHQ8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldENYRkNvbnRleHQoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgQ1hGX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lTG9jYXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9UWVBFID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVUeXBlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lVmVyc2lvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyYm9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19WRVJCT1NFID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfVmVyYm9zZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZUFudEJ1aWxkRmlsZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ2xpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVCA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0dlbmVyYXRlQ2xpZW50KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBTZXJ2ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVTZXJ2ZXIoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRhdGFiaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0RBVEFCSU5ESU5HID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfRGF0YWJpbmRpbmcoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0ZST05URU5EID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfRnJvbnRlbmQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9Vc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9FeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluc3RhbGxhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fSU5TVEFMTEFUSU9OUyA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0luc3RhbGxhdGlvbnMoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwgPGVtPkRhdGEgTW9kZWw8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIENYRl9EQVRBX01PREVMID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfUHJvamVjdE5hbWUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlkgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1Jlc291cmNlRGlyZWN0b3J5KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9DbGFzc0RpcmVjdG9yeSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBGaWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1dzZGxGaWxlTmFtZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBVUkw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fV1NETF9VUkwgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1dzZGxVUkwoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9Db25maWdXc2RsTG9jYXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfRnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfRnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRCA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfQ29uZmlnSWQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfVGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbmRwb2ludCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX0VuZHBvaW50TmFtZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfU2VydmljZU5hbWUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1dzZGxEZWZpbml0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX1dzZGxMb2NhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0IDxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgSkFWQTJfV1NfQ09OVEVYVCA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcDEyIEJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19DT05URVhUX19TT0FQMTJfQklORElORyA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9Tb2FwMTJCaW5kaW5nKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlWFNESW1wb3J0cygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV1NETDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dTREwgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXU0RMKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUyA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTiA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTiA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwgPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgSkFWQTJfV1NfREFUQV9NT0RFTCA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzc3BhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19DTEFTU1BBVEggPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbF9DbGFzc3BhdGgoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgU3RhcnRpbmcgUG9pbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19KQVZBX1NUQVJUSU5HX1BPSU5UID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWxfSmF2YVN0YXJ0aW5nUG9pbnQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0RBVEFfTU9ERUxfX1VTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsX1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0cmFjdCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19FWFRSQUNUX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsX0V4dHJhY3RJbnRlcmZhY2UoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWxfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE1hcDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0RBVEFfTU9ERUxfX01FVEhPRF9NQVAgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbF9NZXRob2RNYXAoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFubm90YXRpb24gTWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9NQVAgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbF9Bbm5vdGF0aW9uTWFwKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWSA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsX1NvdXJjZURpcmVjdG9yeSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfREFUQV9NT0RFTF9fUE9SVF9OQU1FID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWxfUG9ydE5hbWUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0IDxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgV1NETDJfSkFWQV9DT05URVhUID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTiA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1Byb2Nlc3NTT0FQSGVhZGVycygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2FkIERlZmF1bHQgRXhjbHVkZXMgTmFtZXBzYWNlIE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fVkFMSURBVEUgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9WYWxpZGF0ZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19XU0RMX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9Xc2RsVmVyc2lvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNlIERlZmF1bHQgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19VU0VfREVGQVVMVF9WQUxVRVMgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9Vc2VEZWZhdWx0VmFsdWVzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgQXJnczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0FSR1MgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNBcmdzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5ObyBBZGRyZXNzIEJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X05vQWRkcmVzc0JpbmRpbmcoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNVc2VEZWZhdWx0VmFsdWVzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgVG8gU3RyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmcoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmdNdWx0aUxpbmUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRSA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nU2ltcGxlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgTG9jYXRvcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0xPQ0FUT1IgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNMb2NhdG9yKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgU3luYyBNZXRob2RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19YSkNfU1lOQ19NRVRIT0RTID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjU3luY01ldGhvZHMoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBNYXJrIEdlbmVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjTWFya0dlbmVyYXRlZCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WGpjIEVwaXNvZGUgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0VQSVNPREVfRklMRSA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY0VwaXNvZGVGaWxlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT04gPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9BdXRvTmFtZVJlc29sdXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwgPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRXU0RMMkphdmFEYXRhTW9kZWwoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgV1NETDJfSkFWQV9EQVRBX01PREVMID0gZUlOU1RBTkNFLmdldFdTREwySmF2YURhdGFNb2RlbCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZWQgTmFtZXNwYWNlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fSU5DTFVERURfTkFNRVNQQUNFUyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFEYXRhTW9kZWxfSW5jbHVkZWROYW1lc3BhY2VzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CaW5kaW5nIEZpbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0JJTkRJTkdfRklMRVMgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0JpbmRpbmdGaWxlcygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZWQgTmFtZXNwYWNlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhDTFVERURfTkFNRVNQQUNFUyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFEYXRhTW9kZWxfRXhjbHVkZWROYW1lc3BhY2VzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NBVEFMT0dfRklMRSA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFEYXRhTW9kZWxfQ2F0YWxvZ0ZpbGUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgU291cmNlIEZvbGRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fSkFWQV9TT1VSQ0VfRk9MREVSID0gZUlOU1RBTkNFLmdldFdTREwySmF2YURhdGFNb2RlbF9KYXZhU291cmNlRm9sZGVyKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZJbnN0YWxsSW1wbCA8ZW0+SW5zdGFsbDwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkluc3RhbGxJbXBsCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0Q1hGSW5zdGFsbCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBDWEZfSU5TVEFMTCA9IGVJTlNUQU5DRS5nZXRDWEZJbnN0YWxsKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0lOU1RBTExfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0Q1hGSW5zdGFsbF9WZXJzaW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9JTlNUQUxMX19MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRDWEZJbnN0YWxsX0xvY2F0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0lOU1RBTExfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q1hGSW5zdGFsbF9UeXBlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQgPGVtPkZyb250ZW5kPC9lbT59JyBlbnVtLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRGcm9udGVuZCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVFbnVtIEZST05URU5EID0gZUlOU1RBTkNFLmdldEZyb250ZW5kKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmcgPGVtPkRhdGEgQmluZGluZzwvZW0+fScgZW51bS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0RGF0YUJpbmRpbmcoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFRW51bSBEQVRBX0JJTkRJTkcgPSBlSU5TVEFOQ0UuZ2V0RGF0YUJpbmRpbmcoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlVSTDwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIGphdmEubmV0LlVSTAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldFVSTCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVEYXRhVHlwZSBVUkwgPSBlSU5TVEFOQ0UuZ2V0VVJMKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5EZWZpbml0aW9uPC9lbT4nIGRhdGEgdHlwZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgamF2YXgud3NkbC5EZWZpbml0aW9uCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0RGVmaW5pdGlvbigpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVEYXRhVHlwZSBERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldERlZmluaXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPk1hcDwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRNYXAoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFRGF0YVR5cGUgTUFQID0gZUlOU1RBTkNFLmdldE1hcCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+SU1ldGhvZDwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRJTWV0aG9kKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRURhdGFUeXBlIElNRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0SU1ldGhvZCgpOwotCi0gICAgfQotCi19IC8vQ1hGUGFja2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9EYXRhQmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9EYXRhQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDFmYjE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvRGF0YUJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IERhdGFCaW5kaW5nLmphdmEsdiAxLjEgMjAwOC8xMS8xMCAyMDozNzo0MyBkYXZpZF93aWxsaWFtcyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkRhdGEgQmluZGluZzwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXREYXRhQmluZGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gRGF0YUJpbmRpbmcgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKLSAgICAvKioKLSAgICAgKiBUaGUgJzxlbT48Yj5KQVhCPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI0pBWEJfVkFMVUUKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBKQVhCKDAsICJKQVhCIiwgImpheGIiKTsKLQotICAgIC8qKgotICAgICAqIFRoZSAnPGVtPjxiPkpBWEI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkpBWEI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjSkFYQgotICAgICAqIEBtb2RlbCBsaXRlcmFsPSJqYXhiIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBWEJfVkFMVUUgPSAwOwotCi0gICAgLyoqCi0gICAgICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkRhdGEgQmluZGluZzwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0YUJpbmRpbmdbXSBWQUxVRVNfQVJSQVkgPQotICAgICAgICBuZXcgRGF0YUJpbmRpbmdbXSB7Ci0gICAgICAgICAgICBKQVhCLAotICAgICAgICB9OwotCi0gICAgLyoqCi0gICAgICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkRhdGEgQmluZGluZzwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PERhdGFCaW5kaW5nPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRhdGEgQmluZGluZzwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERhdGFCaW5kaW5nIGdldChTdHJpbmcgbGl0ZXJhbCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgRGF0YUJpbmRpbmcgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgICAgICAgaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5EYXRhIEJpbmRpbmc8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEYXRhQmluZGluZyBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIERhdGFCaW5kaW5nIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5EYXRhIEJpbmRpbmc8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEYXRhQmluZGluZyBnZXQoaW50IHZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAodmFsdWUpIHsKLSAgICAgICAgICAgIGNhc2UgSkFYQl9WQUxVRTogcmV0dXJuIEpBWEI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotICAgIC8qKgotICAgICAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIERhdGFCaW5kaW5nKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZhbHVlKCkgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKLSAgICAgIHJldHVybiBsaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGxpdGVyYWw7Ci0gICAgfQotICAgIAotfSAvL0RhdGFCaW5kaW5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0Zyb250ZW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0Zyb250ZW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTlhMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9Gcm9udGVuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogRnJvbnRlbmQuamF2YSx2IDEuMSAyMDA4LzExLzEwIDIwOjM3OjQzIGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0RnJvbnRlbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIEZyb250ZW5kIGltcGxlbWVudHMgRW51bWVyYXRvciB7Ci0gICAgLyoqCi0gICAgICogVGhlICc8ZW0+PGI+SkFYV1M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjSkFYV1NfVkFMVUUKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBKQVhXUygwLCAiSkFYV1MiLCAiamF4d3MiKTsKLQotICAgIC8qKgotICAgICAqIFRoZSAnPGVtPjxiPkpBWFdTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KQVhXUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNKQVhXUwotICAgICAqIEBtb2RlbCBsaXRlcmFsPSJqYXh3cyIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVhXU19WQUxVRSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZyb250ZW5kW10gVkFMVUVTX0FSUkFZID0KLSAgICAgICAgbmV3IEZyb250ZW5kW10gewotICAgICAgICAgICAgSkFYV1MsCi0gICAgICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxGcm9udGVuZD4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZyb250ZW5kIGdldChTdHJpbmcgbGl0ZXJhbCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgRnJvbnRlbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgICAgICAgaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZyb250ZW5kIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgRnJvbnRlbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRnJvbnRlbmQgZ2V0KGludCB2YWx1ZSkgewotICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICAgICAgICAgICBjYXNlIEpBWFdTX1ZBTFVFOiByZXR1cm4gSkFYV1M7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotICAgIC8qKgotICAgICAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEZyb250ZW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZhbHVlKCkgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKLSAgICAgIHJldHVybiBsaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGxpdGVyYWw7Ci0gICAgfQotICAgIAotfSAvL0Zyb250ZW5kCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0phdmEyV1NDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0phdmEyV1NDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDlkN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9KYXZhMldTQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotLyoqCi0gKiAKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmEyV1NDb250ZXh0IGV4dGVuZHMgQ1hGQ29udGV4dCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgV1NETCBpcyB0byBpbmNsdWRlIGEgU09BUCAxLjIgYmluZGluZy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1NvYXAxMkJpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc1NvYXAxMkJpbmRpbmcgPGVtPlNvYXAxMiBCaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ2VuZXJhdGVkIFdTREwgaXMgdG8gaW5jbHVkZSBhIFNPQVAgMS4yIGJpbmRpbmcuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcDEyIEJpbmRpbmc8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzU29hcDEyQmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U29hcDEyQmluZGluZyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBvdXRwdXQgc2NoZW1hcyB0byBzZXBhcmF0ZSBmaWxlcyBhbmQgdXNlIGltcG9ydHMgdG8KLSAgICAgKiBsb2FkIHRoZW0gaW5zdGVhZCBvZiBpbmxpbmluZyB0aGVtIGludG8gdGhlIHdzZGwuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlWFNESW1wb3J0cygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVYU0RJbXBvcnRzIDxlbT5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogT3V0cHV0IHNjaGVtYXMgdG8gc2VwYXJhdGUgZmlsZXMgYW5kIHVzZSBpbXBvcnRzIHRvIGxvYWQgdGhlbSBpbnN0ZWFkIG9mCi0gICAgICogaW5saW5pbmcgdGhlbSBpbnRvIHRoZSB3c2RsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlWFNESW1wb3J0cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGdlbmVyYXRlIHdzZGwuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlV1NETCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXU0RMIDxlbT5HZW5lcmF0ZSBXU0RMPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTcGVjaWZ5IHRvIGdlbmVyYXRlIHRoZSBXU0RMIGZpbGUuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgV1NETDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdTREwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlV1NETChib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBnZW5lcmF0ZSB3cmFwcGVyIGJlYW5zLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zIDxlbT5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTcGVjaWZ5IHRvIGdlbmVyYXRlIHRoZSB3cmFwcGVyIGFuZCBmYXVsdCBiZWFuLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgQW5ub3RhdGlvbiBQcm9jZXNzaW5nIFRvb2wgKEFQVCkgaXMgZW5hYmxlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkIDxlbT5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0IHRvIGVuYWJsZSB0aGUgQW5ub3RhdGlvbiBQcm9jZXNzaW5nIFRvb2wgKEFQVCkgZXh0ZW5zaW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSA8Y29kZT5AV2ViTWV0aG9kPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24gPGVtPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgZW5hYmxlbWVudCBvZiB0aGUgPGNvZGU+QFdlYk1ldGhvZDwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmF0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIFdlYiBNZXRob2QgQW5ub3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbihib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgPGNvZGU+QFdlYlBhcmFtPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgZW5hYmxlbWVudCBvZiB0aGUgPGNvZGU+QFdlYlBhcmFtPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYXRpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSA8Y29kZT5AUmVxdWVzdFdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24gPGVtPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBlbmFibGVtZW50IG9mIHRoZSA8Y29kZT5AUmVxdWVzdFdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBSZXF1ZXN0IFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIDxjb2RlPkBSZXNwb25zZVdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGVuYWJsZW1lbnQgb2YgdGhlIDxjb2RlPkBSZXNwb25zZVdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oYm9vbGVhbiB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0phdmEyV1NEYXRhTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvSmF2YTJXU0RhdGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2Y2YzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvSmF2YTJXU0RhdGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotCi0vKioKLSAqIAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YTJXU0RhdGFNb2RlbCBleHRlbmRzIENYRkRhdGFNb2RlbCwgSmF2YTJXU0NvbnRleHQgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBzZWFyY2hlZCB3aGVuIHByb2Nlc3NpbmcuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldENsYXNzcGF0aCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0Q2xhc3NwYXRoIDxlbT5DbGFzc3BhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGNsYXNzcGF0aCB0byBzZWFyY2ggd2hlbiBwcm9jZXNzaW5nLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzcGF0aDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0Q2xhc3NwYXRoKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRDbGFzc3BhdGgoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEphdmEgc3RhcnRpbmcgcG9pbnQgYXJ0aWZhY3QuIFRoaXMgY2FuIGJlIGVpdGhlciBhIEphdmEgQ2xhc3Mgb3IgSW50ZXJmYWNlLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRKYXZhU3RhcnRpbmdQb2ludCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQgPGVtPkphdmEgU3RhcnRpbmcgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIEphdmEgc3RhcnRpbmcgcG9pbnQgYXJ0aWZhY3QuIEl0IG1heSBiZSBhIEphdmEgQ2xhc3Mgb3IgSW50ZXJmYWNlLgotICAgICAqIEBzZWUgI3NldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpCi0gICAgICogQHNlZSAjc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBTdGFydGluZyBQb2ludDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEphdmFTdGFydGluZ1BvaW50KFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgc3RhcnRpbmcgcG9pbnQgaXMgYSBKYXZhIENsYXNzIHRoaXMgdHJhY2tzIHdoZXRoZXIgdG8gdXNlIGFuIFNFSSBoYXMgYmVlbiBzZWxlY3RlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5Vc2UgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSBzdGFydGluZyBwb2ludCBpcyBhIEphdmEgQ2xhc3MgdGhpcyB0cmFja3Mgd2hldGhlciB0byBvcHRpb24gdG8KLSAgICAgKiBleHRyYWN0IHRoZSBTRUkgaGFzIGJlZW4gc2VsZWN0ZWQuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0V4dHJhY3RJbnRlcmZhY2UoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2lzRXh0cmFjdEludGVyZmFjZSA8ZW0+RXh0cmFjdCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIG9wdGlvbiB0byBleHRyYWN0IHRoZSBTRUkgZnJvbSB0aGUgSmF2YSBjbGFzcyBzdGFydGluZyBwb2ludC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRyYWN0IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNFeHRyYWN0SW50ZXJmYWNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRFeHRyYWN0SW50ZXJmYWNlKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmV3IFNFSSBuYW1lLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXAgb2YgdGhlIG1ldGhvZHMgdG8gdXNlIGFuZCB0aGVpciBhbm5vdGF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IGdldE1ldGhvZE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0TWV0aG9kTWFwIDxlbT5NZXRob2QgTWFwPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBtYXAgb2YgdGhlIG1ldGhvZHMgdG8gdXNlIGFuZCB0aGUgbWV0aG9kIGFubm90YXRpb25zLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBNYXA8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldE1ldGhvZE1hcCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0TWV0aG9kTWFwKE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG1hcCBvZiBlbmFibGVkIGRlZmF1bHQgbWV0aG9kIGFubm90YXRpb25zCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgTWFwPFN0cmluZywgQm9vbGVhbj4gZ2V0QW5ub3RhdGlvbk1hcCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldEFubm90YXRpb25NYXAgPGVtPkFubm90YXRpb24gTWFwPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIGEgbWFwIG9mIHRoZSBlbmFibGVkIG1ldGhvZCBhbm5vdGF0aW9ucy4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Bbm5vdGF0aW9uIE1hcDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0QW5ub3RhdGlvbk1hcCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QW5ub3RhdGlvbk1hcChNYXA8U3RyaW5nLCBCb29sZWFuPiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgYXJlIHBsYWNlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U291cmNlRGlyZWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRTb3VyY2VEaXJlY3RvcnkgPGVtPlNvdXJjZSBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBhcmUgcGxhY2VkLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvdXJjZSBEaXJlY3Rvcnk8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFNvdXJjZURpcmVjdG9yeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U291cmNlRGlyZWN0b3J5KFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwb3J0IG5hbWUgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIHdzZGwuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFBvcnROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBwb3J0IG5hbWUgdG8gdXNlIGluIHRoZSBnZW5lcmF0ZWQgd3NkbC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFBvcnROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL1dTREwySmF2YUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvV1NETDJKYXZhQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTZhMTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvV1NETDJKYXZhQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotLyoqCi0gKiAKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTREwySmF2YUNvbnRleHQgZXh0ZW5kcyBDWEZDb250ZXh0IHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBnZW5lcmF0ZSBzdGFydGluZyBwb2ludCBjb2RlIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvYmplY3QuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbiA8ZW0+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9iamVjdC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHByb2Nlc3Npbmcgb2YgaW1wbGljaXQgU09BUCBoZWFkZXJzIChpLmUuIFNPQVAgaGVhZGVycwotICAgICAqIGRlZmluZWQgaW4gdGhlIHdzZGw6YmluZGluZyBidXQgbm90IHdzZGw6cG9ydFR5cGUgc2VjdGlvbi4pIGlzIGVuYWJsZWQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNQcm9jZXNzU09BUEhlYWRlcnMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzUHJvY2Vzc1NPQVBIZWFkZXJzIDxlbT5Qcm9jZXNzIFNPQVAgSGVhZGVyczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBwcm9jZXNzaW5nIG9mIGltcGxpY2l0IFNPQVAgaGVhZGVycyAoaS5lLiBTT0FQCi0gICAgICogaGVhZGVycyBkZWZpbmVkIGluIHRoZSB3c2RsOmJpbmRpbmcgYnV0IG5vdCB3c2RsOnBvcnRUeXBlIHNlY3Rpb24uKQotICAgICAqIERlZmF1bHQgaXMgZmFsc2UuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzUHJvY2Vzc1NPQVBIZWFkZXJzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRQcm9jZXNzU09BUEhlYWRlcnMoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHBhY2thZ2UgbmFtZSBtYXBwaW5nIGlzIGVuYWJsZWQuIAotICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcgPGVtPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIEVuYWJsZXMgdGhlIHVzZSBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcuCi0gICAgICogRGVmYXVsdCBpcyB0cnVlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nIGlzIGVuYWJsZWQuCi0gICAgICogRGVmYXVsdCBpcyB0cnVlLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyA8ZW0+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBFbmFibGVzIHRoZSB1c2Ugb2YgdGhlIGRlZmF1bHQgZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmcuCi0gICAgICogRGVmYXVsdCBpcyB0cnVlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gdmFsaWRhdGUgdGhlIFdTREwgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIGNvZGUuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1ZhbGlkYXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1ZhbGlkYXRlIDxlbT5WYWxpZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogRW5hYmxlcyBXU0RMIHZhbGlkYXRpb24gYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNWYWxpZGF0ZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0VmFsaWRhdGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3c2RsIHZlcnNpb24gLkRlZmF1bHQgaXMgV1NETDEuMS4gQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkgV1NETDEuMSB2ZXJzaW9uLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSIxLjEiCi0gICAgICovCi0gICAgU3RyaW5nIGdldFdzZGxWZXJzaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRXc2RsVmVyc2lvbiA8ZW0+V3NkbCBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIFZlcnNpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFdzZGxWZXJzaW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRXc2RsVmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB0b29sIGlzIHNldCB0byBnZW5lcmF0ZSBkZWZhdWx0IHZhbGVzIGZvciB0aGUKLSAgICAgKiBnZW5lcmF0ZWQgY2xpZW50IGFuZCB0aGUgZ2VuZXJhdGVkIGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1VzZURlZmF1bHRWYWx1ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzVXNlRGVmYXVsdFZhbHVlcyA8ZW0+VXNlIERlZmF1bHQgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBHZW5lcmF0ZSBkZWZhdWx0IHZhbGVzIGZvciB0aGUgZ2VuZXJhdGVkIGNsaWVudCBhbmQgdGhlIGdlbmVyYXRlZCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzVXNlRGVmYXVsdFZhbHVlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0VXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgZGlyZWN0bHkgdG8KLSAgICAgKiB0aGUgWEpDIHdoZW4gdGhlIEpBWEIgYmluZGluZyBpcyBiZWluZyB1c2VkLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRYamNBcmdzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRYamNBcmdzIDxlbT5YamMgQXJnczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIEFyZ3M8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFhqY0FyZ3MoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY0FyZ3MoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgdG9vbCBpcyBzZXQgdG8gdXNlIHRoZSBDWEYgcHJvcHJpZXRhcnkgV1MtQWRkcmVzc2luZyAKLSAgICAgKiB0eXBlIGluc3RlYWQgb2YgdGhlIEpBWC1XUyAyLjEgY29tcGxpYW50IG1hcHBpbmcuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc05vQWRkcmVzc0JpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTm9BZGRyZXNzQmluZGluZyA8ZW0+Tm8gQWRkcmVzcyBCaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBJbnN0cnVjdHMgdGhlIHRvb2wgdG8gdXNlIHRoZSBDWEYgcHJvcHJpZXRhcnkgV1MtQWRkcmVzc2luZyB0eXBlIAotICAgICAqIGluc3RlYWQgb2YgdGhlIEpBWC1XUyAyLjEgY29tcGxpYW50IG1hcHBpbmcuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm8gQWRkcmVzcyBCaW5kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc05vQWRkcmVzc0JpbmRpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldE5vQWRkcmVzc0JpbmRpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgWEpDIHdpbGwgaW5pdGlhbGl6ZSBmaWVsZHMgbWFwcGVkIGZyb20gZWxlbWVudHMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzWGpjVXNlRGVmYXVsdFZhbHVlcygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNVc2VEZWZhdWx0VmFsdWVzIDxlbT5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY1VzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgWEpDIHdpbGwgZ2VuZXJhdGUgYSA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBtZXRob2QuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1hqY1RvU3RyaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nIDxlbT5YamMgVG8gU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YamMgVG8gU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRYamNUb1N0cmluZyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBtdWx0aSBsaW5lIG91dHB1dCBpcyBlbmFibGVkIGZvciA8Y29kZT50b1N0cmluZygpPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVG9TdHJpbmdNdWx0aUxpbmUgPGVtPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRYamNUb1N0cmluZ011bHRpTGluZShib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0ZXJzZSBvdXRwdXQgaXMgZW5hYmxlZCBmb3IgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4uCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1hqY1RvU3RyaW5nU2ltcGxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nU2ltcGxlIDxlbT5YamMgVG8gU3RyaW5nIFNpbXBsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIFRvIFN0cmluZyBTaW1wbGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzWGpjVG9TdHJpbmdTaW1wbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY1RvU3RyaW5nU2ltcGxlKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHNvdXJjZSBsb2NhdGlvbiBzdXBwb3J0IGlzIGVuYWJsZWQuCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1hqY0xvY2F0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjTG9jYXRvciA8ZW0+WGpjIExvY2F0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhqYyBMb2NhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1hqY0xvY2F0b3IoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY0xvY2F0b3IoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFhKQyB3aWxsIGdlbmVyYXRlIGFjY2Vzc29yIG1ldGhvZHMgd2l0aCAnc3luY2hyb25pemVkJyBrZXl3b3JkLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIGJvb2xlYW4gaXNYamNTeW5jTWV0aG9kcygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNTeW5jTWV0aG9kcyA8ZW0+WGpjIFN5bmMgTWV0aG9kczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIFN5bmMgTWV0aG9kczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNYamNTeW5jTWV0aG9kcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0WGpjU3luY01ldGhvZHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFhKQyB3aWxsIG1hcmsgdGhlIGNvZGUgYXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzWGpjTWFya0dlbmVyYXRlZCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNNYXJrR2VuZXJhdGVkIDxlbT5YamMgTWFyayBHZW5lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhqYyBNYXJrIEdlbmVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNYamNNYXJrR2VuZXJhdGVkKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRYamNNYXJrR2VuZXJhdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGVwaXNvZGUgZmlsZSBsb2NhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0WGpjRXBpc29kZUZpbGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2dldFhqY0VwaXNvZGVGaWxlIDxlbT5YamMgRXBpc29kZSBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YamMgRXBpc29kZSBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRYamNFcGlzb2RlRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0WGpjRXBpc29kZUZpbGUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0QXV0b05hbWVSZXNvbHV0aW9uKGJvb2xlYW4pCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRXU0RMMkphdmFDb250ZXh0X0F1dG9OYW1lUmVzb2x1dGlvbigpCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBib29sZWFuIGlzQXV0b05hbWVSZXNvbHV0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0F1dG9OYW1lUmVzb2x1dGlvbiA8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0F1dG9OYW1lUmVzb2x1dGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0QXV0b05hbWVSZXNvbHV0aW9uKGJvb2xlYW4gdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9XU0RMMkphdmFEYXRhTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvV1NETDJKYXZhRGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NDBiZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9XU0RMMkphdmFEYXRhTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETDJKYXZhRGF0YU1vZGVsIGV4dGVuZHMgQ1hGRGF0YU1vZGVsLCBXU0RMMkphdmFDb250ZXh0IHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWVzIHRvIHVzZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEluY2x1ZGVkTmFtZXNwYWNlcyA8ZW0+SW5jbHVkZWQgTmFtZXNwYWNlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU3BlY2lmaWVzIHplcm8sIG9yIG1vcmUsIHBhY2thZ2UgbmFtZXMgdG8gdXNlIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5jbHVkZWQgTmFtZXNwYWNlczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRJbmNsdWRlZE5hbWVzcGFjZXMoTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgTGlzdCBvZiB0aGUgSkFYV1Mgb3IgSkFYQiBiaW5kaW5nIGZpbGVzIHVzZWQsIGlmIGFueS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBMaXN0PFN0cmluZz4gZ2V0QmluZGluZ0ZpbGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBqYXZhIHBhY2thZ2UgdG8gZXhjbHVkZWQgbmFtZXNwYWNlIG1hcHBpbmdzLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0RXhjbHVkZWROYW1lc3BhY2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEV4Y2x1ZGVkTmFtZXNwYWNlcyA8ZW0+RXhjbHVkZWQgTmFtZXNwYWNlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogSWdub3JlIHRoZSBzcGVjaWZpZWQgV1NETCBzY2hlbWEgbmFtZXNwYWNlIHdoZW4gZ2VuZXJhdGluZyBjb2RlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGVkIE5hbWVzcGFjZXM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEV4Y2x1ZGVkTmFtZXNwYWNlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RXhjbHVkZWROYW1lc3BhY2VzKE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2F0YWxvZyBmaWxlIHVzZWQgdG8gbWFwIHRoZSBpbXBvcnRlZCB3c2RsL3NjaGVtYQotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRDYXRhbG9nRmlsZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRDYXRhbG9nRmlsZSA8ZW0+Q2F0YWxvZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTcGVjaWZ5IGNhdGFsb2cgZmlsZSB0byBtYXAgdGhlIGltcG9ydGVkIHdzZGwvc2NoZW1hLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2cgRmlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0Q2F0YWxvZ0ZpbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldENhdGFsb2dGaWxlKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgSmF2YSBTb3VyY2UgRGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGZpbGVzIGFyZSBnZW5lcmF0ZWQuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldEphdmFTb3VyY2VGb2xkZXIoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0SmF2YVNvdXJjZUZvbGRlciA8ZW0+SmF2YSBTb3VyY2UgRm9sZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgSmF2YSBTb3VyY2UgRGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGZpbGVzIGFyZSBnZW5lcmF0ZWQuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBTb3VyY2UgRm9sZGVyPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRKYXZhU291cmNlRm9sZGVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRKYXZhU291cmNlRm9sZGVyKFN0cmluZyB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZEYXRhTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGRGF0YU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjRkY2RiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZEYXRhTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIwICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogQ1hGRGF0YU1vZGVsSW1wbC5qYXZhLHYgMS40IDIwMTAvMDEvMTcgMTk6NTY6NTYgc2NsYXJrZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRhdGEgTW9kZWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbiA8ZW0+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldERlZmF1bHRSdW50aW1lVHlwZSA8ZW0+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uIDxlbT5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNpc1ZlcmJvc2UgPGVtPlZlcmJvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSA8ZW0+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZUNsaWVudCA8ZW0+R2VuZXJhdGUgQ2xpZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVTZXJ2ZXIgPGVtPkdlbmVyYXRlIFNlcnZlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXREYXRhYmluZGluZyA8ZW0+RGF0YWJpbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0RnJvbnRlbmQgPGVtPkZyb250ZW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2lzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0IDxlbT5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIgPGVtPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRJbnN0YWxsYXRpb25zIDxlbT5JbnN0YWxsYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldFByb2plY3ROYW1lIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0UmVzb3VyY2VEaXJlY3RvcnkgPGVtPlJlc291cmNlIERpcmVjdG9yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRDbGFzc0RpcmVjdG9yeSA8ZW0+Q2xhc3MgRGlyZWN0b3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldFdzZGxGaWxlTmFtZSA8ZW0+V3NkbCBGaWxlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0V3NkbFVSTCA8ZW0+V3NkbCBVUkw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0Q29uZmlnV3NkbExvY2F0aW9uIDxlbT5Db25maWcgV3NkbCBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUgPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0Q29uZmlnSWQgPGVtPkNvbmZpZyBJZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0RW5kcG9pbnROYW1lIDxlbT5FbmRwb2ludCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldFNlcnZpY2VOYW1lIDxlbT5TZXJ2aWNlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0V3NkbERlZmluaXRpb24gPGVtPldzZGwgRGVmaW5pdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRXc2RsTG9jYXRpb24gPGVtPldzZGwgTG9jYXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDWEZEYXRhTW9kZWxJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDWEZEYXRhTW9kZWwgewotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkgPGVtPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKSA8ZW0+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSdW50aW1lTG9jYXRpb24gPSBERUZBVUxUX1JVTlRJTUVfTE9DQVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkgPGVtPkRlZmF1bHQgUnVudGltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXREZWZhdWx0UnVudGltZVR5cGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUlVOVElNRV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRSdW50aW1lVHlwZSgpIDxlbT5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSdW50aW1lVHlwZSA9IERFRkFVTFRfUlVOVElNRV9UWVBFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRSdW50aW1lVmVyc2lvbigpIDxlbT5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JVTlRJTUVfVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSA8ZW0+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldERlZmF1bHRSdW50aW1lVmVyc2lvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UnVudGltZVZlcnNpb24gPSBERUZBVUxUX1JVTlRJTUVfVkVSU0lPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZlcmJvc2UoKSA8ZW0+VmVyYm9zZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNWZXJib3NlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkVSQk9TRV9FREVGQVVMVCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZlcmJvc2UoKSA8ZW0+VmVyYm9zZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNWZXJib3NlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJib3NlID0gVkVSQk9TRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkgPGVtPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKSA8ZW0+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlQW50QnVpbGRGaWxlID0gR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUNsaWVudCgpIDxlbT5HZW5lcmF0ZSBDbGllbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVDbGllbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9DTElFTlRfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVDbGllbnQoKSA8ZW0+R2VuZXJhdGUgQ2xpZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlQ2xpZW50KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZUNsaWVudCA9IEdFTkVSQVRFX0NMSUVOVF9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlU2VydmVyKCkgPGVtPkdlbmVyYXRlIFNlcnZlcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVNlcnZlcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX1NFUlZFUl9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVNlcnZlcigpIDxlbT5HZW5lcmF0ZSBTZXJ2ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVTZXJ2ZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlU2VydmVyID0gR0VORVJBVEVfU0VSVkVSX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFiaW5kaW5nKCkgPGVtPkRhdGFiaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXREYXRhYmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRhQmluZGluZyBEQVRBQklORElOR19FREVGQVVMVCA9IERhdGFCaW5kaW5nLkpBWEI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhYmluZGluZygpIDxlbT5EYXRhYmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RGF0YWJpbmRpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBEYXRhQmluZGluZyBkYXRhYmluZGluZyA9IERBVEFCSU5ESU5HX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZyb250ZW5kKCkgPGVtPkZyb250ZW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRGcm9udGVuZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBGcm9udGVuZCBGUk9OVEVORF9FREVGQVVMVCA9IEZyb250ZW5kLkpBWFdTOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJvbnRlbmQoKSA8ZW0+RnJvbnRlbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEZyb250ZW5kKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRnJvbnRlbmQgZnJvbnRlbmQgPSBGUk9OVEVORF9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpIDxlbT5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkgPGVtPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCA9IFVTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVF9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpIDxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkgPGVtPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciA9IEVYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluc3RhbGxhdGlvbnMoKSA8ZW0+SW5zdGFsbGF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0SW5zdGFsbGF0aW9ucygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIENYRkluc3RhbGw+IGluc3RhbGxhdGlvbnM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE5hbWUoKSA8ZW0+UHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRQcm9qZWN0TmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3ROYW1lKCkgPGVtPlByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0UHJvamVjdE5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvamVjdE5hbWUgPSBQUk9KRUNUX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VEaXJlY3RvcnkoKSA8ZW0+UmVzb3VyY2UgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRSZXNvdXJjZURpcmVjdG9yeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRGlyZWN0b3J5KCkgPGVtPlJlc291cmNlIERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0UmVzb3VyY2VEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VEaXJlY3RvcnkgPSBSRVNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NEaXJlY3RvcnkoKSA8ZW0+Q2xhc3MgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDbGFzc0RpcmVjdG9yeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfRElSRUNUT1JZX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzRGlyZWN0b3J5KCkgPGVtPkNsYXNzIERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q2xhc3NEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NEaXJlY3RvcnkgPSBDTEFTU19ESVJFQ1RPUllfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbEZpbGVOYW1lKCkgPGVtPldzZGwgRmlsZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsRmlsZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRklMRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxGaWxlTmFtZSgpIDxlbT5Xc2RsIEZpbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbEZpbGVOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxGaWxlTmFtZSA9IFdTRExfRklMRV9OQU1FX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxVUkwoKSA8ZW0+V3NkbCBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxVUkwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJMIFdTRExfVVJMX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxVUkwoKSA8ZW0+V3NkbCBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxVUkwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBVUkwgd3NkbFVSTCA9IFdTRExfVVJMX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmZpZ1dzZGxMb2NhdGlvbigpIDxlbT5Db25maWcgV3NkbCBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfV1NETF9MT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25maWdXc2RsTG9jYXRpb24oKSA8ZW0+Q29uZmlnIFdzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENvbmZpZ1dzZGxMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb25maWdXc2RsTG9jYXRpb24gPSBDT05GSUdfV1NETF9MT0NBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lID0gRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkgPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkgPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUgPSBGVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25maWdJZCgpIDxlbT5Db25maWcgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENvbmZpZ0lkKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfSURfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnSWQoKSA8ZW0+Q29uZmlnIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDb25maWdJZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb25maWdJZCA9IENPTkZJR19JRF9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmRwb2ludE5hbWUoKSA8ZW0+RW5kcG9pbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RW5kcG9pbnROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRQT0lOVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuZHBvaW50TmFtZSgpIDxlbT5FbmRwb2ludCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRFbmRwb2ludE5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZW5kcG9pbnROYW1lID0gRU5EUE9JTlRfTkFNRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlTmFtZSgpIDxlbT5TZXJ2aWNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFNlcnZpY2VOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZU5hbWUoKSA8ZW0+U2VydmljZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRTZXJ2aWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlTmFtZSA9IFNFUlZJQ0VfTkFNRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsRGVmaW5pdGlvbigpIDxlbT5Xc2RsIERlZmluaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxEZWZpbml0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERlZmluaXRpb24gV1NETF9ERUZJTklUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxEZWZpbml0aW9uKCkgPGVtPldzZGwgRGVmaW5pdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbERlZmluaXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uID0gV1NETF9ERUZJTklUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxMb2NhdGlvbigpIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbExvY2F0aW9uKCkgPGVtPldzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB3c2RsTG9jYXRpb24gPSBXU0RMX0xPQ0FUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENYRkRhdGFNb2RlbEltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBDWEZQYWNrYWdlLkxpdGVyYWxzLkNYRl9EQVRBX01PREVMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRSdW50aW1lTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbihTdHJpbmcgbmV3RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbikgewotICAgICAgICBTdHJpbmcgb2xkRGVmYXVsdFJ1bnRpbWVMb2NhdGlvbiA9IGRlZmF1bHRSdW50aW1lTG9jYXRpb247Ci0gICAgICAgIGRlZmF1bHRSdW50aW1lTG9jYXRpb24gPSBuZXdEZWZhdWx0UnVudGltZUxvY2F0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04sIG9sZERlZmF1bHRSdW50aW1lTG9jYXRpb24sIGRlZmF1bHRSdW50aW1lTG9jYXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRSdW50aW1lVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0UnVudGltZVR5cGUoU3RyaW5nIG5ld0RlZmF1bHRSdW50aW1lVHlwZSkgewotICAgICAgICBTdHJpbmcgb2xkRGVmYXVsdFJ1bnRpbWVUeXBlID0gZGVmYXVsdFJ1bnRpbWVUeXBlOwotICAgICAgICBkZWZhdWx0UnVudGltZVR5cGUgPSBuZXdEZWZhdWx0UnVudGltZVR5cGU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9UWVBFLCBvbGREZWZhdWx0UnVudGltZVR5cGUsIGRlZmF1bHRSdW50aW1lVHlwZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdFJ1bnRpbWVWZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRSdW50aW1lVmVyc2lvbihTdHJpbmcgbmV3RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKSB7Ci0gICAgICAgIFN0cmluZyBvbGREZWZhdWx0UnVudGltZVZlcnNpb24gPSBkZWZhdWx0UnVudGltZVZlcnNpb247Ci0gICAgICAgIGRlZmF1bHRSdW50aW1lVmVyc2lvbiA9IG5ld0RlZmF1bHRSdW50aW1lVmVyc2lvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT04sIG9sZERlZmF1bHRSdW50aW1lVmVyc2lvbiwgZGVmYXVsdFJ1bnRpbWVWZXJzaW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWZXJib3NlKCkgewotICAgICAgICByZXR1cm4gdmVyYm9zZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gbmV3VmVyYm9zZSkgewotICAgICAgICBib29sZWFuIG9sZFZlcmJvc2UgPSB2ZXJib3NlOwotICAgICAgICB2ZXJib3NlID0gbmV3VmVyYm9zZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVkVSQk9TRSwgb2xkVmVyYm9zZSwgdmVyYm9zZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZUFudEJ1aWxkRmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUFudEJ1aWxkRmlsZShib29sZWFuIG5ld0dlbmVyYXRlQW50QnVpbGRGaWxlKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVBbnRCdWlsZEZpbGUgPSBnZW5lcmF0ZUFudEJ1aWxkRmlsZTsKLSAgICAgICAgZ2VuZXJhdGVBbnRCdWlsZEZpbGUgPSBuZXdHZW5lcmF0ZUFudEJ1aWxkRmlsZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUsIG9sZEdlbmVyYXRlQW50QnVpbGRGaWxlLCBnZW5lcmF0ZUFudEJ1aWxkRmlsZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZUNsaWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUNsaWVudChib29sZWFuIG5ld0dlbmVyYXRlQ2xpZW50KSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVDbGllbnQgPSBnZW5lcmF0ZUNsaWVudDsKLSAgICAgICAgZ2VuZXJhdGVDbGllbnQgPSBuZXdHZW5lcmF0ZUNsaWVudDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5ULCBvbGRHZW5lcmF0ZUNsaWVudCwgZ2VuZXJhdGVDbGllbnQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlU2VydmVyKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVTZXJ2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVTZXJ2ZXIoYm9vbGVhbiBuZXdHZW5lcmF0ZVNlcnZlcikgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlU2VydmVyID0gZ2VuZXJhdGVTZXJ2ZXI7Ci0gICAgICAgIGdlbmVyYXRlU2VydmVyID0gbmV3R2VuZXJhdGVTZXJ2ZXI7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUiwgb2xkR2VuZXJhdGVTZXJ2ZXIsIGdlbmVyYXRlU2VydmVyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIERhdGFCaW5kaW5nIGdldERhdGFiaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YWJpbmRpbmcoRGF0YUJpbmRpbmcgbmV3RGF0YWJpbmRpbmcpIHsKLSAgICAgICAgRGF0YUJpbmRpbmcgb2xkRGF0YWJpbmRpbmcgPSBkYXRhYmluZGluZzsKLSAgICAgICAgZGF0YWJpbmRpbmcgPSBuZXdEYXRhYmluZGluZyA9PSBudWxsID8gREFUQUJJTkRJTkdfRURFRkFVTFQgOiBuZXdEYXRhYmluZGluZzsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREFUQUJJTkRJTkcsIG9sZERhdGFiaW5kaW5nLCBkYXRhYmluZGluZykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBGcm9udGVuZCBnZXRGcm9udGVuZCgpIHsKLSAgICAgICAgcmV0dXJuIGZyb250ZW5kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZyb250ZW5kKEZyb250ZW5kIG5ld0Zyb250ZW5kKSB7Ci0gICAgICAgIEZyb250ZW5kIG9sZEZyb250ZW5kID0gZnJvbnRlbmQ7Ci0gICAgICAgIGZyb250ZW5kID0gbmV3RnJvbnRlbmQgPT0gbnVsbCA/IEZST05URU5EX0VERUZBVUxUIDogbmV3RnJvbnRlbmQ7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZST05URU5ELCBvbGRGcm9udGVuZCwgZnJvbnRlbmQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoYm9vbGVhbiBuZXdVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQgPSB1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgICAgIHVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCA9IG5ld1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhULCBvbGRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQsIHVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkgewotICAgICAgICByZXR1cm4gZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcihib29sZWFuIG5ld0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcikgewotICAgICAgICBib29sZWFuIG9sZEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciA9IGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcjsKLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyID0gbmV3RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIsIG9sZEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciwgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIENYRkluc3RhbGw+IGdldEluc3RhbGxhdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBpbnN0YWxsYXRpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluc3RhbGxhdGlvbnMoTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4gbmV3SW5zdGFsbGF0aW9ucykgewotICAgICAgICBNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiBvbGRJbnN0YWxsYXRpb25zID0gaW5zdGFsbGF0aW9uczsKLSAgICAgICAgaW5zdGFsbGF0aW9ucyA9IG5ld0luc3RhbGxhdGlvbnM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0lOU1RBTExBVElPTlMsIG9sZEluc3RhbGxhdGlvbnMsIGluc3RhbGxhdGlvbnMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotICAgICAgICByZXR1cm4gcHJvamVjdE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIG5ld1Byb2plY3ROYW1lKSB7Ci0gICAgICAgIFN0cmluZyBvbGRQcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgICAgICBwcm9qZWN0TmFtZSA9IG5ld1Byb2plY3ROYW1lOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19QUk9KRUNUX05BTUUsIG9sZFByb2plY3ROYW1lLCBwcm9qZWN0TmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VEaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZURpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZURpcmVjdG9yeShTdHJpbmcgbmV3UmVzb3VyY2VEaXJlY3RvcnkpIHsKLSAgICAgICAgU3RyaW5nIG9sZFJlc291cmNlRGlyZWN0b3J5ID0gcmVzb3VyY2VEaXJlY3Rvcnk7Ci0gICAgICAgIHJlc291cmNlRGlyZWN0b3J5ID0gbmV3UmVzb3VyY2VEaXJlY3Rvcnk7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWSwgb2xkUmVzb3VyY2VEaXJlY3RvcnksIHJlc291cmNlRGlyZWN0b3J5KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0RpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzRGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzRGlyZWN0b3J5KFN0cmluZyBuZXdDbGFzc0RpcmVjdG9yeSkgewotICAgICAgICBTdHJpbmcgb2xkQ2xhc3NEaXJlY3RvcnkgPSBjbGFzc0RpcmVjdG9yeTsKLSAgICAgICAgY2xhc3NEaXJlY3RvcnkgPSBuZXdDbGFzc0RpcmVjdG9yeTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZLCBvbGRDbGFzc0RpcmVjdG9yeSwgY2xhc3NEaXJlY3RvcnkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdzZGxGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxGaWxlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRmlsZU5hbWUoU3RyaW5nIG5ld1dzZGxGaWxlTmFtZSkgewotICAgICAgICBTdHJpbmcgb2xkV3NkbEZpbGVOYW1lID0gd3NkbEZpbGVOYW1lOwotICAgICAgICB3c2RsRmlsZU5hbWUgPSBuZXdXc2RsRmlsZU5hbWU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FLCBvbGRXc2RsRmlsZU5hbWUsIHdzZGxGaWxlTmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBVUkwgZ2V0V3NkbFVSTCgpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxVUkw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbFVSTChVUkwgbmV3V3NkbFVSTCkgewotICAgICAgICBVUkwgb2xkV3NkbFVSTCA9IHdzZGxVUkw7Ci0gICAgICAgIHdzZGxVUkwgPSBuZXdXc2RsVVJMOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX1VSTCwgb2xkV3NkbFVSTCwgd3NkbFVSTCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gY29uZmlnV3NkbExvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ1dzZGxMb2NhdGlvbihTdHJpbmcgbmV3Q29uZmlnV3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBvbGRDb25maWdXc2RsTG9jYXRpb24gPSBjb25maWdXc2RsTG9jYXRpb247Ci0gICAgICAgIGNvbmZpZ1dzZGxMb2NhdGlvbiA9IG5ld0NvbmZpZ1dzZGxMb2NhdGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT04sIG9sZENvbmZpZ1dzZGxMb2NhdGlvbiwgY29uZmlnV3NkbExvY2F0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKFN0cmluZyBuZXdGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUpIHsKLSAgICAgICAgU3RyaW5nIG9sZEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSA9IGZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZTsKLSAgICAgICAgZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lID0gbmV3RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FLCBvbGRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUsIGZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZShTdHJpbmcgbmV3RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSkgewotICAgICAgICBTdHJpbmcgb2xkRnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSA9IGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWU7Ci0gICAgICAgIGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUgPSBuZXdGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRSwgb2xkRnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSwgZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnSWQoKSB7Ci0gICAgICAgIHJldHVybiBjb25maWdJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdJZChTdHJpbmcgbmV3Q29uZmlnSWQpIHsKLSAgICAgICAgU3RyaW5nIG9sZENvbmZpZ0lkID0gY29uZmlnSWQ7Ci0gICAgICAgIGNvbmZpZ0lkID0gbmV3Q29uZmlnSWQ7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRCwgb2xkQ29uZmlnSWQsIGNvbmZpZ0lkKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBuZXdUYXJnZXROYW1lc3BhY2UpIHsKLSAgICAgICAgU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gbmV3VGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFLCBvbGRUYXJnZXROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnROYW1lKCkgewotICAgICAgICByZXR1cm4gZW5kcG9pbnROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50TmFtZShTdHJpbmcgbmV3RW5kcG9pbnROYW1lKSB7Ci0gICAgICAgIFN0cmluZyBvbGRFbmRwb2ludE5hbWUgPSBlbmRwb2ludE5hbWU7Ci0gICAgICAgIGVuZHBvaW50TmFtZSA9IG5ld0VuZHBvaW50TmFtZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRSwgb2xkRW5kcG9pbnROYW1lLCBlbmRwb2ludE5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIG5ld1NlcnZpY2VOYW1lKSB7Ci0gICAgICAgIFN0cmluZyBvbGRTZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICBzZXJ2aWNlTmFtZSA9IG5ld1NlcnZpY2VOYW1lOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19TRVJWSUNFX05BTUUsIG9sZFNlcnZpY2VOYW1lLCBzZXJ2aWNlTmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFdzZGxEZWZpbml0aW9uKCkgewotICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbERlZmluaXRpb24oRGVmaW5pdGlvbiBuZXdXc2RsRGVmaW5pdGlvbikgewotICAgICAgICBEZWZpbml0aW9uIG9sZFdzZGxEZWZpbml0aW9uID0gd3NkbERlZmluaXRpb247Ci0gICAgICAgIHdzZGxEZWZpbml0aW9uID0gbmV3V3NkbERlZmluaXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTiwgb2xkV3NkbERlZmluaXRpb24sIHdzZGxEZWZpbml0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXc2RsTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB3c2RsTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbExvY2F0aW9uKFN0cmluZyBuZXdXc2RsTG9jYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG9sZFdzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvbjsKLSAgICAgICAgd3NkbExvY2F0aW9uID0gbmV3V3NkbExvY2F0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OLCBvbGRXc2RsTG9jYXRpb24sIHdzZGxMb2NhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9UWVBFOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0UnVudGltZVR5cGUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19WRVJCT1NFOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1ZlcmJvc2UoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5UOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlQ2xpZW50KCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZVNlcnZlcigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19EQVRBQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGF0YWJpbmRpbmcoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlJPTlRFTkQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEZyb250ZW5kKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19JTlNUQUxMQVRJT05TOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbnN0YWxsYXRpb25zKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvamVjdE5hbWUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZURpcmVjdG9yeSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzRGlyZWN0b3J5KCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRXc2RsRmlsZU5hbWUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9VUkw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFdzZGxVUkwoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbmZpZ1dzZGxMb2NhdGlvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX0lEOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb25maWdJZCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RW5kcG9pbnROYW1lKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZU5hbWUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRXc2RsRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRXc2RsTG9jYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9UWVBFOgotICAgICAgICAgICAgICAgIHNldERlZmF1bHRSdW50aW1lVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OOgotICAgICAgICAgICAgICAgIHNldERlZmF1bHRSdW50aW1lVmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0U6Ci0gICAgICAgICAgICAgICAgc2V0VmVyYm9zZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRToKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZUFudEJ1aWxkRmlsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9DTElFTlQ6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVDbGllbnQoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlU2VydmVyKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RBVEFCSU5ESU5HOgotICAgICAgICAgICAgICAgIHNldERhdGFiaW5kaW5nKChEYXRhQmluZGluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GUk9OVEVORDoKLSAgICAgICAgICAgICAgICBzZXRGcm9udGVuZCgoRnJvbnRlbmQpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOgotICAgICAgICAgICAgICAgIHNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI6Ci0gICAgICAgICAgICAgICAgc2V0RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0lOU1RBTExBVElPTlM6Ci0gICAgICAgICAgICAgICAgc2V0SW5zdGFsbGF0aW9ucygoTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FOgotICAgICAgICAgICAgICAgIHNldFByb2plY3ROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHNldFJlc291cmNlRGlyZWN0b3J5KChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHNldENsYXNzRGlyZWN0b3J5KChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0V3NkbEZpbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9VUkw6Ci0gICAgICAgICAgICAgICAgc2V0V3NkbFVSTCgoVVJMKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHNldENvbmZpZ1dzZGxMb2NhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRDoKLSAgICAgICAgICAgICAgICBzZXRDb25maWdJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0U6Ci0gICAgICAgICAgICAgICAgc2V0VGFyZ2V0TmFtZXNwYWNlKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRFbmRwb2ludE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19TRVJWSUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0U2VydmljZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT046Ci0gICAgICAgICAgICAgICAgc2V0V3NkbERlZmluaXRpb24oKERlZmluaXRpb24pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRXc2RsTG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHNldERlZmF1bHRSdW50aW1lTG9jYXRpb24oREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9UWVBFOgotICAgICAgICAgICAgICAgIHNldERlZmF1bHRSdW50aW1lVHlwZShERUZBVUxUX1JVTlRJTUVfVFlQRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICBzZXREZWZhdWx0UnVudGltZVZlcnNpb24oREVGQVVMVF9SVU5USU1FX1ZFUlNJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVkVSQk9TRToKLSAgICAgICAgICAgICAgICBzZXRWZXJib3NlKFZFUkJPU0VfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVBbnRCdWlsZEZpbGUoR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5UOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlQ2xpZW50KEdFTkVSQVRFX0NMSUVOVF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVI6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVTZXJ2ZXIoR0VORVJBVEVfU0VSVkVSX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RBVEFCSU5ESU5HOgotICAgICAgICAgICAgICAgIHNldERhdGFiaW5kaW5nKERBVEFCSU5ESU5HX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZST05URU5EOgotICAgICAgICAgICAgICAgIHNldEZyb250ZW5kKEZST05URU5EX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDoKLSAgICAgICAgICAgICAgICBzZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjoKLSAgICAgICAgICAgICAgICBzZXRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0lOU1RBTExBVElPTlM6Ci0gICAgICAgICAgICAgICAgc2V0SW5zdGFsbGF0aW9ucygoTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4pbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19QUk9KRUNUX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0UHJvamVjdE5hbWUoUFJPSkVDVF9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICBzZXRSZXNvdXJjZURpcmVjdG9yeShSRVNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHNldENsYXNzRGlyZWN0b3J5KENMQVNTX0RJUkVDVE9SWV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRXc2RsRmlsZU5hbWUoV1NETF9GSUxFX05BTUVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9VUkw6Ci0gICAgICAgICAgICAgICAgc2V0V3NkbFVSTChXU0RMX1VSTF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRDb25maWdXc2RsTG9jYXRpb24oQ09ORklHX1dTRExfTE9DQVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKEZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRDoKLSAgICAgICAgICAgICAgICBzZXRDb25maWdJZChDT05GSUdfSURfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRToKLSAgICAgICAgICAgICAgICBzZXRUYXJnZXROYW1lc3BhY2UoVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FOgotICAgICAgICAgICAgICAgIHNldEVuZHBvaW50TmFtZShFTkRQT0lOVF9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRTZXJ2aWNlTmFtZShTRVJWSUNFX05BTUVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OOgotICAgICAgICAgICAgICAgIHNldFdzZGxEZWZpbml0aW9uKFdTRExfREVGSU5JVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHNldFdzZGxMb2NhdGlvbihXU0RMX0xPQ0FUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBERUZBVUxUX1JVTlRJTUVfTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRSdW50aW1lTG9jYXRpb24gIT0gbnVsbCA6ICFERUZBVUxUX1JVTlRJTUVfTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRSdW50aW1lTG9jYXRpb24pOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVFlQRToKLSAgICAgICAgICAgICAgICByZXR1cm4gREVGQVVMVF9SVU5USU1FX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRSdW50aW1lVHlwZSAhPSBudWxsIDogIURFRkFVTFRfUlVOVElNRV9UWVBFX0VERUZBVUxULmVxdWFscyhkZWZhdWx0UnVudGltZVR5cGUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gREVGQVVMVF9SVU5USU1FX1ZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRSdW50aW1lVmVyc2lvbiAhPSBudWxsIDogIURFRkFVTFRfUlVOVElNRV9WRVJTSU9OX0VERUZBVUxULmVxdWFscyhkZWZhdWx0UnVudGltZVZlcnNpb24pOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19WRVJCT1NFOgotICAgICAgICAgICAgICAgIHJldHVybiB2ZXJib3NlICE9IFZFUkJPU0VfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUFudEJ1aWxkRmlsZSAhPSBHRU5FUkFURV9BTlRfQlVJTERfRklMRV9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5UOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUNsaWVudCAhPSBHRU5FUkFURV9DTElFTlRfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVTZXJ2ZXIgIT0gR0VORVJBVEVfU0VSVkVSX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19EQVRBQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmcgIT0gREFUQUJJTkRJTkdfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZST05URU5EOgotICAgICAgICAgICAgICAgIHJldHVybiBmcm9udGVuZCAhPSBGUk9OVEVORF9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOgotICAgICAgICAgICAgICAgIHJldHVybiB1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQgIT0gVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciAhPSBFWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0lOU1RBTExBVElPTlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxhdGlvbnMgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBQUk9KRUNUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHByb2plY3ROYW1lICE9IG51bGwgOiAhUFJPSkVDVF9OQU1FX0VERUZBVUxULmVxdWFscyhwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxUID09IG51bGwgPyByZXNvdXJjZURpcmVjdG9yeSAhPSBudWxsIDogIVJFU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVC5lcXVhbHMocmVzb3VyY2VEaXJlY3RvcnkpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENMQVNTX0RJUkVDVE9SWV9FREVGQVVMVCA9PSBudWxsID8gY2xhc3NEaXJlY3RvcnkgIT0gbnVsbCA6ICFDTEFTU19ESVJFQ1RPUllfRURFRkFVTFQuZXF1YWxzKGNsYXNzRGlyZWN0b3J5KTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdTRExfRklMRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyB3c2RsRmlsZU5hbWUgIT0gbnVsbCA6ICFXU0RMX0ZJTEVfTkFNRV9FREVGQVVMVC5lcXVhbHMod3NkbEZpbGVOYW1lKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9VUkw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdTRExfVVJMX0VERUZBVUxUID09IG51bGwgPyB3c2RsVVJMICE9IG51bGwgOiAhV1NETF9VUkxfRURFRkFVTFQuZXF1YWxzKHdzZGxVUkwpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gQ09ORklHX1dTRExfTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGNvbmZpZ1dzZGxMb2NhdGlvbiAhPSBudWxsIDogIUNPTkZJR19XU0RMX0xPQ0FUSU9OX0VERUZBVUxULmVxdWFscyhjb25maWdXc2RsTG9jYXRpb24pOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBGVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FX0VERUZBVUxUID09IG51bGwgPyBmdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUgIT0gbnVsbCA6ICFGVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhmdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUgIT0gbnVsbCA6ICFGVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRV9FREVGQVVMVC5lcXVhbHMoZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gQ09ORklHX0lEX0VERUZBVUxUID09IG51bGwgPyBjb25maWdJZCAhPSBudWxsIDogIUNPTkZJR19JRF9FREVGQVVMVC5lcXVhbHMoY29uZmlnSWQpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICAgICAgICAgIHJldHVybiBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID09IG51bGwgPyB0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCA6ICFUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxULmVxdWFscyh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBFTkRQT0lOVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlbmRwb2ludE5hbWUgIT0gbnVsbCA6ICFFTkRQT0lOVF9OQU1FX0VERUZBVUxULmVxdWFscyhlbmRwb2ludE5hbWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19TRVJWSUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNFUlZJQ0VfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VydmljZU5hbWUgIT0gbnVsbCA6ICFTRVJWSUNFX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBXU0RMX0RFRklOSVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxEZWZpbml0aW9uICE9IG51bGwgOiAhV1NETF9ERUZJTklUSU9OX0VERUZBVUxULmVxdWFscyh3c2RsRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdTRExfTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxMb2NhdGlvbiAhPSBudWxsIDogIVdTRExfTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIChkZWZhdWx0UnVudGltZUxvY2F0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChkZWZhdWx0UnVudGltZUxvY2F0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0UnVudGltZVR5cGU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGRlZmF1bHRSdW50aW1lVHlwZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFJ1bnRpbWVWZXJzaW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChkZWZhdWx0UnVudGltZVZlcnNpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZlcmJvc2U6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHZlcmJvc2UpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlQW50QnVpbGRGaWxlOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZUFudEJ1aWxkRmlsZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVDbGllbnQ6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlQ2xpZW50KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZVNlcnZlcjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVTZXJ2ZXIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGRhdGFiaW5kaW5nOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChkYXRhYmluZGluZyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZnJvbnRlbmQ6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGZyb250ZW5kKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB1c2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQ6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGluc3RhbGxhdGlvbnM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGluc3RhbGxhdGlvbnMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHByb2plY3ROYW1lOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VEaXJlY3Rvcnk6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHJlc291cmNlRGlyZWN0b3J5KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjbGFzc0RpcmVjdG9yeTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoY2xhc3NEaXJlY3RvcnkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHdzZGxGaWxlTmFtZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQod3NkbEZpbGVOYW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB3c2RsVVJMOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh3c2RsVVJMKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb25maWdXc2RsTG9jYXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGNvbmZpZ1dzZGxMb2NhdGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChmdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbmZpZ0lkOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChjb25maWdJZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdGFyZ2V0TmFtZXNwYWNlOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGVuZHBvaW50TmFtZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZW5kcG9pbnROYW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBzZXJ2aWNlTmFtZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoc2VydmljZU5hbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHdzZGxEZWZpbml0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh3c2RsRGVmaW5pdGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgd3NkbExvY2F0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh3c2RsTG9jYXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0gLy9DWEZEYXRhTW9kZWxJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzdjNjExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogQ1hGRmFjdG9yeUltcGwuamF2YSx2IDEuMiAyMDEwLzAxLzE3IDE5OjU2OjU2IHNjbGFya2UgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLio7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIENYRkZhY3RvcnkgewotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENYRkZhY3RvcnkgaW5pdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENYRkZhY3RvcnkgdGhlQ1hGRmFjdG9yeSA9IChDWEZGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC5lY29yZSIpOyAKLSAgICAgICAgICAgIGlmICh0aGVDWEZGYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhlQ1hGRmFjdG9yeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBDWEZGYWN0b3J5SW1wbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIENYRkZhY3RvcnlJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0gICAgICAgIHN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUphdmEyV1NEYXRhTW9kZWwoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUw6IHJldHVybiAoRU9iamVjdCljcmVhdGVXU0RMMkphdmFEYXRhTW9kZWwoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNYRkluc3RhbGwoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuRlJPTlRFTkQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb250ZW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuREFUQV9CSU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVEYXRhQmluZGluZ0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLlVSTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVVJMRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuREVGSU5JVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRGVmaW5pdGlvbkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLk1BUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlTWFwRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSU1FVEhPRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSU1ldGhvZEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5GUk9OVEVORDoKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydEZyb250ZW5kVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5EQVRBX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnREYXRhQmluZGluZ1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuVVJMOgotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VVJMVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5ERUZJTklUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0RGVmaW5pdGlvblRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuTUFQOgotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0TWFwVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5JTUVUSE9EOgotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0SU1ldGhvZFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSmF2YTJXU0RhdGFNb2RlbCBjcmVhdGVKYXZhMldTRGF0YU1vZGVsKCkgewotICAgICAgICBKYXZhMldTRGF0YU1vZGVsSW1wbCBqYXZhMldTRGF0YU1vZGVsID0gbmV3IEphdmEyV1NEYXRhTW9kZWxJbXBsKCk7Ci0gICAgICAgIHJldHVybiBqYXZhMldTRGF0YU1vZGVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMkphdmFEYXRhTW9kZWwgY3JlYXRlV1NETDJKYXZhRGF0YU1vZGVsKCkgewotICAgICAgICBXU0RMMkphdmFEYXRhTW9kZWxJbXBsIHdzZGwySmF2YURhdGFNb2RlbCA9IG5ldyBXU0RMMkphdmFEYXRhTW9kZWxJbXBsKCk7Ci0gICAgICAgIHJldHVybiB3c2RsMkphdmFEYXRhTW9kZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIENYRkluc3RhbGwgY3JlYXRlQ1hGSW5zdGFsbCgpIHsKLSAgICAgICAgQ1hGSW5zdGFsbEltcGwgY3hmSW5zdGFsbCA9IG5ldyBDWEZJbnN0YWxsSW1wbCgpOwotICAgICAgICByZXR1cm4gY3hmSW5zdGFsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRnJvbnRlbmQgY3JlYXRlRnJvbnRlbmRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLSAgICAgICAgRnJvbnRlbmQgcmVzdWx0ID0gRnJvbnRlbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydEZyb250ZW5kVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIERhdGFCaW5kaW5nIGNyZWF0ZURhdGFCaW5kaW5nRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0gICAgICAgIERhdGFCaW5kaW5nIHJlc3VsdCA9IERhdGFCaW5kaW5nLmdldChpbml0aWFsVmFsdWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnREYXRhQmluZGluZ1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBVUkwgY3JlYXRlVVJMRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAoVVJMKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFVSTFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBjcmVhdGVEZWZpbml0aW9uRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAoRGVmaW5pdGlvbilzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnREZWZpbml0aW9uVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBNYXA8PywgPz4gY3JlYXRlTWFwRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAoTWFwPD8sID8+KXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoaW5pdGlhbFZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRNYXBUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotICAgICAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGluc3RhbmNlVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJTWV0aG9kIGNyZWF0ZUlNZXRob2RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIChJTWV0aG9kKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydElNZXRob2RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotICAgICAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIENYRlBhY2thZ2UgZ2V0Q1hGUGFja2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIChDWEZQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgQ1hGUGFja2FnZSBnZXRQYWNrYWdlKCkgewotICAgICAgICByZXR1cm4gQ1hGUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgfQotCi19IC8vQ1hGRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZJbnN0YWxsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRkluc3RhbGxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzI4MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRkluc3RhbGxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZJbnN0YWxsSW1wbC5qYXZhLHYgMS4xIDIwMTAvMDEvMTcgMTk6NTY6NTYgc2NsYXJrZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnN0YWxsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZJbnN0YWxsSW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZJbnN0YWxsSW1wbCNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkluc3RhbGxJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZJbnN0YWxsSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ1hGSW5zdGFsbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0VmVyc2lvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb24oKSA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldExvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0TG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb24gPSBMT0NBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFR5cGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRUeXBlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENYRkluc3RhbGxJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gQ1hGUGFja2FnZS5MaXRlcmFscy5DWEZfSU5TVEFMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLSAgICAgICAgU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICB2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbmV3TG9jYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG9sZExvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgICAgIGxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX0xPQ0FUSU9OLCBvbGRMb2NhdGlvbiwgbG9jYXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLSAgICAgICAgU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotICAgICAgICB0eXBlID0gbmV3VHlwZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fVkVSU0lPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19MT0NBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fVFlQRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHNldExvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fVFlQRToKLSAgICAgICAgICAgICAgICBzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHNldExvY2F0aW9uKExPQ0FUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX1RZUEU6Ci0gICAgICAgICAgICAgICAgc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fVkVSU0lPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19MT0NBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxvY2F0aW9uICE9IG51bGwgOiAhTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fVFlQRToKLSAgICAgICAgICAgICAgICByZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiAodmVyc2lvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbG9jYXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGxvY2F0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh0eXBlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi19IC8vQ1hGSW5zdGFsbEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZQYWNrYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRlBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTA0MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRlBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogQ1hGUGFja2FnZUltcGwuamF2YSx2IDEuNiAyMDEwLzAxLzE3IDE5OjU2OjU2IHNjbGFya2UgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FR2VuZXJpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5Gcm9udGVuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENYRlBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ1hGUGFja2FnZSB7Ci0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgY3hmQ29udGV4dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBjeGZEYXRhTW9kZWxFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgamF2YTJXU0NvbnRleHRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgamF2YTJXU0RhdGFNb2RlbEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyB3c2RsMkphdmFDb250ZXh0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBjeGZJbnN0YWxsRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUVudW0gZnJvbnRlbmRFRW51bSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVFbnVtIGRhdGFCaW5kaW5nRUVudW0gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRGF0YVR5cGUgdXJsRURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIGRlZmluaXRpb25FRGF0YVR5cGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRGF0YVR5cGUgbWFwRURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIGlNZXRob2RFRGF0YVR5cGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotICAgICAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0gICAgICogcGFja2FnZSBVUkkgdmFsdWUuCi0gICAgICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotICAgICAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0gICAgICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLSAgICAgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZU5TX1VSSQotICAgICAqIEBzZWUgI2luaXQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIENYRlBhY2thZ2VJbXBsKCkgewotICAgICAgICBzdXBlcihlTlNfVVJJLCBDWEZGYWN0b3J5LmVJTlNUQU5DRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgotICAgICAqIAotICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgQ1hGUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KLSAgICAgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZU5TX1VSSQotICAgICAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ1hGUGFja2FnZSBpbml0KCkgewotICAgICAgICBpZiAoaXNJbml0ZWQpIHJldHVybiAoQ1hGUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDWEZQYWNrYWdlLmVOU19VUkkpOwotCi0gICAgICAgIC8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLSAgICAgICAgQ1hGUGFja2FnZUltcGwgdGhlQ1hGUGFja2FnZSA9IChDWEZQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgQ1hGUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgQ1hGUGFja2FnZUltcGwoKSk7Ci0KLSAgICAgICAgaXNJbml0ZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0gICAgICAgIHRoZUNYRlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotICAgICAgICB0aGVDWEZQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotICAgICAgICAvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0gICAgICAgIHRoZUNYRlBhY2thZ2UuZnJlZXplKCk7Ci0KLSAgCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQotICAgICAgICBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoQ1hGUGFja2FnZS5lTlNfVVJJLCB0aGVDWEZQYWNrYWdlKTsKLSAgICAgICAgcmV0dXJuIHRoZUNYRlBhY2thZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRDWEZDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gY3hmQ29udGV4dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9WZXJib3NlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfR2VuZXJhdGVBbnRCdWlsZEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZUNsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0dlbmVyYXRlU2VydmVyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRGF0YWJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9Gcm9udGVuZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9JbnN0YWxsYXRpb25zKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldENYRkRhdGFNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIGN4ZkRhdGFNb2RlbEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfUHJvamVjdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfUmVzb3VyY2VEaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfQ2xhc3NEaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfV3NkbEZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1dzZGxVUkwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfQ29uZmlnV3NkbExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0Z1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9GdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0NvbmZpZ0lkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1RhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9FbmRwb2ludE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1NlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Xc2RsRGVmaW5pdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfV3NkbExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SmF2YTJXU0NvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhMldTQ29udGV4dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9Tb2FwMTJCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0NvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVhTREltcG9ydHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV1NETCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0NvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0NvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0NvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEphdmEyV1NEYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhMldTRGF0YU1vZGVsRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfQ2xhc3NwYXRoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfSmF2YVN0YXJ0aW5nUG9pbnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9Vc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9FeHRyYWN0SW50ZXJmYWNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX01ldGhvZE1hcCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX0Fubm90YXRpb25NYXAoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9Tb3VyY2VEaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9Qb3J0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFdTREwySmF2YUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsMkphdmFDb250ZXh0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1Byb2Nlc3NTT0FQSGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9WYWxpZGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1dzZGxWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfVXNlRGVmYXVsdFZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY0FyZ3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Ob0FkZHJlc3NCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjVXNlRGVmYXVsdFZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nU2ltcGxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY0xvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjU3luY01ldGhvZHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjTWFya0dlbmVyYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNFcGlzb2RlRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9BdXRvTmFtZVJlc29sdXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YURhdGFNb2RlbF9JbmNsdWRlZE5hbWVzcGFjZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfQmluZGluZ0ZpbGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0V4Y2x1ZGVkTmFtZXNwYWNlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YURhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YURhdGFNb2RlbF9DYXRhbG9nRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YURhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YURhdGFNb2RlbF9KYXZhU291cmNlRm9sZGVyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRDWEZJbnN0YWxsKCkgewotICAgICAgICByZXR1cm4gY3hmSW5zdGFsbEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZJbnN0YWxsX1ZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZJbnN0YWxsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGSW5zdGFsbF9Mb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4Zkluc3RhbGxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZJbnN0YWxsX1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZJbnN0YWxsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVFbnVtIGdldEZyb250ZW5kKCkgewotICAgICAgICByZXR1cm4gZnJvbnRlbmRFRW51bTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUVudW0gZ2V0RGF0YUJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhQmluZGluZ0VFbnVtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0VVJMKCkgewotICAgICAgICByZXR1cm4gdXJsRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0RGVmaW5pdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlZmluaXRpb25FRGF0YVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVEYXRhVHlwZSBnZXRNYXAoKSB7Ci0gICAgICAgIHJldHVybiBtYXBFRGF0YVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVEYXRhVHlwZSBnZXRJTWV0aG9kKCkgewotICAgICAgICByZXR1cm4gaU1ldGhvZEVEYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGRmFjdG9yeSBnZXRDWEZGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gKENYRkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotICAgICAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0gICAgICAgIGlmIChpc0NyZWF0ZWQpIHJldHVybjsKLSAgICAgICAgaXNDcmVhdGVkID0gdHJ1ZTsKLQotICAgICAgICAvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLSAgICAgICAgY3hmQ29udGV4dEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDWEZfQ09OVEVYVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9UWVBFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19WRVJCT1NFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVIpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19EQVRBQklORElORyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0ZST05URU5EKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fSU5TVEFMTEFUSU9OUyk7Ci0KLSAgICAgICAgY3hmRGF0YU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKENYRl9EQVRBX01PREVMKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19QUk9KRUNUX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fV1NETF9VUkwpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fQ09ORklHX0lEKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19TRVJWSUNFX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTik7Ci0KLSAgICAgICAgamF2YTJXU0NvbnRleHRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSkFWQTJfV1NfQ09OVEVYVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX1NPQVAxMl9CSU5ESU5HKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTQ29udGV4dEVDbGFzcywgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfWFNEX0lNUE9SVFMpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XU0RMKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTQ29udGV4dEVDbGFzcywgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTQ29udGV4dEVDbGFzcywgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTQ29udGV4dEVDbGFzcywgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTik7Ci0KLSAgICAgICAgamF2YTJXU0RhdGFNb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBMl9XU19EQVRBX01PREVMKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19DTEFTU1BBVEgpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MsIEpBVkEyX1dTX0RBVEFfTU9ERUxfX0pBVkFfU1RBUlRJTkdfUE9JTlQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MsIEpBVkEyX1dTX0RBVEFfTU9ERUxfX1VTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhUUkFDVF9JTlRFUkZBQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MsIEpBVkEyX1dTX0RBVEFfTU9ERUxfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MsIEpBVkEyX1dTX0RBVEFfTU9ERUxfX01FVEhPRF9NQVApOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MsIEpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fTUFQKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19TT1VSQ0VfRElSRUNUT1JZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19QT1JUX05BTUUpOwotCi0gICAgICAgIHdzZGwySmF2YUNvbnRleHRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV1NETDJfSkFWQV9DT05URVhUKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1BST0NFU1NfU09BUF9IRUFERVJTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkcpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1ZBTElEQVRFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1dTRExfVkVSU0lPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19VU0VfREVGQVVMVF9WQUxVRVMpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0FSR1MpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fTk9fQUREUkVTU19CSU5ESU5HKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19TSU1QTEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0xPQ0FUT1IpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1NZTkNfTUVUSE9EUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19YSkNfTUFSS19HRU5FUkFURUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0VQSVNPREVfRklMRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19BVVRPX05BTUVfUkVTT0xVVElPTik7Ci0KLSAgICAgICAgd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdTREwyX0pBVkFfREFUQV9NT0RFTCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0lOQ0xVREVEX05BTUVTUEFDRVMpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcywgV1NETDJfSkFWQV9EQVRBX01PREVMX19CSU5ESU5HX0ZJTEVTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MsIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhDTFVERURfTkFNRVNQQUNFUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NBVEFMT0dfRklMRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0pBVkFfU09VUkNFX0ZPTERFUik7Ci0KLSAgICAgICAgY3hmSW5zdGFsbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDWEZfSU5TVEFMTCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmSW5zdGFsbEVDbGFzcywgQ1hGX0lOU1RBTExfX1ZFUlNJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4Zkluc3RhbGxFQ2xhc3MsIENYRl9JTlNUQUxMX19MT0NBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmSW5zdGFsbEVDbGFzcywgQ1hGX0lOU1RBTExfX1RZUEUpOwotCi0gICAgICAgIC8vIENyZWF0ZSBlbnVtcwotICAgICAgICBmcm9udGVuZEVFbnVtID0gY3JlYXRlRUVudW0oRlJPTlRFTkQpOwotICAgICAgICBkYXRhQmluZGluZ0VFbnVtID0gY3JlYXRlRUVudW0oREFUQV9CSU5ESU5HKTsKLQotICAgICAgICAvLyBDcmVhdGUgZGF0YSB0eXBlcwotICAgICAgICB1cmxFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVVJMKTsKLSAgICAgICAgZGVmaW5pdGlvbkVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShERUZJTklUSU9OKTsKLSAgICAgICAgbWFwRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKE1BUCk7Ci0gICAgICAgIGlNZXRob2RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoSU1FVEhPRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0gICAgICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotICAgICAgICBpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIHBhY2thZ2UKLSAgICAgICAgc2V0TmFtZShlTkFNRSk7Ci0gICAgICAgIHNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotICAgICAgICBzZXROc1VSSShlTlNfVVJJKTsKLQotICAgICAgICAvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0gICAgICAgIGFkZEVUeXBlUGFyYW1ldGVyKG1hcEVEYXRhVHlwZSwgIlQiKTsKLSAgICAgICAgYWRkRVR5cGVQYXJhbWV0ZXIobWFwRURhdGFUeXBlLCAiVDEiKTsKLQotICAgICAgICAvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotICAgICAgICAvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0gICAgICAgIGN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENYRkNvbnRleHQoKSk7Ci0gICAgICAgIGphdmEyV1NDb250ZXh0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q1hGQ29udGV4dCgpKTsKLSAgICAgICAgamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENYRkRhdGFNb2RlbCgpKTsKLSAgICAgICAgamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmEyV1NDb250ZXh0KCkpOwotICAgICAgICB3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q1hGQ29udGV4dCgpKTsKLSAgICAgICAgd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q1hGRGF0YU1vZGVsKCkpOwotICAgICAgICB3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXU0RMMkphdmFDb250ZXh0KCkpOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0gICAgICAgIGluaXRFQ2xhc3MoY3hmQ29udGV4dEVDbGFzcywgQ1hGQ29udGV4dC5jbGFzcywgIkNYRkNvbnRleHQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlZmF1bHRSdW50aW1lTG9jYXRpb24iLCBudWxsLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVmYXVsdFJ1bnRpbWVUeXBlIiwgbnVsbCwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZVZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlZmF1bHRSdW50aW1lVmVyc2lvbiIsIG51bGwsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfVmVyYm9zZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInZlcmJvc2UiLCAidHJ1ZSIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfR2VuZXJhdGVBbnRCdWlsZEZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZUFudEJ1aWxkRmlsZSIsICJmYWxzZSIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfR2VuZXJhdGVDbGllbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZUNsaWVudCIsICJmYWxzZSIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfR2VuZXJhdGVTZXJ2ZXIoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVNlcnZlciIsICJmYWxzZSIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfRGF0YWJpbmRpbmcoKSwgdGhpcy5nZXREYXRhQmluZGluZygpLCAiZGF0YWJpbmRpbmciLCAiamF4YiIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfRnJvbnRlbmQoKSwgdGhpcy5nZXRGcm9udGVuZCgpLCAiZnJvbnRlbmQiLCAiamF4d3MiLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCIsICJ0cnVlIiwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9FeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIiLCAidHJ1ZSIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIEVHZW5lcmljVHlwZSBnMSA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RU1hcCgpKTsKLSAgICAgICAgRUdlbmVyaWNUeXBlIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoaXMuZ2V0Q1hGSW5zdGFsbCgpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X0luc3RhbGxhdGlvbnMoKSwgZzEsICJpbnN0YWxsYXRpb25zIiwgbnVsbCwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZEYXRhTW9kZWwuY2xhc3MsICJDWEZEYXRhTW9kZWwiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX1Byb2plY3ROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwcm9qZWN0TmFtZSIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX1Jlc291cmNlRGlyZWN0b3J5KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZXNvdXJjZURpcmVjdG9yeSIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX0NsYXNzRGlyZWN0b3J5KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjbGFzc0RpcmVjdG9yeSIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX1dzZGxGaWxlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbEZpbGVOYW1lIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfV3NkbFVSTCgpLCB0aGlzLmdldFVSTCgpLCAid3NkbFVSTCIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX0NvbmZpZ1dzZGxMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29uZmlnV3NkbExvY2F0aW9uIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfRnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJmdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9GdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfQ29uZmlnSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbmZpZ0lkIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfVGFyZ2V0TmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YXJnZXROYW1lc3BhY2UiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9FbmRwb2ludE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVuZHBvaW50TmFtZSIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX1NlcnZpY2VOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2aWNlTmFtZSIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX1dzZGxEZWZpbml0aW9uKCksIHRoaXMuZ2V0RGVmaW5pdGlvbigpLCAid3NkbERlZmluaXRpb24iLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9Xc2RsTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxMb2NhdGlvbiIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKYXZhMldTQ29udGV4dC5jbGFzcywgIkphdmEyV1NDb250ZXh0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0NvbnRleHRfU29hcDEyQmluZGluZygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInNvYXAxMkJpbmRpbmciLCAiZmFsc2UiLCAwLCAxLCBKYXZhMldTQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVYU0RJbXBvcnRzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVYU0RJbXBvcnRzIiwgInRydWUiLCAwLCAxLCBKYXZhMldTQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXU0RMKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVXU0RMIiwgInRydWUiLCAwLCAxLCBKYXZhMldTQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMiLCAidHJ1ZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9Bbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQiLCAiZmFsc2UiLCAwLCAxLCBKYXZhMldTQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uIiwgImZhbHNlIiwgMCwgMSwgSmF2YTJXU0NvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24iLCAiZmFsc2UiLCAwLCAxLCBKYXZhMldTQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiIsICJmYWxzZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24iLCAiZmFsc2UiLCAwLCAxLCBKYXZhMldTQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICJKYXZhMldTRGF0YU1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTRGF0YU1vZGVsX0NsYXNzcGF0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY2xhc3NwYXRoIiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0RhdGFNb2RlbF9KYXZhU3RhcnRpbmdQb2ludCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF2YVN0YXJ0aW5nUG9pbnQiLCBudWxsLCAwLCAxLCBKYXZhMldTRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTRGF0YU1vZGVsX1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfRXh0cmFjdEludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImV4dHJhY3RJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBKYXZhMldTRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTRGF0YU1vZGVsX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUiLCBudWxsLCAwLCAxLCBKYXZhMldTRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBnMSA9IGNyZWF0ZUVHZW5lcmljVHlwZSh0aGlzLmdldE1hcCgpKTsKLSAgICAgICAgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhpcy5nZXRJTWV0aG9kKCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoaXMuZ2V0TWFwKCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIEVHZW5lcmljVHlwZSBnMyA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpKTsKLSAgICAgICAgZzIuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzMpOwotICAgICAgICBnMyA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW5PYmplY3QoKSk7Ci0gICAgICAgIGcyLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGczKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0RhdGFNb2RlbF9NZXRob2RNYXAoKSwgZzEsICJtZXRob2RNYXAiLCBudWxsLCAwLCAxLCBKYXZhMldTRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBnMSA9IGNyZWF0ZUVHZW5lcmljVHlwZSh0aGlzLmdldE1hcCgpKTsKLSAgICAgICAgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSk7Ci0gICAgICAgIGcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKLSAgICAgICAgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfQW5ub3RhdGlvbk1hcCgpLCBnMSwgImFubm90YXRpb25NYXAiLCBudWxsLCAwLCAxLCBKYXZhMldTRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTRGF0YU1vZGVsX1NvdXJjZURpcmVjdG9yeSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic291cmNlRGlyZWN0b3J5IiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0RhdGFNb2RlbF9Qb3J0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydE5hbWUiLCBudWxsLCAwLCAxLCBKYXZhMldTRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3Mod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIldTREwySmF2YUNvbnRleHQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZUltcGxlbWVudGF0aW9uIiwgInRydWUiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1Byb2Nlc3NTT0FQSGVhZGVycygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInByb2Nlc3NTT0FQSGVhZGVycyIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyIsICJ0cnVlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9Mb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nIiwgInRydWUiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1ZhbGlkYXRlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidmFsaWRhdGUiLCAidHJ1ZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfV3NkbFZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxWZXJzaW9uIiwgIjEuMSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfVXNlRGVmYXVsdFZhbHVlcygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVzZURlZmF1bHRWYWx1ZXMiLCAidHJ1ZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjQXJncygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAieGpjQXJncyIsIG51bGwsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfTm9BZGRyZXNzQmluZGluZygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgIm5vQWRkcmVzc0JpbmRpbmciLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1hqY1VzZURlZmF1bHRWYWx1ZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ4amNVc2VEZWZhdWx0VmFsdWVzIiwgImZhbHNlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInhqY1RvU3RyaW5nIiwgImZhbHNlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ011bHRpTGluZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInhqY1RvU3RyaW5nTXVsdGlMaW5lIiwgImZhbHNlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ1NpbXBsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInhqY1RvU3RyaW5nU2ltcGxlIiwgImZhbHNlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9YamNMb2NhdG9yKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAieGpjTG9jYXRvciIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjU3luY01ldGhvZHMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ4amNTeW5jTWV0aG9kcyIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjTWFya0dlbmVyYXRlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInhqY01hcmtHZW5lcmF0ZWQiLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1hqY0VwaXNvZGVGaWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ4amNFcGlzb2RlRmlsZSIsIG51bGwsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfQXV0b05hbWVSZXNvbHV0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiYXV0b05hbWVSZXNvbHV0aW9uIiwgImZhbHNlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcywgV1NETDJKYXZhRGF0YU1vZGVsLmNsYXNzLCAiV1NETDJKYXZhRGF0YU1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBnMSA9IGNyZWF0ZUVHZW5lcmljVHlwZSh0aGlzLmdldE1hcCgpKTsKLSAgICAgICAgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSk7Ci0gICAgICAgIGcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKLSAgICAgICAgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSk7Ci0gICAgICAgIGcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0luY2x1ZGVkTmFtZXNwYWNlcygpLCBnMSwgImluY2x1ZGVkTmFtZXNwYWNlcyIsIG51bGwsIDAsIDEsIFdTREwySmF2YURhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0JpbmRpbmdGaWxlcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYmluZGluZ0ZpbGVzIiwgbnVsbCwgMCwgLTEsIFdTREwySmF2YURhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgZzEgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhpcy5nZXRNYXAoKSk7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIGcyID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YURhdGFNb2RlbF9FeGNsdWRlZE5hbWVzcGFjZXMoKSwgZzEsICJleGNsdWRlZE5hbWVzcGFjZXMiLCBudWxsLCAwLCAxLCBXU0RMMkphdmFEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YURhdGFNb2RlbF9DYXRhbG9nRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY2F0YWxvZ0ZpbGUiLCBudWxsLCAwLCAxLCBXU0RMMkphdmFEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YURhdGFNb2RlbF9KYXZhU291cmNlRm9sZGVyKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJqYXZhU291cmNlRm9sZGVyIiwgbnVsbCwgMCwgMSwgV1NETDJKYXZhRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoY3hmSW5zdGFsbEVDbGFzcywgQ1hGSW5zdGFsbC5jbGFzcywgIkNYRkluc3RhbGwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkluc3RhbGxfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIENYRkluc3RhbGwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkluc3RhbGxfTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgQ1hGSW5zdGFsbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGSW5zdGFsbF9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgQ1hGSW5zdGFsbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotICAgICAgICBpbml0RUVudW0oZnJvbnRlbmRFRW51bSwgRnJvbnRlbmQuY2xhc3MsICJGcm9udGVuZCIpOwotICAgICAgICBhZGRFRW51bUxpdGVyYWwoZnJvbnRlbmRFRW51bSwgRnJvbnRlbmQuSkFYV1MpOwotCi0gICAgICAgIGluaXRFRW51bShkYXRhQmluZGluZ0VFbnVtLCBEYXRhQmluZGluZy5jbGFzcywgIkRhdGFCaW5kaW5nIik7Ci0gICAgICAgIGFkZEVFbnVtTGl0ZXJhbChkYXRhQmluZGluZ0VFbnVtLCBEYXRhQmluZGluZy5KQVhCKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLSAgICAgICAgaW5pdEVEYXRhVHlwZSh1cmxFRGF0YVR5cGUsIGphdmEubmV0LlVSTC5jbGFzcywgIlVSTCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFRGF0YVR5cGUoZGVmaW5pdGlvbkVEYXRhVHlwZSwgRGVmaW5pdGlvbi5jbGFzcywgIkRlZmluaXRpb24iLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RURhdGFUeXBlKG1hcEVEYXRhVHlwZSwgTWFwLmNsYXNzLCAiTWFwIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVEYXRhVHlwZShpTWV0aG9kRURhdGFUeXBlLCBJTWV0aG9kLmNsYXNzLCAiSU1ldGhvZCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHJlc291cmNlCi0gICAgICAgIGNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotICAgIH0KLQotfSAvL0NYRlBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvSmF2YTJXU0RhdGFNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9KYXZhMldTRGF0YU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU3NGNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9KYXZhMldTRGF0YU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyNCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IEphdmEyV1NEYXRhTW9kZWxJbXBsLmphdmEsdiAxLjMgMjAxMC8wMS8xNyAxOTo1Njo1NiBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkphdmEyIFdTIERhdGEgTW9kZWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzU29hcDEyQmluZGluZyA8ZW0+U29hcDEyIEJpbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVYU0RJbXBvcnRzIDxlbT5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZVdTREwgPGVtPkdlbmVyYXRlIFdTREw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyA8ZW0+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQgPGVtPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2dldENsYXNzcGF0aCA8ZW0+Q2xhc3NwYXRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNnZXRKYXZhU3RhcnRpbmdQb2ludCA8ZW0+SmF2YSBTdGFydGluZyBQb2ludDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNFeHRyYWN0SW50ZXJmYWNlIDxlbT5FeHRyYWN0IEludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjZ2V0TWV0aG9kTWFwIDxlbT5NZXRob2QgTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNnZXRBbm5vdGF0aW9uTWFwIDxlbT5Bbm5vdGF0aW9uIE1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjZ2V0U291cmNlRGlyZWN0b3J5IDxlbT5Tb3VyY2UgRGlyZWN0b3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RhdGFNb2RlbEltcGwgZXh0ZW5kcyBDWEZEYXRhTW9kZWxJbXBsIGltcGxlbWVudHMgSmF2YTJXU0RhdGFNb2RlbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU29hcDEyQmluZGluZygpIDxlbT5Tb2FwMTIgQmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNTb2FwMTJCaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU09BUDEyX0JJTkRJTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU29hcDEyQmluZGluZygpIDxlbT5Tb2FwMTIgQmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNTb2FwMTJCaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzb2FwMTJCaW5kaW5nID0gU09BUDEyX0JJTkRJTkdfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVhTREltcG9ydHMoKSA8ZW0+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVYU0RJbXBvcnRzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfWFNEX0lNUE9SVFNfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVhTREltcG9ydHMoKSA8ZW0+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVYU0RJbXBvcnRzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZVhTREltcG9ydHMgPSBHRU5FUkFURV9YU0RfSU1QT1JUU19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlV1NETCgpIDxlbT5HZW5lcmF0ZSBXU0RMPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV1NETCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX1dTRExfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdTREwoKSA8ZW0+R2VuZXJhdGUgV1NETDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdTREwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlV1NETCA9IEdFTkVSQVRFX1dTRExfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkgPGVtPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlNfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkgPGVtPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyA9IEdFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlNfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSA8ZW0+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRURfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkgPGVtPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkID0gQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRURfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uID0gR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpIDxlbT5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24gPSBHRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkgPGVtPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uID0gR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgUmVzcG9uc2UgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uID0gR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzcGF0aCgpIDxlbT5DbGFzc3BhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENsYXNzcGF0aCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzcGF0aCgpIDxlbT5DbGFzc3BhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENsYXNzcGF0aCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjbGFzc3BhdGggPSBDTEFTU1BBVEhfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSA8ZW0+SmF2YSBTdGFydGluZyBQb2ludDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfU1RBUlRJTkdfUE9JTlRfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSA8ZW0+SmF2YSBTdGFydGluZyBQb2ludDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgamF2YVN0YXJ0aW5nUG9pbnQgPSBKQVZBX1NUQVJUSU5HX1BPSU5UX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgPGVtPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgPGVtPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IFVTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4dHJhY3RJbnRlcmZhY2UoKSA8ZW0+RXh0cmFjdCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzRXh0cmFjdEludGVyZmFjZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYVFJBQ1RfSU5URVJGQUNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4dHJhY3RJbnRlcmZhY2UoKSA8ZW0+RXh0cmFjdCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzRXh0cmFjdEludGVyZmFjZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXh0cmFjdEludGVyZmFjZSA9IEVYVFJBQ1RfSU5URVJGQUNFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSA9IFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RNYXAoKSA8ZW0+TWV0aG9kIE1hcDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0TWV0aG9kTWFwKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBtZXRob2RNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbm5vdGF0aW9uTWFwKCkgPGVtPkFubm90YXRpb24gTWFwPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRBbm5vdGF0aW9uTWFwKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgQm9vbGVhbj4gYW5ub3RhdGlvbk1hcDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2VEaXJlY3RvcnkoKSA8ZW0+U291cmNlIERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0U291cmNlRGlyZWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZURpcmVjdG9yeSgpIDxlbT5Tb3VyY2UgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRTb3VyY2VEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgc291cmNlRGlyZWN0b3J5ID0gU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZSgpIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFBvcnROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWUoKSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRQb3J0TmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwb3J0TmFtZSA9IFBPUlRfTkFNRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBKYXZhMldTRGF0YU1vZGVsSW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIENYRlBhY2thZ2UuTGl0ZXJhbHMuSkFWQTJfV1NfREFUQV9NT0RFTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NvYXAxMkJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzb2FwMTJCaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvYXAxMkJpbmRpbmcoYm9vbGVhbiBuZXdTb2FwMTJCaW5kaW5nKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkU29hcDEyQmluZGluZyA9IHNvYXAxMkJpbmRpbmc7Ci0gICAgICAgIHNvYXAxMkJpbmRpbmcgPSBuZXdTb2FwMTJCaW5kaW5nOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPQVAxMl9CSU5ESU5HLCBvbGRTb2FwMTJCaW5kaW5nLCBzb2FwMTJCaW5kaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVhTREltcG9ydHMoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVhTREltcG9ydHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGJvb2xlYW4gbmV3R2VuZXJhdGVYU0RJbXBvcnRzKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVYU0RJbXBvcnRzID0gZ2VuZXJhdGVYU0RJbXBvcnRzOwotICAgICAgICBnZW5lcmF0ZVhTREltcG9ydHMgPSBuZXdHZW5lcmF0ZVhTREltcG9ydHM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFMsIG9sZEdlbmVyYXRlWFNESW1wb3J0cywgZ2VuZXJhdGVYU0RJbXBvcnRzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVdTREwoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVdTREw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVXU0RMKGJvb2xlYW4gbmV3R2VuZXJhdGVXU0RMKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVXU0RMID0gZ2VuZXJhdGVXU0RMOwotICAgICAgICBnZW5lcmF0ZVdTREwgPSBuZXdHZW5lcmF0ZVdTREw7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1NETCwgb2xkR2VuZXJhdGVXU0RMLCBnZW5lcmF0ZVdTREwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoYm9vbGVhbiBuZXdHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyA9IGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnM7Ci0gICAgICAgIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMgPSBuZXdHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMsIG9sZEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMsIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoYm9vbGVhbiBuZXdBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQgPSBhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQ7Ci0gICAgICAgIGFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCA9IG5ld0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRCwgb2xkQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkLCBhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oYm9vbGVhbiBuZXdHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24gPSBnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb247Ci0gICAgICAgIGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiA9IG5ld0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04sIG9sZEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiwgZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKGJvb2xlYW4gbmV3R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiA9IGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uOwotICAgICAgICBnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiA9IG5ld0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OLCBvbGRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiwgZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oYm9vbGVhbiBuZXdHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbikgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uID0gZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb247Ci0gICAgICAgIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uID0gbmV3R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04sIG9sZEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uLCBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbihib29sZWFuIG5ld0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbikgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiA9IGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbjsKLSAgICAgICAgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uID0gbmV3R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTiwgb2xkR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uLCBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoU3RyaW5nIG5ld0NsYXNzcGF0aCkgewotICAgICAgICBTdHJpbmcgb2xkQ2xhc3NwYXRoID0gY2xhc3NwYXRoOwotICAgICAgICBjbGFzc3BhdGggPSBuZXdDbGFzc3BhdGg7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NQQVRILCBvbGRDbGFzc3BhdGgsIGNsYXNzcGF0aCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhU3RhcnRpbmdQb2ludDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU3RhcnRpbmdQb2ludChTdHJpbmcgbmV3SmF2YVN0YXJ0aW5nUG9pbnQpIHsKLSAgICAgICAgU3RyaW5nIG9sZEphdmFTdGFydGluZ1BvaW50ID0gamF2YVN0YXJ0aW5nUG9pbnQ7Ci0gICAgICAgIGphdmFTdGFydGluZ1BvaW50ID0gbmV3SmF2YVN0YXJ0aW5nUG9pbnQ7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fSkFWQV9TVEFSVElOR19QT0lOVCwgb2xkSmF2YVN0YXJ0aW5nUG9pbnQsIGphdmFTdGFydGluZ1BvaW50KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiB1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKGJvb2xlYW4gbmV3VXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gdXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotICAgICAgICB1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBuZXdVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFLCBvbGRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UsIHVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXh0cmFjdEludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGV4dHJhY3RJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXh0cmFjdEludGVyZmFjZShib29sZWFuIG5ld0V4dHJhY3RJbnRlcmZhY2UpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRFeHRyYWN0SW50ZXJmYWNlID0gZXh0cmFjdEludGVyZmFjZTsKLSAgICAgICAgZXh0cmFjdEludGVyZmFjZSA9IG5ld0V4dHJhY3RJbnRlcmZhY2U7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhUUkFDVF9JTlRFUkZBQ0UsIG9sZEV4dHJhY3RJbnRlcmZhY2UsIGV4dHJhY3RJbnRlcmZhY2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoU3RyaW5nIG5ld1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUgPSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lOwotICAgICAgICBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lID0gbmV3U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FLCBvbGRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gZ2V0TWV0aG9kTWFwKCkgewotICAgICAgICByZXR1cm4gbWV0aG9kTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZE1hcChNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG5ld01ldGhvZE1hcCkgewotICAgICAgICBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG9sZE1ldGhvZE1hcCA9IG1ldGhvZE1hcDsKLSAgICAgICAgbWV0aG9kTWFwID0gbmV3TWV0aG9kTWFwOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX01FVEhPRF9NQVAsIG9sZE1ldGhvZE1hcCwgbWV0aG9kTWFwKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIEJvb2xlYW4+IGdldEFubm90YXRpb25NYXAoKSB7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFubm90YXRpb25NYXAoTWFwPFN0cmluZywgQm9vbGVhbj4gbmV3QW5ub3RhdGlvbk1hcCkgewotICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBvbGRBbm5vdGF0aW9uTWFwID0gYW5ub3RhdGlvbk1hcDsKLSAgICAgICAgYW5ub3RhdGlvbk1hcCA9IG5ld0Fubm90YXRpb25NYXA7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9NQVAsIG9sZEFubm90YXRpb25NYXAsIGFubm90YXRpb25NYXApKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZURpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZURpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VEaXJlY3RvcnkoU3RyaW5nIG5ld1NvdXJjZURpcmVjdG9yeSkgewotICAgICAgICBTdHJpbmcgb2xkU291cmNlRGlyZWN0b3J5ID0gc291cmNlRGlyZWN0b3J5OwotICAgICAgICBzb3VyY2VEaXJlY3RvcnkgPSBuZXdTb3VyY2VEaXJlY3Rvcnk7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWSwgb2xkU291cmNlRGlyZWN0b3J5LCBzb3VyY2VEaXJlY3RvcnkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIG5ld1BvcnROYW1lKSB7Ci0gICAgICAgIFN0cmluZyBvbGRQb3J0TmFtZSA9IHBvcnROYW1lOwotICAgICAgICBwb3J0TmFtZSA9IG5ld1BvcnROYW1lOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1BPUlRfTkFNRSwgb2xkUG9ydE5hbWUsIHBvcnROYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPQVAxMl9CSU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1NvYXAxMkJpbmRpbmcoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9YU0RfSU1QT1JUUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZVhTREltcG9ydHMoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XU0RMOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlV1NETCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0NMQVNTUEFUSDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fSkFWQV9TVEFSVElOR19QT0lOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19VU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhUUkFDVF9JTlRFUkZBQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzRXh0cmFjdEludGVyZmFjZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19NRVRIT0RfTUFQOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRNZXRob2RNYXAoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX01BUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbk1hcCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPVVJDRV9ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFNvdXJjZURpcmVjdG9yeSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1BPUlRfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UG9ydE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPQVAxMl9CSU5ESU5HOgotICAgICAgICAgICAgICAgIHNldFNvYXAxMkJpbmRpbmcoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9YU0RfSU1QT1JUUzoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVhTREltcG9ydHMoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XU0RMOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlV1NETCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOgotICAgICAgICAgICAgICAgIHNldEFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0NMQVNTUEFUSDoKLSAgICAgICAgICAgICAgICBzZXRDbGFzc3BhdGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0pBVkFfU1RBUlRJTkdfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgc2V0SmF2YVN0YXJ0aW5nUG9pbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1VTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICBzZXRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19FWFRSQUNUX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICBzZXRFeHRyYWN0SW50ZXJmYWNlKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19NRVRIT0RfTUFQOgotICAgICAgICAgICAgICAgIHNldE1ldGhvZE1hcCgoTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fTUFQOgotICAgICAgICAgICAgICAgIHNldEFubm90YXRpb25NYXAoKE1hcDxTdHJpbmcsIEJvb2xlYW4+KW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICBzZXRTb3VyY2VEaXJlY3RvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1BPUlRfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRQb3J0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPQVAxMl9CSU5ESU5HOgotICAgICAgICAgICAgICAgIHNldFNvYXAxMkJpbmRpbmcoU09BUDEyX0JJTkRJTkdfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9YU0RfSU1QT1JUUzoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVhTREltcG9ydHMoR0VORVJBVEVfWFNEX0lNUE9SVFNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XU0RMOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlV1NETChHRU5FUkFURV9XU0RMX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUzoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKEdFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICBzZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRURfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKEdFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKEdFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKEdFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0NMQVNTUEFUSDoKLSAgICAgICAgICAgICAgICBzZXRDbGFzc3BhdGgoQ0xBU1NQQVRIX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fSkFWQV9TVEFSVElOR19QT0lOVDoKLSAgICAgICAgICAgICAgICBzZXRKYXZhU3RhcnRpbmdQb2ludChKQVZBX1NUQVJUSU5HX1BPSU5UX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgIHNldFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShVU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19FWFRSQUNUX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICBzZXRFeHRyYWN0SW50ZXJmYWNlKEVYVFJBQ1RfSU5URVJGQUNFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19NRVRIT0RfTUFQOgotICAgICAgICAgICAgICAgIHNldE1ldGhvZE1hcCgoTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiludWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9NQVA6Ci0gICAgICAgICAgICAgICAgc2V0QW5ub3RhdGlvbk1hcCgoTWFwPFN0cmluZywgQm9vbGVhbj4pbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPVVJDRV9ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgc2V0U291cmNlRGlyZWN0b3J5KFNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19QT1JUX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0UG9ydE5hbWUoUE9SVF9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT0FQMTJfQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gc29hcDEyQmluZGluZyAhPSBTT0FQMTJfQklORElOR19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9YU0RfSU1QT1JUUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVYU0RJbXBvcnRzICE9IEdFTkVSQVRFX1hTRF9JTVBPUlRTX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dTREw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlV1NETCAhPSBHRU5FUkFURV9XU0RMX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMgIT0gR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOU19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkICE9IEFOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uICE9IEdFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24gIT0gR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT05fRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uICE9IEdFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uICE9IEdFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19DTEFTU1BBVEg6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENMQVNTUEFUSF9FREVGQVVMVCA9PSBudWxsID8gY2xhc3NwYXRoICE9IG51bGwgOiAhQ0xBU1NQQVRIX0VERUZBVUxULmVxdWFscyhjbGFzc3BhdGgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0pBVkFfU1RBUlRJTkdfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEpBVkFfU1RBUlRJTkdfUE9JTlRfRURFRkFVTFQgPT0gbnVsbCA/IGphdmFTdGFydGluZ1BvaW50ICE9IG51bGwgOiAhSkFWQV9TVEFSVElOR19QT0lOVF9FREVGQVVMVC5lcXVhbHMoamF2YVN0YXJ0aW5nUG9pbnQpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1VTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gdXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlICE9IFVTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19FWFRSQUNUX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdEludGVyZmFjZSAhPSBFWFRSQUNUX0lOVEVSRkFDRV9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lICE9IG51bGwgOiAhU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fTUVUSE9EX01BUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kTWFwICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9NQVA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25NYXAgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT1VSQ0VfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHJldHVybiBTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2VEaXJlY3RvcnkgIT0gbnVsbCA6ICFTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxULmVxdWFscyhzb3VyY2VEaXJlY3RvcnkpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1BPUlRfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gUE9SVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwb3J0TmFtZSAhPSBudWxsIDogIVBPUlRfTkFNRV9FREVGQVVMVC5lcXVhbHMocG9ydE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0gICAgICAgIGlmIChiYXNlQ2xhc3MgPT0gSmF2YTJXU0NvbnRleHQuY2xhc3MpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT0FQMTJfQklORElORzogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1hTRF9JTVBPUlRTOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1NETDogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1NETDsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUzogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQ6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotICAgICAgICBpZiAoYmFzZUNsYXNzID09IEphdmEyV1NDb250ZXh0LmNsYXNzKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkc6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPQVAxMl9CSU5ESU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUzogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dTREw6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dTREw7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIChzb2FwMTJCaW5kaW5nOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChzb2FwMTJCaW5kaW5nKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZVhTREltcG9ydHM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlWFNESW1wb3J0cyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVXU0RMOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZVdTREwpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjbGFzc3BhdGg6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGNsYXNzcGF0aCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgamF2YVN0YXJ0aW5nUG9pbnQ6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGphdmFTdGFydGluZ1BvaW50KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFjdEludGVyZmFjZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZXh0cmFjdEludGVyZmFjZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbWV0aG9kTWFwOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChtZXRob2RNYXApOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGFubm90YXRpb25NYXA6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGFubm90YXRpb25NYXApOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHNvdXJjZURpcmVjdG9yeTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoc291cmNlRGlyZWN0b3J5KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwb3J0TmFtZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQocG9ydE5hbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0gLy9KYXZhMldTRGF0YU1vZGVsSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL1dTREwySmF2YURhdGFNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9XU0RMMkphdmFEYXRhTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjQxNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL1dTREwySmF2YURhdGFNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOTggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBXU0RMMkphdmFEYXRhTW9kZWxJbXBsLmphdmEsdiAxLjMgMjAxMC8wMS8xNyAxOTo1Njo1NiBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbiA8ZW0+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNQcm9jZXNzU09BUEhlYWRlcnMgPGVtPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcgPGVtPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyA8ZW0+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzVmFsaWRhdGUgPGVtPlZhbGlkYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2dldFdzZGxWZXJzaW9uIDxlbT5Xc2RsIFZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNVc2VEZWZhdWx0VmFsdWVzIDxlbT5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjZ2V0WGpjQXJncyA8ZW0+WGpjIEFyZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNOb0FkZHJlc3NCaW5kaW5nIDxlbT5ObyBBZGRyZXNzIEJpbmRpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNYamNVc2VEZWZhdWx0VmFsdWVzIDxlbT5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzWGpjVG9TdHJpbmcgPGVtPlhqYyBUbyBTdHJpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNYamNUb1N0cmluZ011bHRpTGluZSA8ZW0+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzWGpjVG9TdHJpbmdTaW1wbGUgPGVtPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzWGpjTG9jYXRvciA8ZW0+WGpjIExvY2F0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNYamNTeW5jTWV0aG9kcyA8ZW0+WGpjIFN5bmMgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc1hqY01hcmtHZW5lcmF0ZWQgPGVtPlhqYyBNYXJrIEdlbmVyYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNnZXRYamNFcGlzb2RlRmlsZSA8ZW0+WGpjIEVwaXNvZGUgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc0F1dG9OYW1lUmVzb2x1dGlvbiA8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjZ2V0SW5jbHVkZWROYW1lc3BhY2VzIDxlbT5JbmNsdWRlZCBOYW1lc3BhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2dldEJpbmRpbmdGaWxlcyA8ZW0+QmluZGluZyBGaWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNnZXRFeGNsdWRlZE5hbWVzcGFjZXMgPGVtPkV4Y2x1ZGVkIE5hbWVzcGFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjZ2V0Q2F0YWxvZ0ZpbGUgPGVtPkNhdGFsb2cgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNnZXRKYXZhU291cmNlRm9sZGVyIDxlbT5KYXZhIFNvdXJjZSBGb2xkZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFEYXRhTW9kZWxJbXBsIGV4dGVuZHMgQ1hGRGF0YU1vZGVsSW1wbCBpbXBsZW1lbnRzIFdTREwySmF2YURhdGFNb2RlbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpIDxlbT5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfSU1QTEVNRU5UQVRJT05fRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkgPGVtPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlSW1wbGVtZW50YXRpb24gPSBHRU5FUkFURV9JTVBMRU1FTlRBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb2Nlc3NTT0FQSGVhZGVycygpIDxlbT5Qcm9jZXNzIFNPQVAgSGVhZGVyczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNQcm9jZXNzU09BUEhlYWRlcnMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9DRVNTX1NPQVBfSEVBREVSU19FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm9jZXNzU09BUEhlYWRlcnMoKSA8ZW0+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzUHJvY2Vzc1NPQVBIZWFkZXJzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzU09BUEhlYWRlcnMgPSBQUk9DRVNTX1NPQVBfSEVBREVSU19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkgPGVtPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSA8ZW0+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcgPSBMT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSA8ZW0+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSA8ZW0+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyA9IExPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElOR19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZhbGlkYXRlKCkgPGVtPlZhbGlkYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1ZhbGlkYXRlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkFMSURBVEVfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNWYWxpZGF0ZSgpIDxlbT5WYWxpZGF0ZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNWYWxpZGF0ZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUgPSBWQUxJREFURV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsVmVyc2lvbigpIDxlbT5Xc2RsIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxWZXJzaW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1ZFUlNJT05fRURFRkFVTFQgPSAiMS4xIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxWZXJzaW9uKCkgPGVtPldzZGwgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbFZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgd3NkbFZlcnNpb24gPSBXU0RMX1ZFUlNJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVc2VEZWZhdWx0VmFsdWVzKCkgPGVtPlVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNVc2VEZWZhdWx0VmFsdWVzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX0RFRkFVTFRfVkFMVUVTX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlRGVmYXVsdFZhbHVlcygpIDxlbT5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzVXNlRGVmYXVsdFZhbHVlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlRGVmYXVsdFZhbHVlcyA9IFVTRV9ERUZBVUxUX1ZBTFVFU19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYamNBcmdzKCkgPGVtPlhqYyBBcmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRYamNBcmdzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfQVJHU19FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYamNBcmdzKCkgPGVtPlhqYyBBcmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRYamNBcmdzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHhqY0FyZ3MgPSBYSkNfQVJHU19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05vQWRkcmVzc0JpbmRpbmcoKSA8ZW0+Tm8gQWRkcmVzcyBCaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc05vQWRkcmVzc0JpbmRpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBOT19BRERSRVNTX0JJTkRJTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTm9BZGRyZXNzQmluZGluZygpIDxlbT5ObyBBZGRyZXNzIEJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzTm9BZGRyZXNzQmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbm9BZGRyZXNzQmluZGluZyA9IE5PX0FERFJFU1NfQklORElOR19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSA8ZW0+WGpjIFVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gWEpDX1VTRV9ERUZBVUxUX1ZBTFVFU19FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkgPGVtPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjVXNlRGVmYXVsdFZhbHVlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4geGpjVXNlRGVmYXVsdFZhbHVlcyA9IFhKQ19VU0VfREVGQVVMVF9WQUxVRVNfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNUb1N0cmluZygpIDxlbT5YamMgVG8gU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gWEpDX1RPX1NUUklOR19FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNUb1N0cmluZygpIDxlbT5YamMgVG8gU3RyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB4amNUb1N0cmluZyA9IFhKQ19UT19TVFJJTkdfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNUb1N0cmluZ011bHRpTGluZSgpIDxlbT5YamMgVG8gU3RyaW5nIE11bHRpIExpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYSkNfVE9fU1RSSU5HX01VTFRJX0xJTkVfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSA8ZW0+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB4amNUb1N0cmluZ011bHRpTGluZSA9IFhKQ19UT19TVFJJTkdfTVVMVElfTElORV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1RvU3RyaW5nU2ltcGxlKCkgPGVtPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1RvU3RyaW5nU2ltcGxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gWEpDX1RPX1NUUklOR19TSU1QTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjVG9TdHJpbmdTaW1wbGUoKSA8ZW0+WGpjIFRvIFN0cmluZyBTaW1wbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjVG9TdHJpbmdTaW1wbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHhqY1RvU3RyaW5nU2ltcGxlID0gWEpDX1RPX1NUUklOR19TSU1QTEVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNMb2NhdG9yKCkgPGVtPlhqYyBMb2NhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY0xvY2F0b3IoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYSkNfTE9DQVRPUl9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNMb2NhdG9yKCkgPGVtPlhqYyBMb2NhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY0xvY2F0b3IoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHhqY0xvY2F0b3IgPSBYSkNfTE9DQVRPUl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1N5bmNNZXRob2RzKCkgPGVtPlhqYyBTeW5jIE1ldGhvZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjU3luY01ldGhvZHMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYSkNfU1lOQ19NRVRIT0RTX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1N5bmNNZXRob2RzKCkgPGVtPlhqYyBTeW5jIE1ldGhvZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjU3luY01ldGhvZHMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHhqY1N5bmNNZXRob2RzID0gWEpDX1NZTkNfTUVUSE9EU19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY01hcmtHZW5lcmF0ZWQoKSA8ZW0+WGpjIE1hcmsgR2VuZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY01hcmtHZW5lcmF0ZWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYSkNfTUFSS19HRU5FUkFURURfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjTWFya0dlbmVyYXRlZCgpIDxlbT5YamMgTWFyayBHZW5lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjTWFya0dlbmVyYXRlZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4geGpjTWFya0dlbmVyYXRlZCA9IFhKQ19NQVJLX0dFTkVSQVRFRF9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYamNFcGlzb2RlRmlsZSgpIDxlbT5YamMgRXBpc29kZSBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRYamNFcGlzb2RlRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX0VQSVNPREVfRklMRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYamNFcGlzb2RlRmlsZSgpIDxlbT5YamMgRXBpc29kZSBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRYamNFcGlzb2RlRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB4amNFcGlzb2RlRmlsZSA9IFhKQ19FUElTT0RFX0ZJTEVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvTmFtZVJlc29sdXRpb24oKSA8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzQXV0b05hbWVSZXNvbHV0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT19OQU1FX1JFU09MVVRJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXV0b05hbWVSZXNvbHV0aW9uKCkgPGVtPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0F1dG9OYW1lUmVzb2x1dGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYXV0b05hbWVSZXNvbHV0aW9uID0gQVVUT19OQU1FX1JFU09MVVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNsdWRlZE5hbWVzcGFjZXMoKSA8ZW0+SW5jbHVkZWQgTmFtZXNwYWNlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlZE5hbWVzcGFjZXM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCaW5kaW5nRmlsZXMoKSA8ZW0+QmluZGluZyBGaWxlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRCaW5kaW5nRmlsZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IGJpbmRpbmdGaWxlczsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVkTmFtZXNwYWNlcygpIDxlbT5FeGNsdWRlZCBOYW1lc3BhY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRFeGNsdWRlZE5hbWVzcGFjZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGV4Y2x1ZGVkTmFtZXNwYWNlczsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRhbG9nRmlsZSgpIDxlbT5DYXRhbG9nIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENhdGFsb2dGaWxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX0ZJTEVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZ0ZpbGUoKSA8ZW0+Q2F0YWxvZyBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDYXRhbG9nRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nRmlsZSA9IENBVEFMT0dfRklMRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhU291cmNlRm9sZGVyKCkgPGVtPkphdmEgU291cmNlIEZvbGRlcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0SmF2YVNvdXJjZUZvbGRlcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9TT1VSQ0VfRk9MREVSX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFTb3VyY2VGb2xkZXIoKSA8ZW0+SmF2YSBTb3VyY2UgRm9sZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRKYXZhU291cmNlRm9sZGVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGphdmFTb3VyY2VGb2xkZXIgPSBKQVZBX1NPVVJDRV9GT0xERVJfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgV1NETDJKYXZhRGF0YU1vZGVsSW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIENYRlBhY2thZ2UuTGl0ZXJhbHMuV1NETDJfSkFWQV9EQVRBX01PREVMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlSW1wbGVtZW50YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihib29sZWFuIG5ld0dlbmVyYXRlSW1wbGVtZW50YXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZUltcGxlbWVudGF0aW9uID0gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbjsKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbiA9IG5ld0dlbmVyYXRlSW1wbGVtZW50YXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTiwgb2xkR2VuZXJhdGVJbXBsZW1lbnRhdGlvbiwgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvY2Vzc1NPQVBIZWFkZXJzKCkgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1NPQVBIZWFkZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NTT0FQSGVhZGVycyhib29sZWFuIG5ld1Byb2Nlc3NTT0FQSGVhZGVycykgewotICAgICAgICBib29sZWFuIG9sZFByb2Nlc3NTT0FQSGVhZGVycyA9IHByb2Nlc3NTT0FQSGVhZGVyczsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzID0gbmV3UHJvY2Vzc1NPQVBIZWFkZXJzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fUFJPQ0VTU19TT0FQX0hFQURFUlMsIG9sZFByb2Nlc3NTT0FQSGVhZGVycywgcHJvY2Vzc1NPQVBIZWFkZXJzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpIHsKLSAgICAgICAgcmV0dXJuIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKGJvb2xlYW4gbmV3TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyA9IGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nOwotICAgICAgICBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyA9IG5ld0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORywgb2xkTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcsIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpIHsKLSAgICAgICAgcmV0dXJuIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGJvb2xlYW4gbmV3TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyA9IGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nOwotICAgICAgICBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyA9IG5ld0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HLCBvbGRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZywgbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRlKCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGUoYm9vbGVhbiBuZXdWYWxpZGF0ZSkgewotICAgICAgICBib29sZWFuIG9sZFZhbGlkYXRlID0gdmFsaWRhdGU7Ci0gICAgICAgIHZhbGlkYXRlID0gbmV3VmFsaWRhdGU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURSwgb2xkVmFsaWRhdGUsIHZhbGlkYXRlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXc2RsVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxWZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxWZXJzaW9uKFN0cmluZyBuZXdXc2RsVmVyc2lvbikgewotICAgICAgICBTdHJpbmcgb2xkV3NkbFZlcnNpb24gPSB3c2RsVmVyc2lvbjsKLSAgICAgICAgd3NkbFZlcnNpb24gPSBuZXdXc2RsVmVyc2lvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfVkVSU0lPTiwgb2xkV3NkbFZlcnNpb24sIHdzZGxWZXJzaW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VEZWZhdWx0VmFsdWVzKCkgewotICAgICAgICByZXR1cm4gdXNlRGVmYXVsdFZhbHVlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VEZWZhdWx0VmFsdWVzKGJvb2xlYW4gbmV3VXNlRGVmYXVsdFZhbHVlcykgewotICAgICAgICBib29sZWFuIG9sZFVzZURlZmF1bHRWYWx1ZXMgPSB1c2VEZWZhdWx0VmFsdWVzOwotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzID0gbmV3VXNlRGVmYXVsdFZhbHVlczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9ERUZBVUxUX1ZBTFVFUywgb2xkVXNlRGVmYXVsdFZhbHVlcywgdXNlRGVmYXVsdFZhbHVlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WGpjQXJncygpIHsKLSAgICAgICAgcmV0dXJuIHhqY0FyZ3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjQXJncyhTdHJpbmcgbmV3WGpjQXJncykgewotICAgICAgICBTdHJpbmcgb2xkWGpjQXJncyA9IHhqY0FyZ3M7Ci0gICAgICAgIHhqY0FyZ3MgPSBuZXdYamNBcmdzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0FSR1MsIG9sZFhqY0FyZ3MsIHhqY0FyZ3MpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05vQWRkcmVzc0JpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBub0FkZHJlc3NCaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vQWRkcmVzc0JpbmRpbmcoYm9vbGVhbiBuZXdOb0FkZHJlc3NCaW5kaW5nKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkTm9BZGRyZXNzQmluZGluZyA9IG5vQWRkcmVzc0JpbmRpbmc7Ci0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmcgPSBuZXdOb0FkZHJlc3NCaW5kaW5nOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTk9fQUREUkVTU19CSU5ESU5HLCBvbGROb0FkZHJlc3NCaW5kaW5nLCBub0FkZHJlc3NCaW5kaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkgewotICAgICAgICByZXR1cm4geGpjVXNlRGVmYXVsdFZhbHVlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNVc2VEZWZhdWx0VmFsdWVzKGJvb2xlYW4gbmV3WGpjVXNlRGVmYXVsdFZhbHVlcykgewotICAgICAgICBib29sZWFuIG9sZFhqY1VzZURlZmF1bHRWYWx1ZXMgPSB4amNVc2VEZWZhdWx0VmFsdWVzOwotICAgICAgICB4amNVc2VEZWZhdWx0VmFsdWVzID0gbmV3WGpjVXNlRGVmYXVsdFZhbHVlczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMsIG9sZFhqY1VzZURlZmF1bHRWYWx1ZXMsIHhqY1VzZURlZmF1bHRWYWx1ZXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1RvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4geGpjVG9TdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmcoYm9vbGVhbiBuZXdYamNUb1N0cmluZykgewotICAgICAgICBib29sZWFuIG9sZFhqY1RvU3RyaW5nID0geGpjVG9TdHJpbmc7Ci0gICAgICAgIHhqY1RvU3RyaW5nID0gbmV3WGpjVG9TdHJpbmc7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HLCBvbGRYamNUb1N0cmluZywgeGpjVG9TdHJpbmcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkgewotICAgICAgICByZXR1cm4geGpjVG9TdHJpbmdNdWx0aUxpbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoYm9vbGVhbiBuZXdYamNUb1N0cmluZ011bHRpTGluZSkgewotICAgICAgICBib29sZWFuIG9sZFhqY1RvU3RyaW5nTXVsdGlMaW5lID0geGpjVG9TdHJpbmdNdWx0aUxpbmU7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lID0gbmV3WGpjVG9TdHJpbmdNdWx0aUxpbmU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkUsIG9sZFhqY1RvU3RyaW5nTXVsdGlMaW5lLCB4amNUb1N0cmluZ011bHRpTGluZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjVG9TdHJpbmdTaW1wbGUoKSB7Ci0gICAgICAgIHJldHVybiB4amNUb1N0cmluZ1NpbXBsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZ1NpbXBsZShib29sZWFuIG5ld1hqY1RvU3RyaW5nU2ltcGxlKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkWGpjVG9TdHJpbmdTaW1wbGUgPSB4amNUb1N0cmluZ1NpbXBsZTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGUgPSBuZXdYamNUb1N0cmluZ1NpbXBsZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfU0lNUExFLCBvbGRYamNUb1N0cmluZ1NpbXBsZSwgeGpjVG9TdHJpbmdTaW1wbGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY0xvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiB4amNMb2NhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhqY0xvY2F0b3IoYm9vbGVhbiBuZXdYamNMb2NhdG9yKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkWGpjTG9jYXRvciA9IHhqY0xvY2F0b3I7Ci0gICAgICAgIHhqY0xvY2F0b3IgPSBuZXdYamNMb2NhdG9yOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1IsIG9sZFhqY0xvY2F0b3IsIHhqY0xvY2F0b3IpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1N5bmNNZXRob2RzKCkgewotICAgICAgICByZXR1cm4geGpjU3luY01ldGhvZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjU3luY01ldGhvZHMoYm9vbGVhbiBuZXdYamNTeW5jTWV0aG9kcykgewotICAgICAgICBib29sZWFuIG9sZFhqY1N5bmNNZXRob2RzID0geGpjU3luY01ldGhvZHM7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzID0gbmV3WGpjU3luY01ldGhvZHM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfU1lOQ19NRVRIT0RTLCBvbGRYamNTeW5jTWV0aG9kcywgeGpjU3luY01ldGhvZHMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY01hcmtHZW5lcmF0ZWQoKSB7Ci0gICAgICAgIHJldHVybiB4amNNYXJrR2VuZXJhdGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhqY01hcmtHZW5lcmF0ZWQoYm9vbGVhbiBuZXdYamNNYXJrR2VuZXJhdGVkKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkWGpjTWFya0dlbmVyYXRlZCA9IHhqY01hcmtHZW5lcmF0ZWQ7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWQgPSBuZXdYamNNYXJrR2VuZXJhdGVkOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX01BUktfR0VORVJBVEVELCBvbGRYamNNYXJrR2VuZXJhdGVkLCB4amNNYXJrR2VuZXJhdGVkKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRYamNFcGlzb2RlRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHhqY0VwaXNvZGVGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhqY0VwaXNvZGVGaWxlKFN0cmluZyBuZXdYamNFcGlzb2RlRmlsZSkgewotICAgICAgICBTdHJpbmcgb2xkWGpjRXBpc29kZUZpbGUgPSB4amNFcGlzb2RlRmlsZTsKLSAgICAgICAgeGpjRXBpc29kZUZpbGUgPSBuZXdYamNFcGlzb2RlRmlsZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19FUElTT0RFX0ZJTEUsIG9sZFhqY0VwaXNvZGVGaWxlLCB4amNFcGlzb2RlRmlsZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQXV0b05hbWVSZXNvbHV0aW9uKCkgewotICAgICAgICByZXR1cm4gYXV0b05hbWVSZXNvbHV0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF1dG9OYW1lUmVzb2x1dGlvbihib29sZWFuIG5ld0F1dG9OYW1lUmVzb2x1dGlvbikgewotICAgICAgICBib29sZWFuIG9sZEF1dG9OYW1lUmVzb2x1dGlvbiA9IGF1dG9OYW1lUmVzb2x1dGlvbjsKLSAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uID0gbmV3QXV0b05hbWVSZXNvbHV0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQVVUT19OQU1FX1JFU09MVVRJT04sIG9sZEF1dG9OYW1lUmVzb2x1dGlvbiwgYXV0b05hbWVSZXNvbHV0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkgewotICAgICAgICByZXR1cm4gaW5jbHVkZWROYW1lc3BhY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVkTmFtZXNwYWNlcyhNYXA8U3RyaW5nLCBTdHJpbmc+IG5ld0luY2x1ZGVkTmFtZXNwYWNlcykgewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG9sZEluY2x1ZGVkTmFtZXNwYWNlcyA9IGluY2x1ZGVkTmFtZXNwYWNlczsKLSAgICAgICAgaW5jbHVkZWROYW1lc3BhY2VzID0gbmV3SW5jbHVkZWROYW1lc3BhY2VzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSU5DTFVERURfTkFNRVNQQUNFUywgb2xkSW5jbHVkZWROYW1lc3BhY2VzLCBpbmNsdWRlZE5hbWVzcGFjZXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEJpbmRpbmdGaWxlcygpIHsKLSAgICAgICAgaWYgKGJpbmRpbmdGaWxlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBiaW5kaW5nRmlsZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19CSU5ESU5HX0ZJTEVTKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmluZGluZ0ZpbGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEV4Y2x1ZGVkTmFtZXNwYWNlcygpIHsKLSAgICAgICAgcmV0dXJuIGV4Y2x1ZGVkTmFtZXNwYWNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlZE5hbWVzcGFjZXMoTWFwPFN0cmluZywgU3RyaW5nPiBuZXdFeGNsdWRlZE5hbWVzcGFjZXMpIHsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBvbGRFeGNsdWRlZE5hbWVzcGFjZXMgPSBleGNsdWRlZE5hbWVzcGFjZXM7Ci0gICAgICAgIGV4Y2x1ZGVkTmFtZXNwYWNlcyA9IG5ld0V4Y2x1ZGVkTmFtZXNwYWNlczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0VYQ0xVREVEX05BTUVTUEFDRVMsIG9sZEV4Y2x1ZGVkTmFtZXNwYWNlcywgZXhjbHVkZWROYW1lc3BhY2VzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGNhdGFsb2dGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhdGFsb2dGaWxlKFN0cmluZyBuZXdDYXRhbG9nRmlsZSkgewotICAgICAgICBTdHJpbmcgb2xkQ2F0YWxvZ0ZpbGUgPSBjYXRhbG9nRmlsZTsKLSAgICAgICAgY2F0YWxvZ0ZpbGUgPSBuZXdDYXRhbG9nRmlsZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NBVEFMT0dfRklMRSwgb2xkQ2F0YWxvZ0ZpbGUsIGNhdGFsb2dGaWxlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhU291cmNlRm9sZGVyKCkgewotICAgICAgICByZXR1cm4gamF2YVNvdXJjZUZvbGRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU291cmNlRm9sZGVyKFN0cmluZyBuZXdKYXZhU291cmNlRm9sZGVyKSB7Ci0gICAgICAgIFN0cmluZyBvbGRKYXZhU291cmNlRm9sZGVyID0gamF2YVNvdXJjZUZvbGRlcjsKLSAgICAgICAgamF2YVNvdXJjZUZvbGRlciA9IG5ld0phdmFTb3VyY2VGb2xkZXI7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19KQVZBX1NPVVJDRV9GT0xERVIsIG9sZEphdmFTb3VyY2VGb2xkZXIsIGphdmFTb3VyY2VGb2xkZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19QUk9DRVNTX1NPQVBfSEVBREVSUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNQcm9jZXNzU09BUEhlYWRlcnMoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVkFMSURBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWRhdGUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V3NkbFZlcnNpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNVc2VEZWZhdWx0VmFsdWVzKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfQVJHUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0WGpjQXJncygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTk9fQUREUkVTU19CSU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBpc05vQWRkcmVzc0JpbmRpbmcoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzWGpjVXNlRGVmYXVsdFZhbHVlcygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNYamNUb1N0cmluZygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX1NJTVBMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNYamNUb1N0cmluZ1NpbXBsZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzWGpjTG9jYXRvcigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1NZTkNfTUVUSE9EUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNYamNTeW5jTWV0aG9kcygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX01BUktfR0VORVJBVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1hqY01hcmtHZW5lcmF0ZWQoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19FUElTT0RFX0ZJTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFhqY0VwaXNvZGVGaWxlKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19BVVRPX05BTUVfUkVTT0xVVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNBdXRvTmFtZVJlc29sdXRpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0lOQ0xVREVEX05BTUVTUEFDRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEluY2x1ZGVkTmFtZXNwYWNlcygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluZGluZ0ZpbGVzKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19FWENMVURFRF9OQU1FU1BBQ0VTOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRFeGNsdWRlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NBVEFMT0dfRklMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2F0YWxvZ0ZpbGUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0pBVkFfU09VUkNFX0ZPTERFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SmF2YVNvdXJjZUZvbGRlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19QUk9DRVNTX1NPQVBfSEVBREVSUzoKLSAgICAgICAgICAgICAgICBzZXRQcm9jZXNzU09BUEhlYWRlcnMoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkc6Ci0gICAgICAgICAgICAgICAgc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORzoKLSAgICAgICAgICAgICAgICBzZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVkFMSURBVEU6Ci0gICAgICAgICAgICAgICAgc2V0VmFsaWRhdGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICBzZXRXc2RsVmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfREVGQVVMVF9WQUxVRVM6Ci0gICAgICAgICAgICAgICAgc2V0VXNlRGVmYXVsdFZhbHVlcygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0FSR1M6Ci0gICAgICAgICAgICAgICAgc2V0WGpjQXJncygoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19OT19BRERSRVNTX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgc2V0Tm9BZGRyZXNzQmluZGluZygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICBzZXRYamNVc2VEZWZhdWx0VmFsdWVzKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HOgotICAgICAgICAgICAgICAgIHNldFhqY1RvU3RyaW5nKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU6Ci0gICAgICAgICAgICAgICAgc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfU0lNUExFOgotICAgICAgICAgICAgICAgIHNldFhqY1RvU3RyaW5nU2ltcGxlKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTE9DQVRPUjoKLSAgICAgICAgICAgICAgICBzZXRYamNMb2NhdG9yKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfU1lOQ19NRVRIT0RTOgotICAgICAgICAgICAgICAgIHNldFhqY1N5bmNNZXRob2RzKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTUFSS19HRU5FUkFURUQ6Ci0gICAgICAgICAgICAgICAgc2V0WGpjTWFya0dlbmVyYXRlZCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0VQSVNPREVfRklMRToKLSAgICAgICAgICAgICAgICBzZXRYamNFcGlzb2RlRmlsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19BVVRPX05BTUVfUkVTT0xVVElPTjoKLSAgICAgICAgICAgICAgICBzZXRBdXRvTmFtZVJlc29sdXRpb24oKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0lOQ0xVREVEX05BTUVTUEFDRVM6Ci0gICAgICAgICAgICAgICAgc2V0SW5jbHVkZWROYW1lc3BhY2VzKChNYXA8U3RyaW5nLCBTdHJpbmc+KW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19CSU5ESU5HX0ZJTEVTOgotICAgICAgICAgICAgICAgIGdldEJpbmRpbmdGaWxlcygpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgZ2V0QmluZGluZ0ZpbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19FWENMVURFRF9OQU1FU1BBQ0VTOgotICAgICAgICAgICAgICAgIHNldEV4Y2x1ZGVkTmFtZXNwYWNlcygoTWFwPFN0cmluZywgU3RyaW5nPiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQ0FUQUxPR19GSUxFOgotICAgICAgICAgICAgICAgIHNldENhdGFsb2dGaWxlKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0pBVkFfU09VUkNFX0ZPTERFUjoKLSAgICAgICAgICAgICAgICBzZXRKYXZhU291cmNlRm9sZGVyKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKEdFTkVSQVRFX0lNUExFTUVOVEFUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19QUk9DRVNTX1NPQVBfSEVBREVSUzoKLSAgICAgICAgICAgICAgICBzZXRQcm9jZXNzU09BUEhlYWRlcnMoUFJPQ0VTU19TT0FQX0hFQURFUlNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkc6Ci0gICAgICAgICAgICAgICAgc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElOR19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIHNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKExPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElOR19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVkFMSURBVEU6Ci0gICAgICAgICAgICAgICAgc2V0VmFsaWRhdGUoVkFMSURBVEVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICBzZXRXc2RsVmVyc2lvbihXU0RMX1ZFUlNJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICBzZXRVc2VEZWZhdWx0VmFsdWVzKFVTRV9ERUZBVUxUX1ZBTFVFU19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0FSR1M6Ci0gICAgICAgICAgICAgICAgc2V0WGpjQXJncyhYSkNfQVJHU19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTk9fQUREUkVTU19CSU5ESU5HOgotICAgICAgICAgICAgICAgIHNldE5vQWRkcmVzc0JpbmRpbmcoTk9fQUREUkVTU19CSU5ESU5HX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTOgotICAgICAgICAgICAgICAgIHNldFhqY1VzZURlZmF1bHRWYWx1ZXMoWEpDX1VTRV9ERUZBVUxUX1ZBTFVFU19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklORzoKLSAgICAgICAgICAgICAgICBzZXRYamNUb1N0cmluZyhYSkNfVE9fU1RSSU5HX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU6Ci0gICAgICAgICAgICAgICAgc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX1NJTVBMRToKLSAgICAgICAgICAgICAgICBzZXRYamNUb1N0cmluZ1NpbXBsZShYSkNfVE9fU1RSSU5HX1NJTVBMRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1I6Ci0gICAgICAgICAgICAgICAgc2V0WGpjTG9jYXRvcihYSkNfTE9DQVRPUl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1NZTkNfTUVUSE9EUzoKLSAgICAgICAgICAgICAgICBzZXRYamNTeW5jTWV0aG9kcyhYSkNfU1lOQ19NRVRIT0RTX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTUFSS19HRU5FUkFURUQ6Ci0gICAgICAgICAgICAgICAgc2V0WGpjTWFya0dlbmVyYXRlZChYSkNfTUFSS19HRU5FUkFURURfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19FUElTT0RFX0ZJTEU6Ci0gICAgICAgICAgICAgICAgc2V0WGpjRXBpc29kZUZpbGUoWEpDX0VQSVNPREVfRklMRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQVVUT19OQU1FX1JFU09MVVRJT046Ci0gICAgICAgICAgICAgICAgc2V0QXV0b05hbWVSZXNvbHV0aW9uKEFVVE9fTkFNRV9SRVNPTFVUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19JTkNMVURFRF9OQU1FU1BBQ0VTOgotICAgICAgICAgICAgICAgIHNldEluY2x1ZGVkTmFtZXNwYWNlcygoTWFwPFN0cmluZywgU3RyaW5nPiludWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19CSU5ESU5HX0ZJTEVTOgotICAgICAgICAgICAgICAgIGdldEJpbmRpbmdGaWxlcygpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhDTFVERURfTkFNRVNQQUNFUzoKLSAgICAgICAgICAgICAgICBzZXRFeGNsdWRlZE5hbWVzcGFjZXMoKE1hcDxTdHJpbmcsIFN0cmluZz4pbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQ0FUQUxPR19GSUxFOgotICAgICAgICAgICAgICAgIHNldENhdGFsb2dGaWxlKENBVEFMT0dfRklMRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSkFWQV9TT1VSQ0VfRk9MREVSOgotICAgICAgICAgICAgICAgIHNldEphdmFTb3VyY2VGb2xkZXIoSkFWQV9TT1VSQ0VfRk9MREVSX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uICE9IEdFTkVSQVRFX0lNUExFTUVOVEFUSU9OX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fUFJPQ0VTU19TT0FQX0hFQURFUlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NTT0FQSGVhZGVycyAhPSBQUk9DRVNTX1NPQVBfSEVBREVSU19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nICE9IExPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkdfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nICE9IExPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElOR19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1ZBTElEQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZSAhPSBWQUxJREFURV9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gV1NETF9WRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB3c2RsVmVyc2lvbiAhPSBudWxsIDogIVdTRExfVkVSU0lPTl9FREVGQVVMVC5lcXVhbHMod3NkbFZlcnNpb24pOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVVNFX0RFRkFVTFRfVkFMVUVTOgotICAgICAgICAgICAgICAgIHJldHVybiB1c2VEZWZhdWx0VmFsdWVzICE9IFVTRV9ERUZBVUxUX1ZBTFVFU19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19BUkdTOgotICAgICAgICAgICAgICAgIHJldHVybiBYSkNfQVJHU19FREVGQVVMVCA9PSBudWxsID8geGpjQXJncyAhPSBudWxsIDogIVhKQ19BUkdTX0VERUZBVUxULmVxdWFscyh4amNBcmdzKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbm9BZGRyZXNzQmluZGluZyAhPSBOT19BRERSRVNTX0JJTkRJTkdfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTOgotICAgICAgICAgICAgICAgIHJldHVybiB4amNVc2VEZWZhdWx0VmFsdWVzICE9IFhKQ19VU0VfREVGQVVMVF9WQUxVRVNfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiB4amNUb1N0cmluZyAhPSBYSkNfVE9fU1RSSU5HX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FOgotICAgICAgICAgICAgICAgIHJldHVybiB4amNUb1N0cmluZ011bHRpTGluZSAhPSBYSkNfVE9fU1RSSU5HX01VTFRJX0xJTkVfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX1NJTVBMRToKLSAgICAgICAgICAgICAgICByZXR1cm4geGpjVG9TdHJpbmdTaW1wbGUgIT0gWEpDX1RPX1NUUklOR19TSU1QTEVfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTE9DQVRPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4geGpjTG9jYXRvciAhPSBYSkNfTE9DQVRPUl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19TWU5DX01FVEhPRFM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHhqY1N5bmNNZXRob2RzICE9IFhKQ19TWU5DX01FVEhPRFNfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTUFSS19HRU5FUkFURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHhqY01hcmtHZW5lcmF0ZWQgIT0gWEpDX01BUktfR0VORVJBVEVEX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0VQSVNPREVfRklMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gWEpDX0VQSVNPREVfRklMRV9FREVGQVVMVCA9PSBudWxsID8geGpjRXBpc29kZUZpbGUgIT0gbnVsbCA6ICFYSkNfRVBJU09ERV9GSUxFX0VERUZBVUxULmVxdWFscyh4amNFcGlzb2RlRmlsZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19BVVRPX05BTUVfUkVTT0xVVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gYXV0b05hbWVSZXNvbHV0aW9uICE9IEFVVE9fTkFNRV9SRVNPTFVUSU9OX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSU5DTFVERURfTkFNRVNQQUNFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5jbHVkZWROYW1lc3BhY2VzICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19CSU5ESU5HX0ZJTEVTOgotICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nRmlsZXMgIT0gbnVsbCAmJiAhYmluZGluZ0ZpbGVzLmlzRW1wdHkoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0VYQ0xVREVEX05BTUVTUEFDRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGVkTmFtZXNwYWNlcyAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQ0FUQUxPR19GSUxFOgotICAgICAgICAgICAgICAgIHJldHVybiBDQVRBTE9HX0ZJTEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGFsb2dGaWxlICE9IG51bGwgOiAhQ0FUQUxPR19GSUxFX0VERUZBVUxULmVxdWFscyhjYXRhbG9nRmlsZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19KQVZBX1NPVVJDRV9GT0xERVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEpBVkFfU09VUkNFX0ZPTERFUl9FREVGQVVMVCA9PSBudWxsID8gamF2YVNvdXJjZUZvbGRlciAhPSBudWxsIDogIUpBVkFfU09VUkNFX0ZPTERFUl9FREVGQVVMVC5lcXVhbHMoamF2YVNvdXJjZUZvbGRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLSAgICAgICAgaWYgKGJhc2VDbGFzcyA9PSBXU0RMMkphdmFDb250ZXh0LmNsYXNzKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19QUk9DRVNTX1NPQVBfSEVBREVSUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURTogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19WQUxJREFURTsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX1ZFUlNJT046IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fV1NETF9WRVJTSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9ERUZBVUxUX1ZBTFVFUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19VU0VfREVGQVVMVF9WQUxVRVM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0FSR1M6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0FSR1M7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTk9fQUREUkVTU19CSU5ESU5HOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklORzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORTogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19TSU1QTEU6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19TSU1QTEU7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0xPQ0FUT1I6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0xPQ0FUT1I7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1NZTkNfTUVUSE9EUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfU1lOQ19NRVRIT0RTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19NQVJLX0dFTkVSQVRFRDogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTUFSS19HRU5FUkFURUQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0VQSVNPREVfRklMRTogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfRVBJU09ERV9GSUxFOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotICAgICAgICBpZiAoYmFzZUNsYXNzID09IFdTREwySmF2YUNvbnRleHQuY2xhc3MpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1BST0NFU1NfU09BUF9IRUFERVJTOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1BST0NFU1NfU09BUF9IRUFERVJTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkc6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkc6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1ZBTElEQVRFOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1ZBTElEQVRFOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1dTRExfVkVSU0lPTjogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX1ZFUlNJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9ERUZBVUxUX1ZBTFVFUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfQVJHUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfQVJHUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19OT19BRERSRVNTX0JJTkRJTkc6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTk9fQUREUkVTU19CSU5ESU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVM6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORTsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRTogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX1NJTVBMRTsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUjogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTE9DQVRPUjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfU1lOQ19NRVRIT0RTOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19TWU5DX01FVEhPRFM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19NQVJLX0dFTkVSQVRFRDsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfRVBJU09ERV9GSUxFOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19FUElTT0RFX0ZJTEU7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT046IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQVVUT19OQU1FX1JFU09MVVRJT047Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiAoZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJvY2Vzc1NPQVBIZWFkZXJzOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChwcm9jZXNzU09BUEhlYWRlcnMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmc6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB2YWxpZGF0ZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQodmFsaWRhdGUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHdzZGxWZXJzaW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh3c2RsVmVyc2lvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdXNlRGVmYXVsdFZhbHVlczogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQodXNlRGVmYXVsdFZhbHVlcyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgeGpjQXJnczogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoeGpjQXJncyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbm9BZGRyZXNzQmluZGluZzogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQobm9BZGRyZXNzQmluZGluZyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgeGpjVXNlRGVmYXVsdFZhbHVlczogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoeGpjVXNlRGVmYXVsdFZhbHVlcyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgeGpjVG9TdHJpbmc6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY1RvU3RyaW5nKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB4amNUb1N0cmluZ011bHRpTGluZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoeGpjVG9TdHJpbmdNdWx0aUxpbmUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY1RvU3RyaW5nU2ltcGxlOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh4amNUb1N0cmluZ1NpbXBsZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgeGpjTG9jYXRvcjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoeGpjTG9jYXRvcik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgeGpjU3luY01ldGhvZHM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY1N5bmNNZXRob2RzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB4amNNYXJrR2VuZXJhdGVkOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh4amNNYXJrR2VuZXJhdGVkKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB4amNFcGlzb2RlRmlsZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoeGpjRXBpc29kZUZpbGUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGF1dG9OYW1lUmVzb2x1dGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYXV0b05hbWVSZXNvbHV0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpbmNsdWRlZE5hbWVzcGFjZXM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGluY2x1ZGVkTmFtZXNwYWNlcyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgYmluZGluZ0ZpbGVzOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChiaW5kaW5nRmlsZXMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4Y2x1ZGVkTmFtZXNwYWNlczogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZXhjbHVkZWROYW1lc3BhY2VzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjYXRhbG9nRmlsZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoY2F0YWxvZ0ZpbGUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGphdmFTb3VyY2VGb2xkZXI6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGphdmFTb3VyY2VGb2xkZXIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0gLy9XU0RMMkphdmFEYXRhTW9kZWxJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL3V0aWwvQ1hGQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvdXRpbC9DWEZBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjY4ODk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvdXRpbC9DWEZBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogQ1hGQWRhcHRlckZhY3RvcnkuamF2YSx2IDEuMyAyMDEwLzAxLzE3IDE5OjU2OjU2IHNjbGFya2UgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC4qOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ1hGQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIENYRlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBDWEZBZGFwdGVyRmFjdG9yeSgpIHsKLSAgICAgICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb2RlbFBhY2thZ2UgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ1hGU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KLSAgICAgICAgbmV3IENYRlN3aXRjaDxBZGFwdGVyPigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZUNYRkNvbnRleHQoQ1hGQ29udGV4dCBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQ1hGQ29udGV4dEFkYXB0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZUNYRkRhdGFNb2RlbChDWEZEYXRhTW9kZWwgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNYRkRhdGFNb2RlbEFkYXB0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZUphdmEyV1NDb250ZXh0KEphdmEyV1NDb250ZXh0IG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVKYXZhMldTQ29udGV4dEFkYXB0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZUphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSmF2YTJXU0RhdGFNb2RlbEFkYXB0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZVdTREwySmF2YUNvbnRleHQoV1NETDJKYXZhQ29udGV4dCBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlV1NETDJKYXZhQ29udGV4dEFkYXB0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZVdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdTREwySmF2YURhdGFNb2RlbEFkYXB0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZUNYRkluc3RhbGwoQ1hGSW5zdGFsbCBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQ1hGSW5zdGFsbEFkYXB0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0gICAgICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCA8ZW0+Q29udGV4dDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVDWEZDb250ZXh0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsIDxlbT5EYXRhIE1vZGVsPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQ1hGRGF0YU1vZGVsQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQgPGVtPkphdmEyIFdTIENvbnRleHQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmEyV1NDb250ZXh0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCA8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhMldTRGF0YU1vZGVsQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCA8ZW0+V1NETDIgSmF2YSBDb250ZXh0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTREwySmF2YUNvbnRleHRBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwgPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTREwySmF2YURhdGFNb2RlbEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwgPGVtPkluc3RhbGw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQ1hGSW5zdGFsbEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0gLy9DWEZBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC91dGlsL0NYRlN3aXRjaC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC91dGlsL0NYRlN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2NjNjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvdXRpbC9DWEZTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IENYRlN3aXRjaC5qYXZhLHYgMS4yIDIwMTAvMDEvMTcgMTk6NTY6NTYgc2NsYXJrZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC4qOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENYRlN3aXRjaDxUPiB7Ci0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBDWEZQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGU3dpdGNoKCkgewotICAgICAgICBpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1vZGVsUGFja2FnZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0gICAgICAgIGlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotICAgICAgICAgICAgcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIGVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLSAgICAgICAgICAgICAgICAgICAgZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0gICAgICAgIHN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQ6IHsKLSAgICAgICAgICAgICAgICBDWEZDb250ZXh0IGN4ZkNvbnRleHQgPSAoQ1hGQ29udGV4dCl0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZUNYRkNvbnRleHQoY3hmQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMOiB7Ci0gICAgICAgICAgICAgICAgQ1hGRGF0YU1vZGVsIGN4ZkRhdGFNb2RlbCA9IChDWEZEYXRhTW9kZWwpdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VDWEZEYXRhTW9kZWwoY3hmRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDWEZDb250ZXh0KGN4ZkRhdGFNb2RlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQ6IHsKLSAgICAgICAgICAgICAgICBKYXZhMldTQ29udGV4dCBqYXZhMldTQ29udGV4dCA9IChKYXZhMldTQ29udGV4dCl0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZUphdmEyV1NDb250ZXh0KGphdmEyV1NDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDWEZDb250ZXh0KGphdmEyV1NDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTDogewotICAgICAgICAgICAgICAgIEphdmEyV1NEYXRhTW9kZWwgamF2YTJXU0RhdGFNb2RlbCA9IChKYXZhMldTRGF0YU1vZGVsKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlSmF2YTJXU0RhdGFNb2RlbChqYXZhMldTRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDWEZEYXRhTW9kZWwoamF2YTJXU0RhdGFNb2RlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSmF2YTJXU0NvbnRleHQoamF2YTJXU0RhdGFNb2RlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ1hGQ29udGV4dChqYXZhMldTRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUOiB7Ci0gICAgICAgICAgICAgICAgV1NETDJKYXZhQ29udGV4dCB3c2RsMkphdmFDb250ZXh0ID0gKFdTREwySmF2YUNvbnRleHQpdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VXU0RMMkphdmFDb250ZXh0KHdzZGwySmF2YUNvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNYRkNvbnRleHQod3NkbDJKYXZhQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTDogewotICAgICAgICAgICAgICAgIFdTREwySmF2YURhdGFNb2RlbCB3c2RsMkphdmFEYXRhTW9kZWwgPSAoV1NETDJKYXZhRGF0YU1vZGVsKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlV1NETDJKYXZhRGF0YU1vZGVsKHdzZGwySmF2YURhdGFNb2RlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ1hGRGF0YU1vZGVsKHdzZGwySmF2YURhdGFNb2RlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETDJKYXZhQ29udGV4dCh3c2RsMkphdmFEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNYRkNvbnRleHQod3NkbDJKYXZhRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTEw6IHsKLSAgICAgICAgICAgICAgICBDWEZJbnN0YWxsIGN4Zkluc3RhbGwgPSAoQ1hGSW5zdGFsbCl0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZUNYRkluc3RhbGwoY3hmSW5zdGFsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGV4dDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRleHQ8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VDWEZDb250ZXh0KENYRkNvbnRleHQgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGEgTW9kZWw8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlQ1hGRGF0YU1vZGVsKENYRkRhdGFNb2RlbCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YTIgV1MgQ29udGV4dDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEyIFdTIENvbnRleHQ8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VKYXZhMldTQ29udGV4dChKYXZhMldTQ29udGV4dCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VKYXZhMldTRGF0YU1vZGVsKEphdmEyV1NEYXRhTW9kZWwgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwyIEphdmEgQ29udGV4dDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldTREwyIEphdmEgQ29udGV4dDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZVdTREwySmF2YUNvbnRleHQoV1NETDJKYXZhQ29udGV4dCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlV1NETDJKYXZhRGF0YU1vZGVsKFdTREwySmF2YURhdGFNb2RlbCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5zdGFsbDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluc3RhbGw8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VDWEZJbnN0YWxsKENYRkluc3RhbGwgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19IC8vQ1hGU3dpdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3Jlc291cmNlcy9KYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9yZXNvdXJjZXMvSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjOGU5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3Jlc291cmNlcy9KYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBMaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IHNyYyBmb2xkZXIuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBMaXN0PElSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigpOwotCi0gICAgcHJpdmF0ZSBJUGF0aCBzb3VyY2VEaXJlY3RvcnlQYXRoOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZURpcmVjdG9yeVBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoSVBhdGggc291cmNlRGlyZWN0b3J5UGF0aCkgewotICAgICAgICB0aGlzLnNvdXJjZURpcmVjdG9yeVBhdGggPSBzb3VyY2VEaXJlY3RvcnlQYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpICE9IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgSVJlc291cmNlRGVsdGEgcm9vdERlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQotICAgICAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSUZvbGRlciBzcmNGb2xkZXIgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcihzb3VyY2VEaXJlY3RvcnlQYXRoKTsKLSAgICAgICAgSVBhdGggc3JjRm9sZGVyUGF0aCA9IHNyY0ZvbGRlci5nZXRGdWxsUGF0aCgpOwotICAgICAgICBpZiAoIXNyY0ZvbGRlclBhdGguaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgc3JjRm9sZGVyUGF0aCA9IHNyY0ZvbGRlclBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIElSZXNvdXJjZURlbHRhIGphdmFSZXNvdXJjZURlbHRhID0gcm9vdERlbHRhLmZpbmRNZW1iZXIoc3JjRm9sZGVyUGF0aCk7Ci0KLSAgICAgICAgaWYgKGphdmFSZXNvdXJjZURlbHRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhLmdldEtpbmQoKSAhPSBJUmVzb3VyY2VEZWx0YS5BRERFRCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZhUmVzb3VyY2VEZWx0YS5hY2NlcHQodmlzaXRvcik7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PElSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3Jlc291cmNlcy9XZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvcmVzb3VyY2VzL1dlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDBiMWNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvcmVzb3VyY2VzL1dlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci0KLS8qKgotICogTGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUgd2ViIHByb2plY3RzIFdlYkNvbnRlbnQgZm9sZGVyLgotICogCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotICAgIHByaXZhdGUgTGlzdDxJUmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotICAgIAotICAgIHB1YmxpYyBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkgIT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBJUmVzb3VyY2VEZWx0YSByb290RGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCi0gICAgICAgIElQYXRoIHdlYkNvbnRlbnRQYXRoID0gSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRQYXRoKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLSAgICAgICAgICAgICAgICAuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkpOwotICAgICAgICBpZiAoIXdlYkNvbnRlbnRQYXRoLmhhc1RyYWlsaW5nU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgIHdlYkNvbnRlbnRQYXRoID0gd2ViQ29udGVudFBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSVJlc291cmNlRGVsdGEgd2ViUmVzb3VyY2VEZWx0YSA9IHJvb3REZWx0YS5maW5kTWVtYmVyKHdlYkNvbnRlbnRQYXRoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAod2ViUmVzb3VyY2VEZWx0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotICAgICAgICAgICAgICAgIGlmIChkZWx0YS5nZXRLaW5kKCkgIT0gSVJlc291cmNlRGVsdGEuQURERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2ViUmVzb3VyY2VEZWx0YS5hY2NlcHQodmlzaXRvcik7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxJUmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7Ci0gICAgICAgIHJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9DWEZNb2RlbFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL0NYRk1vZGVsVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjOTc4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL0NYRk1vZGVsVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5JbXBvcnRSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5Db2RlU3R5bGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TaGFyZWRBU1RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlIENYRiBtb2RlbC4KLSAqIEFsc28gc2VydmluZyBhcyBhbiBpbnRlcmltIGNsYXNzIHRvIGFpZCBpbiByZWZhY3RvcmluZyBjb3JlIHV0aWxpdGllcyBpbnRvIGpheHdzIGNvcmUuCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ1hGTW9kZWxVdGlscyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbiB2XzBfMF8wID0gbmV3IFZlcnNpb24oIjAuMC4wIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbiB2XzJfMSA9IG5ldyBWZXJzaW9uKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIHZfMl8wXzcgPSBuZXcgVmVyc2lvbigiMi4wLjciKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIHZfMl8xXzEgPSBuZXcgVmVyc2lvbigiMi4xLjEiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9TRVJWSUNFID0gIldlYlNlcnZpY2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01FVEhPRCA9ICJXZWJNZXRob2QiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNID0gIldlYlBhcmFtIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfV1JBUFBFUiA9ICJSZXF1ZXN0V3JhcHBlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9XUkFQUEVSID0gIlJlc3BvbnNlV3JhcHBlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRQT0lOVF9JTlRFUkZBQ0UgPSAiZW5kcG9pbnRJbnRlcmZhY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIlNlcnZpY2VNb2RlIiwgImphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJXZWJGYXVsdCIsICJqYXZheC54bWwud3MuV2ViRmF1bHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dChSRVFVRVNUX1dSQVBQRVIsICJqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoUkVTUE9OU0VfV1JBUFBFUiwgImphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIldlYlNlcnZpY2VDbGllbnQiLCAiamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiV2ViRW5kcG9pbnQiLCAiamF2YXgueG1sLndzLldlYkVuZHBvaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIldlYlNlcnZpY2VQcm92aWRlciIsICJqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIkJpbmRpbmdUeXBlIiwgImphdmF4LnhtbC53cy5CaW5kaW5nVHlwZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJXZWJTZXJ2aWNlUmVmIiwgImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIldlYlNlcnZpY2VSZWZzIiwgImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KFdFQl9TRVJWSUNFLCAiamF2YXguandzLldlYlNlcnZpY2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoV0VCX01FVEhPRCwgImphdmF4Lmp3cy5XZWJNZXRob2QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIk9uZXdheSIsICJqYXZheC5qd3MuT25lV2F5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoV0VCX1BBUkFNLCAiamF2YXguandzLldlYlBhcmFtIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJXZWJSZXN1bHQiLCAiamF2YXguandzLldlYlJlc3VsdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJTT0FQQmluZGluZyIsICJqYXZheC5qd3MuU09BUEJpbmRpbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiSGFuZGxlckNoYWluIiwgImphdmF4Lmp3cy5IYW5kbGVyQ2hhaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZNb2RlbFV0aWxzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRXZWJTZXJ2aWNlQW5ub3RhdGlvbkNoYW5nZShJVHlwZSB0eXBlLCBKYXZhMldTRGF0YU1vZGVsIG1vZGVsLAotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNvdXJjZSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotCi0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0KLSAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24odHlwZSwgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJTZXJ2aWNlQW5ub3RhdGlvbiAhPSBudWxsICYmIG1vZGVsLmlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgJiYgdHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBlbmRwb2ludEludGVyZmFjZSA9IGdldE1lbWJlclZhbHVlUGFpcih3ZWJTZXJ2aWNlQW5ub3RhdGlvbiwgRU5EUE9JTlRfSU5URVJGQUNFKTsKLSAgICAgICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZSAhPSBudWxsICYmIGVuZHBvaW50SW50ZXJmYWNlLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gKFN0cmluZ0xpdGVyYWwpIGVuZHBvaW50SW50ZXJmYWNlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJpbmdMaXRlcmFsLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscyhtb2RlbC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTVE5vZGUgbmV3U0VJVmFsdWUgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsIG1vZGVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQoZW5kcG9pbnRJbnRlcmZhY2UsIG5ld1NFSVZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgZW5kcG9pbnRJbnRlcmZhY2VQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBFTkRQT0lOVF9JTlRFUkZBQ0UsIEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSkpOwotCi0gICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQod2ViU2VydmljZUFubm90YXRpb24sIGVuZHBvaW50SW50ZXJmYWNlUGFpcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICAgICAgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgPQotICAgICAgICAgICAgICAgIEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKFdlYlNlcnZpY2UuY2xhc3MpLgotICAgICAgICAgICAgICAgIGdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpOwotCi0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmdldE1lbWJlclZhbHVlUGFpcnModHlwZSwgYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpICYmIHR5cGUuaXNDbGFzcygpKSB7Ci0gICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGVuZHBvaW50SW50ZXJmYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBFTkRQT0lOVF9JTlRFUkZBQ0UsIG1vZGVsLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoMSwgZW5kcG9pbnRJbnRlcmZhY2VWYWx1ZVBhaXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTm9ybWFsQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKElUeXBlIHR5cGUsIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb24gamR0QW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIGFubm90YXRpb24pOwotICAgICAgICBpZiAoamR0QW5ub3RhdGlvbiAhPSBudWxsICYmIGpkdEFubm90YXRpb24gaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE5vcm1hbEFubm90YXRpb24pIGpkdEFubm90YXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGdldE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZW1iZXJOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFdlYk1ldGhvZEFubm90YXRpb25DaGFuZ2UoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QsCi0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0KLSAgICAgICAgQVNUIGFzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRBU1QoKTsKLQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKG1ldGhvZCwgYXN0LCBXZWJNZXRob2QuY2xhc3MpOwotCi0gICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uQ2hhbmdlKElUeXBlIHR5cGUsIElNZXRob2QgbWV0aG9kLAotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNvdXJjZSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotCi0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihtZXRob2QsIGFzdCwgUmVxdWVzdFdyYXBwZXIuY2xhc3MpOwotCi0gICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZShJVHlwZSB0eXBlLCBJTWV0aG9kIG1ldGhvZCwKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLQotICAgICAgICBBU1QgYXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFTVCgpOwotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24obWV0aG9kLCBhc3QsIFJlc3BvbnNlV3JhcHBlci5jbGFzcyk7Ci0KLSAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRXZWJQYXJhbUFubm90YXRpb25DaGFuZ2UoSVR5cGUgdHlwZSwgZmluYWwgSU1ldGhvZCBtZXRob2QsCi0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBwYXJhbWV0ZXIsIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKQotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNvdXJjZSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotCi0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXIsIGFzdCwgV2ViUGFyYW0uY2xhc3MpOwotCi0gICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChwYXJhbWV0ZXIsIGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBU1QgYXN0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotCi0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgPSBBbm5vdGF0aW9uc01hbmFnZXIKLSAgICAgICAgLmdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoYW5ub3RhdGlvbkNsYXNzKS5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTsKLQotICAgICAgICBpZiAoYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuZ2V0TWVtYmVyVmFsdWVQYWlycyhqYXZhRWxlbWVudCwgYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldEltcG9ydHNDaGFuZ2UoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsIEphdmEyV1NEYXRhTW9kZWwgbW9kZWwsCi0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSwgYm9vbGVhbiBjbGFzc09ubHkpIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgSW1wb3J0UmV3cml0ZSBpbXBvcnRSZXdyaXRlID0gQ29kZVN0eWxlQ29uZmlndXJhdGlvbi5jcmVhdGVJbXBvcnRSZXdyaXRlKGNvbXBpbGF0aW9uVW5pdCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIGltcG9ydFJld3JpdGUuYWRkSW1wb3J0KEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLmdldChXRUJfU0VSVklDRSkpOwotCi0gICAgICAgICAgICBpZiAoIWNsYXNzT25seSkgewotICAgICAgICAgICAgICAgIE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gbWV0aG9kQW5ub3RhdGlvbk1hcCA9IG1vZGVsLmdldE1ldGhvZE1hcCgpOwotICAgICAgICAgICAgICAgIFNldDxFbnRyeTxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4+IG1ldGhvZEFubm90YXRpb25TZXQgPSBtZXRob2RBbm5vdGF0aW9uTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG1ldGhvZEFubm90YXRpb24gOiBtZXRob2RBbm5vdGF0aW9uU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1ldGhvZE1hcCA9IG1ldGhvZEFubm90YXRpb24uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgU2V0PEVudHJ5PFN0cmluZywgQm9vbGVhbj4+IG1ldGhvZFNldCA9IG1ldGhvZE1hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEJvb2xlYW4+IG1ldGhvZCA6IG1ldGhvZFNldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLmNvbnRhaW5zS2V5KG1ldGhvZC5nZXRLZXkoKSkgJiYgbWV0aG9kLmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRSZXdyaXRlLmFkZEltcG9ydChBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5nZXQobWV0aG9kLmdldEtleSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW1wb3J0UmV3cml0ZS5oYXNSZWNvcmRlZENoYW5nZXMoKSkgewotICAgICAgICAgICAgICAgIFRleHRFZGl0IGltcG9ydFRleHRFZGl0ID0gaW1wb3J0UmV3cml0ZS5yZXdyaXRlSW1wb3J0cyhudWxsKTsKLSAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KGltcG9ydFRleHRFZGl0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgYWxsIHB1YmxpYyBtZXRob2RzIHdpdGggdGhlIGRlZmF1bHQgYW5ub3RhdGlvbiBtYXBzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBnZXRNZXRob2RNYXAoSVR5cGUgdHlwZSwgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJTWV0aG9kW10gbWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgZm9yIChJTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZE1hcC5wdXQobWV0aG9kLCBnZXRBbm5vdGF0aW9uTWFwKG1vZGVsKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzQ2xhc3MoKSAmJiBKRFRVdGlscy5pc1B1YmxpY01ldGhvZChtZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZE1hcC5wdXQobWV0aG9kLCBnZXRBbm5vdGF0aW9uTWFwKG1vZGVsKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2RNYXA7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBCb29sZWFuPiBnZXRBbm5vdGF0aW9uTWFwKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gYW5ub3RhdGlvbmRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7Ci0gICAgICAgIGFubm90YXRpb25kTWFwLnB1dChDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QsIG1vZGVsLmlzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkpOwotICAgICAgICBhbm5vdGF0aW9uZE1hcC5wdXQoQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0sIG1vZGVsLmlzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSk7Ci0gICAgICAgIGFubm90YXRpb25kTWFwLnB1dChDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUiwgbW9kZWwuaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpKTsKLSAgICAgICAgYW5ub3RhdGlvbmRNYXAucHV0KENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUiwgbW9kZWwuaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSk7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uZE1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDWEYgd3NkbDJqYXZhIC1hdXRvTmFtZVJlc29sdXRpb24gaXMgc3VwcG9ydGVkIGluIHRoZSBDWEYgMi4wIHN0cmVhbSBmcm9tIDIuMC43Ci0gICAgICogYW5kIGluIHRoZSBDWEYgMi4xIHN0cmVhbSBmcm9tIDIuMS4xIHVwLgotICAgICAqCi0gICAgICogQHBhcmFtIGN4ZlJ1bnRpbWVWZXJzaW9uCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9OYW1lUmVzb2x1dGlvblBlcm1pdHRlZCgpIHsKLSAgICAgICAgVmVyc2lvbiBjdXJyZW50VmVyc2lvbiA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEN1cnJlbnRSdW50aW1lVmVyc2lvbigpOwotICAgICAgICAvL09uIHN0YXJ0dXAgd2l0aCBjbGVhbiB3b3Jrc3BhY2Ugc2hvdyBieSBkZWZhdWx0LgotICAgICAgICBpZiAoY3VycmVudFZlcnNpb24uY29tcGFyZVRvKHZfMF8wXzApID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRWZXJzaW9uLmNvbXBhcmVUbyhDWEZNb2RlbFV0aWxzLnZfMl8xXzEpID49IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRWZXJzaW9uLmNvbXBhcmVUbyhDWEZNb2RlbFV0aWxzLnZfMl8wXzcpID49IDAKLSAgICAgICAgICAgICAgICAmJiBjdXJyZW50VmVyc2lvbi5jb21wYXJlVG8oQ1hGTW9kZWxVdGlscy52XzJfMSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlZmF1bHRCb29sZWFuVmFsdWUoaW50IGNsYXNzaWZpZXJJRCwgaW50IGZlYXR1cmVJRCkgewotICAgICAgICBPYmplY3QgZGVmYXVsdFZhbHVlID0gbnVsbDsKLQotICAgICAgICBpZiAoY2xhc3NpZmllcklEID09IENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19WRVJCT1NFOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldENYRkNvbnRleHRfVmVyYm9zZSgpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRToKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0dlbmVyYXRlQW50QnVpbGRGaWxlKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQ6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZUNsaWVudCgpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVI6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZVNlcnZlcigpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsYXNzaWZpZXJJRCA9PSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQ6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfU29hcDEyQmluZGluZygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlWFNESW1wb3J0cygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dTREw6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXU0RMKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xhc3NpZmllcklEID09IENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTk9fQUREUkVTU19CSU5ESU5HOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfTm9BZGRyZXNzQmluZGluZygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfVXNlRGVmYXVsdFZhbHVlcygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT046Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9BdXRvTmFtZVJlc29sdXRpb24oKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fUFJPQ0VTU19TT0FQX0hFQURFUlM6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9Qcm9jZXNzU09BUEhlYWRlcnMoKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVBbnRCdWlsZEZpbGUoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1ZBTElEQVRFOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfVmFsaWRhdGUoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkc6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UKLSAgICAgICAgICAgICAgICAuZ2V0V1NETDJKYXZhQ29udGV4dF9Mb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVM6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNVc2VEZWZhdWx0VmFsdWVzKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmcoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORToKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRToKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nU2ltcGxlKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY0xvY2F0b3IoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFM6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNTeW5jTWV0aG9kcygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjTWFya0dlbmVyYXRlZCgpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmIGRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGRlZmF1bHRWYWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL0NvbW1hbmRMaW5lVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvQ29tbWFuZExpbmVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjkzMjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvQ29tbWFuZExpbmVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tYW5kTGluZVV0aWxzIHsKLSAgICAvLyBKYXZhMldTREwKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgT1VUX0ZJTEUgPSAiLW8iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX0RJUiA9ICItZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU09VUkNFX0RJUiA9ICItcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRElSID0gIi1jbGFzc2RpciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSjJXX0NMQVNTUEFUSCA9ICItY3AiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElOQ19TT0FQMTIgPSAiLXNvYXAxMiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRSA9ICItdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSjJXX1NFUlZJQ0VfTkFNRSA9ICItc2VydmljZW5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBPUlRfTkFNRSA9ICItcG9ydG5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEdFTl9YU0RfSU1QT1JUUyA9ICItY3JlYXRleHNkaW1wb3J0cyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkVSQk9TRSA9ICItdmVyYm9zZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIEphdmEyV1MKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSjJXX0ZST05URU5EID0gIi1mcm9udGVuZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSjJXX0RBVEFCSU5ESU5HID0gIi1kYXRhYmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQkVBTl9QQVRIID0gIi1iZWFucyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgR0VOX1dTREwgPSAiLXdzZGwiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEdFTl9DTElFTlQgPSAiLWNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgR0VOX1NFUlZFUiA9ICItc2VydmVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBHRU5fV1JBUFBFUl9GQVVMVCA9ICItd3JhcHBlcmJlYW4iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX1BBQ0tBR0VfTkFNRSA9ICItcCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0JJTkRJTkdfTkFNRSA9ICItYiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfRlJPTlRFTkQgPSAiLWZlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfREFUQUJJTkRJTkcgPSAiLWRiIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfV1NETF9WRVJTSU9OID0gIi13diI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX1NFUlZJQ0VfTkFNRSA9ICItc24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9DQVRBTE9HID0gIi1jYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfQ09NUElMRSA9ICItY29tcGlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0dFTl9JTVBMID0gIi1pbXBsIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfR0VOX0FMTCA9ICItYWxsIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfTk9fT1ZFUldSSVRFID0gIi1rZWVwIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfREVGQVVMVF9WQUxVRVMgPSAiLWRlZmF1bHRWYWx1ZXMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9BVVRPX05BTUVfUkVTT0xVVElPTiA9ICItYXV0b05hbWVSZXNvbHV0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfRVhDTFVERV9OQU1FU1BBQ0UgPSAiLW5leGNsdWRlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfRVhUX1NPQVBfSEVBREVSID0gIi1leHNoIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfREVGQVVMVF9OQU1FU1BBQ0UgPSAiLWRucyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0RFRkFVTFRfRVhDTFVERV9OUyA9ICItZGV4IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfV1NETF9MT0NBVElPTiA9ICItd3NkbExvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfWEpDX0FSR1MgPSAiLXhqYyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX05PX0FERFJFU1NfQklORElORyA9ICItbm9BZGRyZXNzQmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX1ZBTElEQVRFX1dTREwgPSAiLXZhbGlkYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gWEpDCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19EVl9BUkcgPSAiLVhkdiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RTX0FSRyA9ICItWHRzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVFNfTVVMVElfQVJHID0gIi1YdHM6c3R5bGU6bXVsdGlsaW5lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVFNfU0lNUExFID0gIi1YdHM6c3R5bGU6c2ltcGxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfTE9DQVRPUl9BUkcgPSAiLVhsb2NhdG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfU1lOQ19NRVRIT0RTX0FSRyA9ICItWHN5bmMtbWV0aG9kcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX01BUktfR0VORVJBVEVEX0FSRyA9ICItbWFyay1nZW5lcmF0ZWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19FUElTT0RFX0ZJTEVfQVJHID0gIi1lcGlzb2RlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBDb21tYW5kTGluZVV0aWxzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0SmF2YTJXU1Byb2dyYW1Bcmd1bWVudHMoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBMaXN0PFN0cmluZz4gcHJvZ0FyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICYmIEpEVFV0aWxzLmlzSmF2YVByb2plY3QocHJvamVjdCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBtb2RlbC5nZXRKYXZhU3RhcnRpbmdQb2ludCgpOwotICAgICAgICAgICAgaWYgKG1vZGVsLmlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgJiYgbW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQWRkIGFsbCB0aGUgZWFybGllciB3c2RsMmphdmEgdG9vbCBvcHRpb25zCi0gICAgICAgICAgICBwcm9nQXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChDb21tYW5kTGluZVV0aWxzLmdldFN0YW5kYXJkSmF2YTJXU0RMUHJvZ3JhbUFyZ3VtZW50cyhtb2RlbCkpKTsKLQotICAgICAgICAgICAgaWYgKG1vZGVsLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChKMldfRlJPTlRFTkQpOwotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChtb2RlbC5nZXRGcm9udGVuZCgpLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoSjJXX0RBVEFCSU5ESU5HKTsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQobW9kZWwuZ2V0RGF0YWJpbmRpbmcoKS5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gcHJvZ0FyZ3MuYWRkKEJFQU5fUEFUSCk7Ci0gICAgICAgICAgICAgICAgLy8gcHJvZ0FyZ3MuYWRkKCJCRUFOX1BBVEgiKTsKLQotICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlV1NETCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fV1NETCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ0FyZ3MucmVtb3ZlKE9VVF9GSUxFKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ0FyZ3MucmVtb3ZlKG1vZGVsLmdldFdzZGxGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZUNsaWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fQ0xJRU5UKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVNlcnZlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fU0VSVkVSKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKEdFTl9XUkFQUEVSX0ZBVUxUKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9nQXJncy50b0FycmF5KG5ldyBTdHJpbmdbcHJvZ0FyZ3Muc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0U3RhbmRhcmRKYXZhMldTRExQcm9ncmFtQXJndW1lbnRzKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0UHJvamVjdE5hbWUoKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHByb2dBcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb2dBcmdzLmFkZChKMldfQ0xBU1NQQVRIKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChwcm9qZWN0TmFtZSkudG9PU1N0cmluZygpKTsKLQotICAgICAgICBwcm9nQXJncy5hZGQoU09VUkNFX0RJUik7Ci0gICAgICAgIHByb2dBcmdzLmFkZChGaWxlVXRpbHMuZ2V0VG1wRm9sZGVyKHByb2plY3ROYW1lKSArICIvc3JjIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcm9nQXJncy5hZGQoUkVTT1VSQ0VfRElSKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEZpbGVVdGlscy5nZXRUbXBGb2xkZXIocHJvamVjdE5hbWUpICsgIi93c2RsIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcm9nQXJncy5hZGQoQ0xBU1NfRElSKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChwcm9qZWN0TmFtZSkudG9PU1N0cmluZygpKTsKLQotICAgICAgICBwcm9nQXJncy5hZGQoT1VUX0ZJTEUpOwotICAgICAgICBwcm9nQXJncy5hZGQobW9kZWwuZ2V0V3NkbEZpbGVOYW1lKCkpOwotCi0gICAgICAgIGlmIChtb2RlbC5pc1NvYXAxMkJpbmRpbmcoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKElOQ19TT0FQMTIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlWFNESW1wb3J0cygpKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoR0VOX1hTRF9JTVBPUlRTKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5pc1ZlcmJvc2UoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFZFUkJPU0UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb2dBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1twcm9nQXJncy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFdTREwySmF2YVByb2dyYW1Bcmd1bWVudHMoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwcm9nQXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICYmIEpEVFV0aWxzLmlzSmF2YVByb2plY3QocHJvamVjdCkpIHsKLSAgICAgICAgICAgIC8vIEFkZCBTdGFuZGFyZCBhcmdzCi0gICAgICAgICAgICBwcm9nQXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChDb21tYW5kTGluZVV0aWxzLmdldFN0YW5kYXJkV1NETDJKYXZhUHJvZ3JhbUFyZ3VtZW50cyhtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdE5hbWUpKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG1vZGVsLmdldFNlcnZpY2VOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCAmJiBzZXJ2aWNlTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1vZGVsLmlzVXNlRGVmYXVsdFZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9ERUZBVUxUX1ZBTFVFUyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0ZST05URU5EKTsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQobW9kZWwuZ2V0RnJvbnRlbmQoKS5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9EQVRBQklORElORyk7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKG1vZGVsLmdldERhdGFiaW5kaW5nKCkuZ2V0TGl0ZXJhbCgpKTsKLQotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfV1NETF9WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQobW9kZWwuZ2V0V3NkbFZlcnNpb24oKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNOb0FkZHJlc3NCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9OT19BRERSRVNTX0JJTkRJTkcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKG1vZGVsLmdldFdzZGxVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvZ0FyZ3MudG9BcnJheShuZXcgU3RyaW5nW3Byb2dBcmdzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0V1NETDJKYXZhR2VuZXJhdGVDbGllbnRBcmd1bWVudHMoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwcm9nQXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICYmIEpEVFV0aWxzLmlzSmF2YVByb2plY3QocHJvamVjdCkpIHsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fQ0xJRU5UKTsKLQotICAgICAgICAgICAgLy8gQWRkIFdTTEQySmF2YSBhcmdzCi0gICAgICAgICAgICBwcm9nQXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChDb21tYW5kTGluZVV0aWxzLmdldFdTREwySmF2YVByb2dyYW1Bcmd1bWVudHMobW9kZWwpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2dBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1twcm9nQXJncy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFN0YW5kYXJkV1NETDJKYXZhUHJvZ3JhbUFyZ3VtZW50cyhXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICBMaXN0PFN0cmluZz4gcHJvZ0FyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKFJFU09VUkNFX0RJUik7Ci0gICAgICAgIHByb2dBcmdzLmFkZChGaWxlVXRpbHMuZ2V0VG1wRm9sZGVyKHByb2plY3ROYW1lKSArICIvc3JjIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcm9nQXJncy5hZGQoQ0xBU1NfRElSKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChwcm9qZWN0TmFtZSkudG9PU1N0cmluZygpKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVkTmFtZXNwYWNlcyA9IG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpOwotICAgICAgICBpZiAoaW5jbHVkZWROYW1lc3BhY2VzICE9IG51bGwgJiYgbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgU2V0PE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGluY2x1ZGVkTmFtZXNwYWNlc0VudHJ5U2V0ID0gaW5jbHVkZWROYW1lc3BhY2VzLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBpbmNsdWRlZE5hbWVzcGFjZXNFbnRyeVNldCkgewotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfUEFDS0FHRV9OQU1FKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbE5hbWVzcGFjZSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKHdzZGxOYW1lc3BhY2UgKyAiPSIgKyBwYWNrYWdlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBiaW5kaW5nRmlsZXMgPSBtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKTsKLSAgICAgICAgaWYgKCFiaW5kaW5nRmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBiaW5kaW5nRmlsZSA6IGJpbmRpbmdGaWxlcykgewotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfQklORElOR19OQU1FKTsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoYmluZGluZ0ZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVTZXJ2ZXIoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKEdFTl9TRVJWRVIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0dFTl9JTVBMKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1vZGVsLmlzVmFsaWRhdGUoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9WQUxJREFURV9XU0RMKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb2dBcmdzLmFkZChXMkpfRVhUX1NPQVBfSEVBREVSKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEJvb2xlYW4udG9TdHJpbmcobW9kZWwuaXNQcm9jZXNzU09BUEhlYWRlcnMoKSkpOwotCi0gICAgICAgIHByb2dBcmdzLmFkZChXMkpfREVGQVVMVF9OQU1FU1BBQ0UpOwotICAgICAgICBwcm9nQXJncy5hZGQoQm9vbGVhbi50b1N0cmluZyhtb2RlbC5pc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkpKTsKLQotICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0RFRkFVTFRfRVhDTFVERV9OUyk7Ci0gICAgICAgIHByb2dBcmdzLmFkZChCb29sZWFuLnRvU3RyaW5nKG1vZGVsLmlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSkpOwotCi0gICAgICAgIGlmIChtb2RlbC5pc0F1dG9OYW1lUmVzb2x1dGlvbigpICYmIENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9BVVRPX05BTUVfUkVTT0xVVElPTik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgeGpjQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0WEpDQXJncyhtb2RlbCk7Ci0gICAgICAgIGlmICh4amNBcmdzLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfWEpDX0FSR1MgKyB4amNBcmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5nZXRXc2RsTG9jYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX1dTRExfTE9DQVRJT04pOwotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKG1vZGVsLmdldFdzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5pc1ZlcmJvc2UoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFZFUkJPU0UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9nQXJncy50b0FycmF5KG5ldyBTdHJpbmdbcHJvZ0FyZ3Muc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFhKQ0FyZ3MoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB4amNBcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmIChtb2RlbC5pc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSkgewotICAgICAgICAgICAgeGpjQXJncy5hZGQoWEpDX0RWX0FSRyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzWGpjVG9TdHJpbmcoKSkgewotICAgICAgICAgICAgeGpjQXJncy5hZGQoWEpDX1RTX0FSRyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSkgewotICAgICAgICAgICAgeGpjQXJncy5hZGQoWEpDX1RTX01VTFRJX0FSRyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzWGpjVG9TdHJpbmdTaW1wbGUoKSkgewotICAgICAgICAgICAgeGpjQXJncy5hZGQoWEpDX1RTX1NJTVBMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzWGpjTG9jYXRvcigpKSB7Ci0gICAgICAgICAgICB4amNBcmdzLmFkZChYSkNfTE9DQVRPUl9BUkcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5pc1hqY1N5bmNNZXRob2RzKCkpIHsKLSAgICAgICAgICAgIHhqY0FyZ3MuYWRkKFhKQ19TWU5DX01FVEhPRFNfQVJHKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9kZWwuaXNYamNNYXJrR2VuZXJhdGVkKCkpIHsKLSAgICAgICAgICAgIHhqY0FyZ3MuYWRkKFhKQ19NQVJLX0dFTkVSQVRFRF9BUkcpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHhqY0FyZyA9IHhqY0FyZ3MudG9TdHJpbmcoKTsKLSAgICAgICAgeGpjQXJnID0geGpjQXJnLnJlcGxhY2UoJ1snLCAnICcpOwotICAgICAgICB4amNBcmcgPSB4amNBcmcucmVwbGFjZSgnXScsICcgJyk7Ci0KLSAgICAgICAgeGpjQXJnID0geGpjQXJnLnJlcGxhY2VBbGwoIlxccyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgcmV0dXJuIHhqY0FyZy50cmltKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9GaWxlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvRmlsZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOGM5OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9GaWxlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Gb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGZpbmFsIGNsYXNzIEZpbGVVdGlscyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE1QX0ZPTERFUl9OQU1FID0gIi5jeGZ0bXAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIEZpbGVVdGlscygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUZvbGRlcihTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVzdGluYXRpb24pIHsKLSAgICAgICAgRmlsZSBzb3VyY2VGb2xkZXIgPSBuZXcgRmlsZShzb3VyY2UpOwotCi0gICAgICAgIFN0cmluZ1tdIGZpbGVzID0gc291cmNlRm9sZGVyLmxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoc291cmNlRm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlc1tpXSk7Ci0gICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgY29weUZvbGRlcihzb3VyY2UsIGRlc3RpbmF0aW9uLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvcHlGaWxlKHNvdXJjZSwgZGVzdGluYXRpb24sIGZpbGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29weUZvbGRlcihTdHJpbmcgc291cmNlRm9sZGVyLCBTdHJpbmcgdGFyZ2V0Rm9sZGVyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBGaWxlIHRhcmdldCA9IG5ldyBGaWxlKHRhcmdldEZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgbmFtZSk7Ci0gICAgICAgIGlmICghdGFyZ2V0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0YXJnZXQubWtkaXIoKTsKLSAgICAgICAgfQotICAgICAgICBjb3B5Rm9sZGVyKHNvdXJjZUZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgbmFtZSwgdGFyZ2V0Rm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUZpbGUoU3RyaW5nIHNvdXJjZUZvbGRlciwgU3RyaW5nIHRhcmdldEZvbGRlciwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWUpOwotICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRGb2xkZXIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKTsKLSAgICAgICAgaWYgKCF0YXJnZXRGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgIAlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0JCSAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZUZpbGUpOwotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpOwotICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0MDBdOwotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJPZkJ5dGVzID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyT2ZCeXRlcyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShidWZmZXIsIDAsIG51bWJlck9mQnl0ZXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhmbmZlKTsKLQkJICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGlvZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOyAgICAKLQkJCQkgICAgfQotCQkJCSAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQkgICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOyAgICAKLQkJCQkgICAgfQotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGlvZSk7Ci0JCQkJfQotCQkJfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGUuZ2V0TmFtZSgpLmluZGV4T2YoIi5qYXZhIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIE1lcmdlVXRpbHMubWVyZ2Uoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUbXBGb2xkZXJOYW1lKCkgewotICAgICAgICByZXR1cm4gVE1QX0ZPTERFUl9OQU1FOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUbXBGb2xkZXIoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIHJldHVybiBGaWxlVXRpbHMuZ2V0VG1wRm9sZGVyKEZpbGVVdGlscy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG1wRm9sZGVyKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgSUZvbGRlciB0bXBGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihUTVBfRk9MREVSX05BTUUpOwotICAgICAgICBpZiAoIXRtcEZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0bXBGb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSUZvbGRlciB0bXBTcmNGb2xkZXIgPSB0bXBGb2xkZXIuZ2V0Rm9sZGVyKCJzcmMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoIXRtcFNyY0ZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0bXBTcmNGb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSUZvbGRlciB0bXBXU0RMRm9sZGVyID0gdG1wRm9sZGVyLmdldEZvbGRlcigid3NkbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICghdG1wV1NETEZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0bXBXU0RMRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRtcEZvbGRlci5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weVcySkZpbGVzRnJvbVRtcChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgSUZvbGRlciBzcmNGb2xkZXIgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcihuZXcgUGF0aChtb2RlbC5nZXRKYXZhU291cmNlRm9sZGVyKCkpKTsKLSAgICAgICAgRmlsZVV0aWxzLmNvcHlGb2xkZXIoZ2V0VG1wRm9sZGVyKHByb2plY3QpICsgIi9zcmMiLCBzcmNGb2xkZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNyY0ZvbGRlci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZVRtcEZvbGRlcihwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUoyV0ZpbGVzRnJvbVRtcChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBGaWxlVXRpbHMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0KLSAgICAgICAgSVR5cGUgdHlwZSA9IEpEVFV0aWxzLmZpbmRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKSwgbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSk7Ci0gICAgICAgIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0UGFyZW50KCk7Ci0gICAgICAgIElSZXNvdXJjZSBqYXZhRWxlbWVudFJlc291cmNlID0gamF2YUVsZW1lbnQuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50UmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElGb2xkZXIgc3JjRGlyZWN0b3J5ID0gKElGb2xkZXIpIGphdmFFbGVtZW50UmVzb3VyY2U7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGb2xkZXIoZ2V0VG1wRm9sZGVyKHByb2plY3QpICsgIi9zcmMiLCBzcmNEaXJlY3RvcnkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgc3JjRGlyZWN0b3J5LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsICBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVdTREwoKSkgewotICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIHdzZGxGb2xkZXIgPSBXU0RMVXRpbHMuZ2V0V1NETEZvbGRlcihwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5Rm9sZGVyKGdldFRtcEZvbGRlcihwcm9qZWN0KSArICIvd3NkbCIsIHdzZGxGb2xkZXIuZ2V0TG9jYXRpb24oKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldENvbmZpZ1dzZGxMb2NhdGlvbih3c2RsRm9sZGVyLmdldE5hbWUoKSArICIvIiAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbW9kZWwuZ2V0V3NkbEZpbGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB3c2RsRm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBkZWxldGVUbXBGb2xkZXIocHJvamVjdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBkZWxldGVUbXBGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICAgICAgSUZvbGRlciB0bXBGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihUTVBfRk9MREVSX05BTUUpOwotICAgICAgICBpZiAodG1wRm9sZGVyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRtcEZvbGRlci5kZWxldGUodHJ1ZSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZpbGVJbldlYkNvbnRlbnRGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgSVBhdGggZmlsZVBhdGgpIHsKLSAgICAJSVBhdGggd2ViQ29udGVudFBhdGggPSBXU0RMVXRpbHMuZ2V0V2ViQ29udGVudEZvbGRlcihwcm9qZWN0KS5nZXRMb2NhdGlvbigpOwotICAgIAlpZiAod2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmaWxlUGF0aCkpIHsKLSAgICAgICAJCXJldHVybiB0cnVlOwotICAgIAl9Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmlsZUluV29ya3NwYWNlKFVSTCBmaWxlVVJMKSB7Ci0gICAgICAgIElQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZVVSTC5nZXRQYXRoKCkpOwotCi0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUGF0aCB3b3Jrc3BhY2VQYXRoID0gd29ya3NwYWNlUm9vdC5nZXRMb2NhdGlvbigpOwotICAgICAgICBpZiAoZmlsZVBhdGguaXNWYWxpZFBhdGgod29ya3NwYWNlUGF0aC50b09TU3RyaW5nKCkpKSB7Ci0gICAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdFhNTEZpbGUoSUZpbGUgZmlsZSkgewotICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBGb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyLmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGb3JtYXRQcm9jZXNzb3IoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdFByb2Nlc3NvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdFByb2Nlc3Nvci5mb3JtYXRGaWxlKGZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gRmlsZVV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBGaWxlVXRpbHMucmVmcmVzaFByb2plY3QocHJvamVjdCwgbW9uaXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9MYXVuY2hVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9MYXVuY2hVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjM0NDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvTGF1bmNoVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1SdW5uZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuQ29uc29sZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklDb25zb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JT0NvbnNvbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5NZXNzYWdlQ29uc29sZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIExhdW5jaFV0aWxzIHsKLQotICAgIHByaXZhdGUgTGF1bmNoVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIGxhdW5jaChTdHJpbmdbXSBydW50aW1lQ2xhc3NwYXRoLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmdbXSBwcm9ncmFtQXJncykgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLSAgICAgICAgICAgIElWTVJ1bm5lciB2bVJ1bm5lciA9IHZtSW5zdGFsbC5nZXRWTVJ1bm5lcihJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0gICAgICAgICAgICBWTVJ1bm5lckNvbmZpZ3VyYXRpb24gdm1SdW5uZXJDb25maWd1cmF0aW9uID0gbmV3IFZNUnVubmVyQ29uZmlndXJhdGlvbihjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDbGFzc3BhdGgpOwotICAgICAgICAgICAgdm1SdW5uZXJDb25maWd1cmF0aW9uLnNldFByb2dyYW1Bcmd1bWVudHMocHJvZ3JhbUFyZ3MpOwotCi0gICAgICAgICAgICBJTGF1bmNoIGxhdW5jaCA9IG5ldyBMYXVuY2gobnVsbCwgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG51bGwpOwotICAgICAgICAgICAgdm1SdW5uZXIucnVuKHZtUnVubmVyQ29uZmlndXJhdGlvbiwgbGF1bmNoLCBudWxsKTsKLQotICAgICAgICAgICAgd2hpbGUgKCFsYXVuY2guaXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJUHJvY2Vzc1tdIHByb2Nlc3NlcyA9IGxhdW5jaC5nZXRQcm9jZXNzZXMoKTsKLSAgICAgICAgICAgIFN0cmluZyBvdXRwdXRTdHJlYW0gPSBwcm9jZXNzZXNbMF0uZ2V0U3RyZWFtc1Byb3h5KCkuZ2V0T3V0cHV0U3RyZWFtTW9uaXRvcigpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwgJiYgb3V0cHV0U3RyZWFtLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgb3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbGF1bmNoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nW10gcHJvZ3JhbUFyZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGwoamF2YVByb2plY3QpOwotICAgICAgICBpZiAodm1JbnN0YWxsID09IG51bGwpIHsKLSAgICAgICAgICAgIHZtSW5zdGFsbCA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBpbnN0YWxsZWRWZXJzaW9uID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q1hGUnVudGltZVZlcnNpb24oamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXRJbnN0YWxsYXRpb25zKCkuZ2V0KGluc3RhbGxlZFZlcnNpb24pOwotCi0gICAgICAgIElWTVJ1bm5lciB2bVJ1bm5lciA9IHZtSW5zdGFsbC5nZXRWTVJ1bm5lcihJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0gICAgICAgIFN0cmluZ1tdIHJ1bnRpbWVDbGFzc3BhdGggPSBKYXZhUnVudGltZS5jb21wdXRlRGVmYXVsdFJ1bnRpbWVDbGFzc1BhdGgoamF2YVByb2plY3QpOwotICAgICAgICBWTVJ1bm5lckNvbmZpZ3VyYXRpb24gdm1SdW5uZXJDb25maWd1cmF0aW9uID0gbmV3IFZNUnVubmVyQ29uZmlndXJhdGlvbihjbGFzc05hbWUsIHJ1bnRpbWVDbGFzc3BhdGgpOwotCi0gICAgICAgIHZtUnVubmVyQ29uZmlndXJhdGlvbi5zZXRQcm9ncmFtQXJndW1lbnRzKHByb2dyYW1BcmdzKTsKLQotICAgICAgICBpZiAodm1JbnN0YWxsIGluc3RhbmNlb2YgSVZNSW5zdGFsbDIpIHsKLSAgICAgICAgICAgIElWTUluc3RhbGwyIGluc3RhbGwyID0gKElWTUluc3RhbGwyKSB2bUluc3RhbGw7Ci0gICAgICAgICAgICBpZiAoaW5zdGFsbDIuZ2V0SmF2YVZlcnNpb24oKS5jb21wYXJlVG8oSmF2YUNvcmUuVkVSU0lPTl8xXzYpID4gMCkgewotICAgICAgICAgICAgICAgIHZtUnVubmVyQ29uZmlndXJhdGlvbi5zZXRWTUFyZ3VtZW50cyhuZXcgU3RyaW5nW10geyAiLURqYXZhLmVuZG9yc2VkLmRpcnM9IiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICArIGN4Zkluc3RhbGwuZ2V0TG9jYXRpb24oKSB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIElMYXVuY2ggbGF1bmNoID0gbmV3IExhdW5jaChudWxsLCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgbnVsbCk7Ci0gICAgICAgIHZtUnVubmVyLnJ1bih2bVJ1bm5lckNvbmZpZ3VyYXRpb24sIGxhdW5jaCwgbnVsbCk7Ci0KLSAgICAgICAgd2hpbGUgKCFsYXVuY2guaXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGllKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIElQcm9jZXNzW10gcHJvY2Vzc2VzID0gbGF1bmNoLmdldFByb2Nlc3NlcygpOwotCi0gICAgICAgIFN0cmluZyBvdXRwdXRTdHJlYW0gPSBwcm9jZXNzZXNbMF0uZ2V0U3RyZWFtc1Byb3h5KCkuZ2V0T3V0cHV0U3RyZWFtTW9uaXRvcigpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIGxvZ1N0cmVhbShvdXRwdXRTdHJlYW0sIGN4Zkluc3RhbGwpOwotICAgICAgICBTdHJpbmcgZXJyb3JTdHJlYW0gPSBwcm9jZXNzZXNbMF0uZ2V0U3RyZWFtc1Byb3h5KCkuZ2V0RXJyb3JTdHJlYW1Nb25pdG9yKCkuZ2V0Q29udGVudHMoKTsKLSAgICAgICAgbG9nU3RyZWFtKGVycm9yU3RyZWFtLCBjeGZJbnN0YWxsKTsKLQotICAgICAgICBsb2dFcnJvclN0cmVhbUNvbnRlbnRzKGVycm9yU3RyZWFtLCBjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nU3RyZWFtKFN0cmluZyBvdXRwdXRTdHJlYW0sIENYRkluc3RhbGwgY3hmSW5zdGFsbCkgewotICAgICAgICBpZiAoIVBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUNvbnNvbGUgY3hmQ29uc29sZSA9IGdldENYRkNvbnNvbGUoY3hmSW5zdGFsbCk7Ci0gICAgICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjb25zb2xlX3ZpZXdfaWQgPSBJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVc7Ci0gICAgICAgICAgICAgICAgSUNvbnNvbGVWaWV3IGNvbnNvbGVWaWV3ID0gKElDb25zb2xlVmlldykgd29ya2JlbmNoUGFnZS5zaG93Vmlldyhjb25zb2xlX3ZpZXdfaWQpOwotICAgICAgICAgICAgICAgIGNvbnNvbGVWaWV3LmRpc3BsYXkoY3hmQ29uc29sZSk7Ci0gICAgICAgICAgICAgICAgSU9Db25zb2xlT3V0cHV0U3RyZWFtIGNvbnNvbGVPdXRwdXRTdHJlYW0gPSBjeGZDb25zb2xlLm5ld091dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGNvbnNvbGVPdXRwdXRTdHJlYW0ud3JpdGUob3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICBjb25zb2xlT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2cocGllKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZUNvbnNvbGUgZ2V0Q1hGQ29uc29sZShDWEZJbnN0YWxsIGN4Zkluc3RhbGwpIHsKLSAgICAgICAgQ29uc29sZVBsdWdpbiBjb25zb2xlUGx1Z2luID0gQ29uc29sZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0gICAgICAgIElDb25zb2xlTWFuYWdlciBjb25zb2xlTWFuYWdlciA9IGNvbnNvbGVQbHVnaW4uZ2V0Q29uc29sZU1hbmFnZXIoKTsKLSAgICAgICAgSUNvbnNvbGVbXSBleGlzdGluZ0NvbnNvbGVzID0gY29uc29sZU1hbmFnZXIuZ2V0Q29uc29sZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGlzdGluZ0NvbnNvbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZXhpc3RpbmdDb25zb2xlc1tpXS5nZXROYW1lKCkuZXF1YWxzKGN4Zkluc3RhbGwuZ2V0VHlwZSgpICsgIiAiCi0gICAgICAgICAgICAgICAgICAgICsgY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlQ29uc29sZSkgZXhpc3RpbmdDb25zb2xlc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBNZXNzYWdlQ29uc29sZSBjeGZDb25zb2xlID0gbmV3IE1lc3NhZ2VDb25zb2xlKGN4Zkluc3RhbGwuZ2V0VHlwZSgpICsgIiAiCi0gICAgICAgICAgICAgICAgKyBjeGZJbnN0YWxsLmdldFZlcnNpb24oKSwKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgImljb25zL3ZpZXcxNi9jb25zb2xlX3ZpZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbnNvbGVNYW5hZ2VyLmFkZENvbnNvbGVzKG5ldyBJQ29uc29sZVtde2N4ZkNvbnNvbGV9KTsKLSAgICAgICAgcmV0dXJuIGN4ZkNvbnNvbGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dFcnJvclN0cmVhbUNvbnRlbnRzKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIFN0cmluZyB0b29sTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGNsYXNzTmFtZS5sZW5ndGgoKSk7Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmluZGV4T2YodG9vbE5hbWUgKyAiIEVycm9yIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3RhdHVzIHRvb2xTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKHRvb2xTdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9NZXJnZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL01lcmdlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyYjE0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL01lcmdlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4ubWVyZ2UuamF2YS5KQ29udHJvbE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLm1lcmdlLmphdmEuSk1lcmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5tZXJnZS5qYXZhLmZhY2FkZS5GYWNhZGVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4ubWVyZ2UuamF2YS5mYWNhZGUuSkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi51dGlsLkNvZGVHZW5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVyZ2VVdGlscyB7Ci0KLSAgICBwcml2YXRlIE1lcmdlVXRpbHMoKSB7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBKTWVyZ2VyIGdldEpNZXJnZXIoKSB7Ci0gICAgICAgIEZhY2FkZUhlbHBlciBmYWNhZGVIZWxwZXIgPSBDb2RlR2VuVXRpbC5pbnN0YW50aWF0ZUZhY2FkZUhlbHBlcihKTWVyZ2VyLkRFRkFVTFRfRkFDQURFX0hFTFBFUl9DTEFTUyk7Ci0gICAgICAgIFVSTCBtZXJnZUZpbGVVUkwgPSBGaWxlTG9jYXRvci5maW5kKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLCBuZXcgUGF0aCgKLSAgICAgICAgICAgICAgICAiL2ptZXJnZXIvbWVyZ2UueG1sIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpDb250cm9sTW9kZWwgY29udHJvbE1vZGVsID0gbmV3IEpDb250cm9sTW9kZWwoKTsKLSAgICAgICAgY29udHJvbE1vZGVsLmluaXRpYWxpemUoZmFjYWRlSGVscGVyLCBtZXJnZUZpbGVVUkwudG9TdHJpbmcoKSk7Ci0gICAgICAgIEpNZXJnZXIgam1lcmdlciA9IG5ldyBKTWVyZ2VyKGNvbnRyb2xNb2RlbCk7Ci0KLSAgICAgICAgcmV0dXJuIGptZXJnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1lcmdlKEZpbGUgc291cmNlRmlsZSwgRmlsZSB0YXJnZXRGaWxlKSB7Ci0gICAgICAgIEpNZXJnZXIgbWVyZ2VyID0gZ2V0Sk1lcmdlcigpOwotCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzb3VyY2VJbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSB0YXJnZXRJbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIE91dHB1dFN0cmVhbSB0YXJnZXRPdXRwdXRTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gc2V0IHNvdXJjZQotICAgICAgICAgICAgc291cmNlSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZUZpbGUpOwotICAgICAgICAgICAgSkNvbXBpbGF0aW9uVW5pdCBpbnB1dENvbXBpbGF0aW9uVW5pdCA9IG1lcmdlcgotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29tcGlsYXRpb25Vbml0Rm9ySW5wdXRTdHJlYW0oc291cmNlSW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgbWVyZ2VyLnNldFNvdXJjZUNvbXBpbGF0aW9uVW5pdChpbnB1dENvbXBpbGF0aW9uVW5pdCk7Ci0KLSAgICAgICAgICAgIC8vIHNldCB0YXJnZXQKLSAgICAgICAgICAgIHRhcmdldElucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgICAgIEpDb21waWxhdGlvblVuaXQgdGFyZ2V0Q29tcGlsYXRpb25Vbml0ID0gbWVyZ2VyCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb21waWxhdGlvblVuaXRGb3JJbnB1dFN0cmVhbSh0YXJnZXRJbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBtZXJnZXIuc2V0VGFyZ2V0Q29tcGlsYXRpb25Vbml0KHRhcmdldENvbXBpbGF0aW9uVW5pdCk7Ci0KLSAgICAgICAgICAgIC8vIG1lcmdlIHNvdXJjZSBhbmQgdGFyZ2V0Ci0gICAgICAgICAgICBtZXJnZXIubWVyZ2UoKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgbWVyZ2VkIGNvbnRlbnRzCi0gICAgICAgICAgICB0YXJnZXRPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG1lcmdlci5nZXRUYXJnZXRDb21waWxhdGlvblVuaXQoKS5nZXRDb250ZW50cygpLmdldEJ5dGVzKCk7Ci0gICAgICAgICAgICB0YXJnZXRPdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhmbmZlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0T3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0T3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvU3ByaW5nVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvU3ByaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxOTk4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL1NwcmluZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5qZG9tLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuamRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuamRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy5qZG9tLkpET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmpkb20uTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5qZG9tLmlucHV0LlNBWEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmpkb20ub3V0cHV0LlhNTE91dHB1dHRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBTcHJpbmdVdGlscyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTmFtZXNwYWNlIFNQUklOR19CRUFOU19OUyA9IE5hbWVzcGFjZQotICAgIC5nZXROYW1lc3BhY2UoImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIE5hbWVzcGFjZSBYTUxOU19YU0kgPSBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKCJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHJpdmF0ZSBzdGF0aWMgTmFtZXNwYWNlIEpBWFdTX05TID0gTmFtZXNwYWNlLmdldE5hbWVzcGFjZSgiamF4d3MiLCAiaHR0cDovL2N4Zi5hcGFjaGUub3JnL2pheHdzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHByaXZhdGUgc3RhdGljIE5hbWVzcGFjZSBTT0FQX05TID0gTmFtZXNwYWNlLmdldE5hbWVzcGFjZSgic29hcCIsICJodHRwOi8vY3hmLmFwYWNoZS5vcmcvYmluZGluZ3Mvc29hcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBET0NfUk9PVCA9ICJiZWFucyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgU3ByaW5nVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRCZWFuc0ZpbGUoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSUZpbGUgYmVhbnNGaWxlID0gbnVsbDsKLSAgICAgICAgSVBhdGggd2ViQ29udGVudFBhdGggPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0gICAgICAgIGlmICghd2ViQ29udGVudFBhdGguaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgd2ViQ29udGVudFBhdGggPSB3ZWJDb250ZW50UGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCi0gICAgICAgICAgICBJUGF0aCB3ZWJJTkZQYXRoID0gd2ViQ29udGVudFBhdGguYXBwZW5kKG5ldyBQYXRoKCJXRUItSU5GLyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgSUZvbGRlciB3ZWJJTkZGb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcih3ZWJJTkZQYXRoKTsKLSAgICAgICAgICAgIGJlYW5zRmlsZSA9IHdlYklORkZvbGRlci5nZXRGaWxlKCJiZWFucy54bWwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKCFiZWFuc0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJlYW5zRmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10ge30pLCB0cnVlLCBwcm9ncmVzc01vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICBjcmVhdGVCYXNlQmVhbnNGaWxlKGJlYW5zRmlsZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZWFuc0ZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRCZWFuc0ZpbGUoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gU3ByaW5nVXRpbHMuZ2V0QmVhbnNGaWxlKEZpbGVVdGlscy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgY3hmLXNlcnZsZXQgZmlsZSBpbiB0aGUgV2ViIHByb2plY3RzIFdFQi1JTkYKLSAgICAgKiBmb2xkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHtAbGluayBJRmlsZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElGaWxlIGdldENYRlNlcnZsZXQoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSUZpbGUgY3hmU2VydmxldCA9IG51bGw7Ci0gICAgICAgIElQYXRoIHdlYkNvbnRlbnRQYXRoID0gSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotICAgICAgICBpZiAoIXdlYkNvbnRlbnRQYXRoLmhhc1RyYWlsaW5nU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgIHdlYkNvbnRlbnRQYXRoID0gd2ViQ29udGVudFBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQotICAgICAgICAgICAgSVBhdGggd2ViSU5GUGF0aCA9IHdlYkNvbnRlbnRQYXRoLmFwcGVuZChuZXcgUGF0aCgiV0VCLUlORi8iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIElGb2xkZXIgd2ViSU5GRm9sZGVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIod2ViSU5GUGF0aCk7Ci0gICAgICAgICAgICBjeGZTZXJ2bGV0ID0gd2ViSU5GRm9sZGVyLmdldEZpbGUoImN4Zi1zZXJ2bGV0LnhtbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoIWN4ZlNlcnZsZXQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY3hmU2VydmxldC5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10ge30pLCB0cnVlLCBwcm9ncmVzc01vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICBjcmVhdGVCYXNlQ1hGU2VydmxldEZpbGUoY3hmU2VydmxldCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjeGZTZXJ2bGV0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0Q1hGU2VydmxldChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBTcHJpbmdVdGlscy5nZXRDWEZTZXJ2bGV0KEZpbGVVdGlscy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVCYXNlQ1hGU2VydmxldEZpbGUoSUZpbGUgY3hmU2VydmxldCkgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEVsZW1lbnQgYmVhbnMgPSBuZXcgRWxlbWVudChET0NfUk9PVCk7Ci0gICAgICAgIGJlYW5zLnNldE5hbWVzcGFjZShTUFJJTkdfQkVBTlNfTlMpOwotICAgICAgICBiZWFucy5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihYTUxOU19YU0kpOwotICAgICAgICBiZWFucy5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihKQVhXU19OUyk7Ci0gICAgICAgIGJlYW5zLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKFNPQVBfTlMpOwotCi0gICAgICAgIEF0dHJpYnV0ZSBzY2hlbWFMb2NhdGlvbiA9IG5ldyBBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgInNjaGVtYUxvY2F0aW9uIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QgIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyAiaHR0cDovL2N4Zi5hcGFjaGUub3JnL2JpbmRpbmdzL3NvYXAgaHR0cDovL2N4Zi5hcGFjaGUub3JnL3NjaGVtYXMvY29uZmlndXJhdGlvbi9zb2FwLnhzZCAiIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArICJodHRwOi8vY3hmLmFwYWNoZS5vcmcvamF4d3MgaHR0cDovL2N4Zi5hcGFjaGUub3JnL3NjaGVtYXMvamF4d3MueHNkIiwgWE1MTlNfWFNJKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGJlYW5zLnNldEF0dHJpYnV0ZShzY2hlbWFMb2NhdGlvbik7Ci0KLSAgICAgICAgd3JpdGVDb25maWcobmV3IERvY3VtZW50KGJlYW5zKSwgY3hmU2VydmxldCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVCYXNlQmVhbnNGaWxlKElGaWxlIGJlYW5zRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRWxlbWVudCBiZWFucyA9IG5ldyBFbGVtZW50KERPQ19ST09UKTsKLSAgICAgICAgYmVhbnMuc2V0TmFtZXNwYWNlKFNQUklOR19CRUFOU19OUyk7Ci0gICAgICAgIGJlYW5zLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKFhNTE5TX1hTSSk7Ci0gICAgICAgIGJlYW5zLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKEpBWFdTX05TKTsKLQotICAgICAgICBBdHRyaWJ1dGUgc2NoZW1hTG9jYXRpb24gPSBuZXcgQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICJzY2hlbWFMb2NhdGlvbiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkICIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgImh0dHA6Ly9jeGYuYXBhY2hlLm9yZy9qYXh3cyBodHRwOi8vY3hmLmFwYWNoZS5vcmcvc2NoZW1hcy9qYXh3cy54c2QiLCBYTUxOU19YU0kpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYmVhbnMuc2V0QXR0cmlidXRlKHNjaGVtYUxvY2F0aW9uKTsKLQotICAgICAgICBFbGVtZW50IGltcG9ydENYRlJlc291cmNlID0gbmV3IEVsZW1lbnQoImltcG9ydCIsIFNQUklOR19CRUFOU19OUyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1wb3J0Q1hGUmVzb3VyY2Uuc2V0QXR0cmlidXRlKCJyZXNvdXJjZSIsICJjbGFzc3BhdGg6TUVUQS1JTkYvY3hmL2N4Zi54bWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgRWxlbWVudCBpbXBvcnRDWEZTb2FwRXh0ZW5zaW9uUmVzb3VyY2UgPSBuZXcgRWxlbWVudCgiaW1wb3J0IiwgU1BSSU5HX0JFQU5TX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbXBvcnRDWEZTb2FwRXh0ZW5zaW9uUmVzb3VyY2Uuc2V0QXR0cmlidXRlKCJyZXNvdXJjZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgImNsYXNzcGF0aDpNRVRBLUlORi9jeGYvY3hmLWV4dGVuc2lvbi1zb2FwLnhtbCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgRWxlbWVudCBpbXBvcnRDWEZTZXJ2ZWx0UmVzb3VyY2UgPSBuZXcgRWxlbWVudCgiaW1wb3J0IiwgU1BSSU5HX0JFQU5TX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbXBvcnRDWEZTZXJ2ZWx0UmVzb3VyY2Uuc2V0QXR0cmlidXRlKCJyZXNvdXJjZSIsICJjbGFzc3BhdGg6TUVUQS1JTkYvY3hmL2N4Zi1zZXJ2bGV0LnhtbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICBiZWFucy5hZGRDb250ZW50KGltcG9ydENYRlJlc291cmNlKTsKLSAgICAgICAgYmVhbnMuYWRkQ29udGVudChpbXBvcnRDWEZTb2FwRXh0ZW5zaW9uUmVzb3VyY2UpOwotICAgICAgICBiZWFucy5hZGRDb250ZW50KGltcG9ydENYRlNlcnZlbHRSZXNvdXJjZSk7Ci0KLSAgICAgICAgd3JpdGVDb25maWcobmV3IERvY3VtZW50KGJlYW5zKSwgYmVhbnNGaWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTcHJpbmdCZWFuc0ZpbGUoSUZpbGUgc3ByaW5nQmVhbnNGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3ByaW5nQmVhbnNJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3ByaW5nQmVhbnNGaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICBpZiAoc3ByaW5nQmVhbnNJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLSAgICAgICAgICAgIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIuYnVpbGQoc3ByaW5nQmVhbnNJbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCByb290ID0gZG9jLmdldFJvb3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvb3QuZ2V0TmFtZSgpLmVxdWFscyhET0NfUk9PVCkgJiYgcm9vdC5nZXROYW1lc3BhY2UoKS5lcXVhbHMoU1BSSU5HX0JFQU5TX05TKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGpkb21lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coamRvbWUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzcHJpbmdCZWFuc0lucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCZWFuRGVmaW5lZChDWEZEYXRhTW9kZWwgY3hmRGF0YU1vZGVsLCBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBlbGVtZW50TmFtZSwKLSAgICAgICAgICAgIE5hbWVzcGFjZSBuYW1lc3BhY2UsIFN0cmluZyBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSUZpbGUgc3ByaW5nQ29uZmlnRmlsZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSkgewotICAgICAgICAgICAgc3ByaW5nQ29uZmlnRmlsZSA9IFNwcmluZ1V0aWxzLmdldEJlYW5zRmlsZShwcm9qZWN0TmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdGaWxlID0gU3ByaW5nVXRpbHMuZ2V0Q1hGU2VydmxldChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNTcHJpbmdCZWFuc0ZpbGUoc3ByaW5nQ29uZmlnRmlsZSkpIHsKLSAgICAgICAgICAgIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCk7Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3ByaW5nQ29uZmlnSW5wdXRTdGVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3ByaW5nQ29uZmlnRmlsZS5nZXRMb2NhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC50b0ZpbGUoKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIuYnVpbGQoc3ByaW5nQ29uZmlnSW5wdXRTdGVhbSk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBiZWFucyA9IGRvYy5nZXRSb290RWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgTGlzdDxFbGVtZW50PiBlbmRwb2ludHMgPSBiZWFucy5nZXRDaGlsZHJlbihlbGVtZW50TmFtZSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBmb3IgKEVsZW1lbnQgZWxlbWVudCA6IGVuZHBvaW50cykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGlkQXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEF0dHJpYnV0ZS5nZXRWYWx1ZSgpLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEpET01FeGNlcHRpb24gamRvbWUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhqZG9tZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW5kcG9pbnRBZGRyZXNzKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBqYXh3c0VuZHBvaW50SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElGaWxlIHNwcmluZ0NvbmZpZ0ZpbGUgPSBudWxsOwotICAgICAgICBpZiAoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdGaWxlID0gU3ByaW5nVXRpbHMuZ2V0QmVhbnNGaWxlKHByb2plY3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3ByaW5nQ29uZmlnRmlsZSA9IFNwcmluZ1V0aWxzLmdldENYRlNlcnZsZXQocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzU3ByaW5nQmVhbnNGaWxlKHNwcmluZ0NvbmZpZ0ZpbGUpKSB7Ci0gICAgICAgICAgICBTQVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU0FYQnVpbGRlcigpOwotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNwcmluZ0NvbmZpZ0ZpbGUuZ2V0TG9jYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAudG9GaWxlKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLmJ1aWxkKHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0pOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgYmVhbnMgPSBkb2MuZ2V0Um9vdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBMaXN0PEVsZW1lbnQ+IGVuZHBvaW50cyA9IGJlYW5zLmdldENoaWxkcmVuKCJlbmRwb2ludCIsIEpBWFdTX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZvciAoRWxlbWVudCBlbGVtZW50IDogZW5kcG9pbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXR0cmlidXRlLmdldFZhbHVlKCkuZXF1YWxzKGpheHdzRW5kcG9pbnRJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImFkZHJlc3MiKS5nZXRWYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGpkb21lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coamRvbWUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzcHJpbmdDb25maWdJbnB1dFN0ZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUNvbmZpZ3VyYXRpb25Gcm9tV1NETChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuZ2V0KHRhcmdldE5hbWVzcGFjZSk7Ci0KLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKTsKLSAgICAgICAgTWFwIHNlcnZpY2VzTWFwID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICBTZXQ8TWFwLkVudHJ5PiBzZXJ2aWNlc1NldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5IHNlcnZpY2VFbnRyeSA6IHNlcnZpY2VzU2V0KSB7Ci0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgc2VydmljZUVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgTWFwIHBvcnRzTWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICAgICAgU2V0PE1hcC5FbnRyeT4gcG9ydHNTZXQgPSBwb3J0c01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgcG9ydEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RW5kcG9pbnROYW1lKHBvcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IHBvcnQuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBwb3J0VHlwZS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0VHlwZU5hbWUgPSBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgPSBwYWNrYWdlTmFtZSArICIuIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBjb252ZXJ0UG9ydFR5cGVOYW1lKHBvcnRUeXBlTmFtZSkgKyAiSW1wbCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIFNwcmluZ1V0aWxzLmNyZWF0ZUpBWFdTRW5kcG9pbnQobW9kZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWRTcHJpbmdDb25maWdJbmZvcm1hdGlvbkZyb21XU0RMKENYRkRhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBJRmlsZSB3c2RsRmlsZSA9IFdTRExVdGlscy5nZXRXU0RMRm9sZGVyKG1vZGVsLmdldFByb2plY3ROYW1lKCkpLmdldEZpbGUobW9kZWwuZ2V0V3NkbEZpbGVOYW1lKCkpOwotICAgICAgICBpZiAod3NkbEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0V3NkbFVSTCh3c2RsRmlsZS5nZXRMb2NhdGlvblVSSSgpLnRvVVJMKCkpOwotICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IFdTRExVdGlscy5yZWFkV1NETChtb2RlbC5nZXRXc2RsVVJMKCkpOwotICAgICAgICAgICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBzZXJ2aWNlc1NldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgc2VydmljZUVudHJ5IDogc2VydmljZXNTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBNYXAgcG9ydHNNYXAgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIFNldDxNYXAuRW50cnk+IHBvcnRzU2V0ID0gcG9ydHNNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBwb3J0RW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldEVuZHBvaW50TmFtZShwb3J0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0V3NkbERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhtdXJsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRQb3J0VHlwZU5hbWUoU3RyaW5nIHBvcnRUeXBlTmFtZSkgewotICAgICAgICBTdHJpbmdbXSBzZWdtZW50cyA9IHBvcnRUeXBlTmFtZS5zcGxpdCgiW1xcLVxcLlxcOlxcX1xcdTAwYjdcXHUwMzg3XFx1MDZkZFxcdTA2ZGVdIik7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgc2VnbWVudCA6IHNlZ21lbnRzKSB7Ci0gICAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGFyIGZpcnN0Q2hhcmFjdGVyID0gc2VnbWVudC5jaGFyQXQoMCk7Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0RpZ2l0KGZpcnN0Q2hhcmFjdGVyKSAmJiBDaGFyYWN0ZXIuaXNMb3dlckNhc2UoZmlyc3RDaGFyYWN0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgc2VnbWVudCA9IHNlZ21lbnQuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBzZWdtZW50LnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50Lmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGN1cnJlbnRDaGFyID0gc2VnbWVudC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgY2hhciBwcmVjZWRpbmdDaGFyID0gc2VnbWVudC5jaGFyQXQoaSAtIDEpOwotICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoY3VycmVudENoYXIpICYmIENoYXJhY3Rlci5pc0RpZ2l0KHByZWNlZGluZ0NoYXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBDaGFyYWN0ZXIuaXNMb3dlckNhc2UoY3VycmVudENoYXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBzZWdtZW50LnN1YnN0cmluZygwLCBpKSArIHNlZ21lbnQuc3Vic3RyaW5nKGksIGkgKyAxKS50b1VwcGVyQ2FzZSgpCi0gICAgICAgICAgICAgICAgICAgICsgc2VnbWVudC5zdWJzdHJpbmcoaSArIDEsIHNlZ21lbnQubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKHNlZ21lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUpBWFdTRW5kcG9pbnQoQ1hGRGF0YU1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotCi0gICAgICAgIElGaWxlIHNwcmluZ0NvbmZpZ0ZpbGUgPSBudWxsOwotICAgICAgICBpZiAoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdGaWxlID0gU3ByaW5nVXRpbHMuZ2V0QmVhbnNGaWxlKHByb2plY3ROYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwcmluZ0NvbmZpZ0ZpbGUgPSBTcHJpbmdVdGlscy5nZXRDWEZTZXJ2bGV0KHByb2plY3ROYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1NwcmluZ0JlYW5zRmlsZShzcHJpbmdDb25maWdGaWxlKSkgewotICAgICAgICAgICAgU0FYQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzcHJpbmdDb25maWdJbnB1dFN0ZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcHJpbmdDb25maWdGaWxlLmdldExvY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLnRvRmlsZSgpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5idWlsZChzcHJpbmdDb25maWdJbnB1dFN0ZWFtKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGJlYW5zID0gZG9jLmdldFJvb3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGpheHdzRW5kcG9pbnQgPSBuZXcgRWxlbWVudCgiZW5kcG9pbnQiLCBKQVhXU19OUyk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IGdldEpBWFdTRW5kcG9pbnRJRChtb2RlbCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0Q29uZmlnSWQoaWQpOwotICAgICAgICAgICAgICAgIGpheHdzRW5kcG9pbnQuc2V0QXR0cmlidXRlKCJpZCIsIGlkKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgamF4d3NFbmRwb2ludC5zZXRBdHRyaWJ1dGUoImltcGxlbWVudG9yIiwgbW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBqYXh3c0VuZHBvaW50LnNldEF0dHJpYnV0ZSgid3NkbExvY2F0aW9uIiwgbW9kZWwuZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLmdldEVuZHBvaW50TmFtZSgpICE9IG51bGwgJiYgbW9kZWwuZ2V0U2VydmljZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXh3c0VuZHBvaW50LnNldEF0dHJpYnV0ZSgiZW5kcG9pbnROYW1lIiwgInRuczoiICsgbW9kZWwuZ2V0RW5kcG9pbnROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAgICAgICAgIGpheHdzRW5kcG9pbnQuc2V0QXR0cmlidXRlKCJzZXJ2aWNlTmFtZSIsICJ0bnM6IiArIG1vZGVsLmdldFNlcnZpY2VOYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlIFhNTE5TX1ROUyA9IE5hbWVzcGFjZS5nZXROYW1lc3BhY2UoInRucyIsIG1vZGVsLmdldFRhcmdldE5hbWVzcGFjZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgamF4d3NFbmRwb2ludC5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihYTUxOU19UTlMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmdldEVuZHBvaW50TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgamF4d3NFbmRwb2ludC5zZXRBdHRyaWJ1dGUoImFkZHJlc3MiLCAiLyIgKyBtb2RlbC5nZXRFbmRwb2ludE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGpheHdzRW5kcG9pbnQuc2V0QXR0cmlidXRlKCJhZGRyZXNzIiwgIi8iICsgaWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgamF4d3NGZWF0dXJlcyA9IG5ldyBFbGVtZW50KCJmZWF0dXJlcyIsIEpBWFdTX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIEVsZW1lbnQgYmVhbiA9IG5ldyBFbGVtZW50KCJiZWFuIiwgU1BSSU5HX0JFQU5TX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGJlYW4uc2V0QXR0cmlidXRlKCJjbGFzcyIsICJvcmcuYXBhY2hlLmN4Zi5mZWF0dXJlLkxvZ2dpbmdGZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIGpheHdzRmVhdHVyZXMuYWRkQ29udGVudChiZWFuKTsKLSAgICAgICAgICAgICAgICBqYXh3c0VuZHBvaW50LmFkZENvbnRlbnQoamF4d3NGZWF0dXJlcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWlzQmVhbkRlZmluZWQobW9kZWwsIHByb2plY3ROYW1lLCAiZW5kcG9pbnQiLCBKQVhXU19OUywgaWQpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgYmVhbnMuYWRkQ29udGVudChqYXh3c0VuZHBvaW50KTsKLQotICAgICAgICAgICAgICAgICAgICB3cml0ZUNvbmZpZyhkb2MsIHNwcmluZ0NvbmZpZ0ZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEpET01FeGNlcHRpb24gamRvbWUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhqZG9tZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRKQVhXU0VuZHBvaW50SUQoQ1hGRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFN0cmluZyBpbXBsZW1lbnRvciA9IG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpOwotICAgICAgICBpZiAoaW1wbGVtZW50b3IuaW5kZXhPZigiLiIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGltcGxlbWVudG9yID0gaW1wbGVtZW50b3Iuc3Vic3RyaW5nKGltcGxlbWVudG9yLmxhc3RJbmRleE9mKCIuIikgKyAxLCBpbXBsZW1lbnRvci5sZW5ndGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpbXBsZW1lbnRvci5zdGFydHNXaXRoKCJJbXBsIikgJiYgaW1wbGVtZW50b3IuaW5kZXhPZigiSW1wbCIpICE9IC0xKSB7Ci0gICAgICAgICAgICBpbXBsZW1lbnRvciA9IGltcGxlbWVudG9yLnN1YnN0cmluZygwLCBpbXBsZW1lbnRvci5pbmRleE9mKCJJbXBsIikpLnRvTG93ZXJDYXNlKCk7IC8vJE5PTi1OTFMtMSQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbXBsZW1lbnRvciA9IGltcGxlbWVudG9yLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGltcGxlbWVudG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVDb25maWcoRG9jdW1lbnQgZG9jdW1lbnQsIElGaWxlIHNwcmluZ0NvbmZpZ0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzcHJpbmdDb25maWdGaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgIG91dHB1dHRlci5vdXRwdXQoZG9jdW1lbnQsIG91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdGaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5mb3JtYXRYTUxGaWxlKHNwcmluZ0NvbmZpZ0ZpbGUpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2ZhY2V0L0NYRkZhY2V0SW5zdGFsbEFjdGlvbkNvbmZpZ0ZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2ZhY2V0L0NYRkZhY2V0SW5zdGFsbEFjdGlvbkNvbmZpZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkNmVkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldEluc3RhbGxBY3Rpb25Db25maWdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkNvbmZpZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBDWEZGYWNldEluc3RhbGxBY3Rpb25Db25maWdGYWN0b3J5IGltcGxlbWVudHMgSUFjdGlvbkNvbmZpZ0ZhY3RvcnkgewotCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENYRkRhdGFNb2RlbCBkYXRhTW9kZWwgPSBDWEZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhMldTRGF0YU1vZGVsKCk7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0KLSAgICAgICAgZGF0YU1vZGVsLnNldERlZmF1bHRSdW50aW1lVmVyc2lvbihjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpKTsKLSAgICAgICAgZGF0YU1vZGVsLnNldERlZmF1bHRSdW50aW1lTG9jYXRpb24oY29udGV4dC5nZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkpOwotICAgICAgICBkYXRhTW9kZWwuc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkpOwotICAgICAgICBkYXRhTW9kZWwuc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KGNvbnRleHQuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgIHJldHVybiBkYXRhTW9kZWw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvZmFjZXQvQ1hGRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjYjg5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkFwdENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEFkZHMgdGhlIENYRiBjbGFzc3BhdGggY29udGFpbmVyIHRvIHRoZSBwcm9qZWN0LgotICogPHA+Ci0gKiBBbHNvIHNldHMgdXAgdGhlIHdlYiBwcm9qZWN0cyBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKHdlYi54bWwgZmlsZSkKLSAqIHRvIHVzZSBjeGYtc2VydmxldCBvciB0aGUgU3ByaW5nIEFwcGxpY2F0aW9uIGNvbnRleHQgKFdFQi1JTkYvYmVhbnMueG1sKSBmb3IKLSAqIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24uIERlcGVuZHMgb24gYSBzZXR0aW5nIGluIHRoZSBDWEYgcHJlZmVyZW5jZXMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRkZhY2V0SW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIE9iamVjdCBjb25maWcsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICBDWEZEYXRhTW9kZWwgbW9kZWwgPSAoQ1hGRGF0YU1vZGVsKSBjb25maWc7Ci0KLSAgICAgICAgLy9TZXQgcHJvamVjdCBkZWZhdWx0Ci0gICAgICAgIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldENYRlJ1bnRpbWVWZXJzaW9uKHByb2plY3QsIG1vZGVsLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpKTsKLQotICAgICAgICBpZiAoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIENYRkNvcmVNZXNzYWdlcy5DWEZfRkFDRVRfSU5TVEFMTF9ERUxFR0FURV9SVU5USU1FX0xPQ0FUSU9OX05PVF9TRVQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIElQYXRoIGN4ZkxpYlBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkpOwotCi0gICAgICAgIGlmICghY3hmTGliUGF0aC5oYXNUcmFpbGluZ1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICBjeGZMaWJQYXRoID0gY3hmTGliUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGN4ZkxpYlBhdGggPSBjeGZMaWJQYXRoLmFwcGVuZCgibGliIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJQ2xhc3NwYXRoQXR0cmlidXRlIGpzdENvbXBvbmVudERlcGVuZGVuY3kgPQotICAgICAgICAgICAgSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKCJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50LmRlcGVuZGVuY3kiLCAiL1dFQi1JTkYvbGliIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSUNsYXNzcGF0aEVudHJ5IGN4ZkNsYXNzcGF0aENvbnRhaW5lciA9Ci0gICAgICAgICAgICBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShuZXcgUGF0aChDWEZDb3JlUGx1Z2luLkNYRl9DTEFTU1BBVEhfQ09OVEFJTkVSX0lEKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IElBY2Nlc3NSdWxlWzBdLAotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmlzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkKLSAgICAgICAgICAgICAgICAgICAgPyBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtde2pzdENvbXBvbmVudERlcGVuZGVuY3l9IDogbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbXXt9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgIEpEVFV0aWxzLmFkZFRvQ2xhc3NwYXRoKEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSwgY3hmQ2xhc3NwYXRoQ29udGFpbmVyKTsKLQotICAgICAgICBpZiAoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBBcHRDb25maWcuc2V0RW5hYmxlZChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCksIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDQwOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvZmFjZXQvQ1hGRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIENYRkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAKLSAgICAgICAgLy9UT0RPIEltcGxlbWVudAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjFkMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkZDFlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGU4ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIE5vdiAwNyAyMzo1ODo1NCBFU1QgMjAwOAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjJjYzViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDIuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qZWU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQ3JlYXRlZC1CeTogMS41LjBfMTQtYjAzIChTdW4gTWljcm9zeXN0ZW1zIEluYy4pCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmE3MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDdmM2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBDcmVhdGlvbiBDb3JlCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDhjOTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BST0pFQ1RfU0VMRUNUSU9OX0VSUk9SOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9WQUxJRF9QT1JUVFlQRV9NRVNTQUdFOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VSVklDRV9JTVBMX05PVF9GT1VORDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFUlZJQ0VfSU1QTF9OT1RfQklOQVJZOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FjMTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6IAotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotV1NETDJKQVZBX1BST0pFQ1RfU0VMRUNUSU9OX0VSUk9SPUEgcG9zc2libGUgY29uZmxpY3QgaGFzIGJlZW4gZGV0ZWN0ZWQgYmV0d2VlbiBwcm9qZWN0IHNlbGVjdGlvbnMuXG5cbiBUaGUgY3VycmVudCBjb25maWd1cmF0aW9uIHdpbGwgcmVzdWx0IGluIGNvZGUgYmVpbmcgZ2VuZXJhdGVkIGludG8gdGhlICJ7MH0iIHByb2plY3QuXG5cblRvIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBjbGljayBDYW5jZWwgYW5kIHRoZW4gc2VsZWN0IHRoZSAiU2VydmljZSBwcm9qZWN0OiIgbGluayBpbiB0aGUgIkNvbmZpZ3VyYXRpb246IiBzZWN0aW9uIGluIHRoZSBXZWIgU2VydmljZSB3aXphcmQuXG5cbkNsaWNrIE9rIHRvIGNvbnRpbnVlIHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQotV1NETDJKQVZBX1ZBTElEX1BPUlRUWVBFX01FU1NBR0U9VGhlIFdTREwgZG9jdW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgcG9ydFR5cGUgZWxlbWVudAotCi1KQVZBMldTX1NFUlZJQ0VfSU1QTF9OT1RfRk9VTkQ9VGhlIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gInswfSIgY2Fubm90IGJlIGxvYWRlZCBmcm9tIHRoZSAiezF9IiBwcm9qZWN0LiBQbGVhc2UgY2hlY2sgdGhhdCB0aGUgcHJvamVjdCBjb250YWlucyB0aGUgY2xhc3MgYW5kIHRoYXQgaXQgaXMgdmlzaWJsZSBvbiB0aGUgcHJvamVjdHMgIkphdmEgQnVpbGQgUGF0aCIuCi1KQVZBMldTX1NFUlZJQ0VfSU1QTF9OT1RfQklOQVJZPUJpbmFyeSBjbGFzcyBmaWxlcyBub3Qgc3VwcG9ydGVkLiBUaGUgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBtdXN0IGJlIGEgSmF2YSBTb3VyY2UgdHlwZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzOWU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLSAgICAvLyBUaGUgcGx1Zy1pbiBJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luIHBsdWdpbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBDWEZDcmVhdGlvbkNvcmVQbHVnaW4oKSB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICBleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0NYRkRlcGxveUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvQ1hGRGVwbG95Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTY0NWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvQ1hGRGVwbG95Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQnVnICMyNzQyOTMgLSBzdWRoYW5AcHJvZ3Jlc3MuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAxMi5TT0FQMTJBZGRyZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuU3ByaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBDWEZEZXBsb3lDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDWEZfU0VSVkxFVCA9ICJvcmcuYXBhY2hlLmN4Zi50cmFuc3BvcnQuc2VydmxldC5DWEZTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBDWEZEYXRhTW9kZWwgbW9kZWw7Ci0KLSAgICBwdWJsaWMgQ1hGRGVwbG95Q29tbWFuZChTdHJpbmcgcHJvamVjdE5hbWUsIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gRmlsZVV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICB0aGlzLndlYlNlcnZpY2UgPSB3ZWJTZXJ2aWNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFdlYlNlcnZpY2VJbmZvIHdlYlNlcnZpY2VJbmZvID0gd2ViU2VydmljZS5nZXRXZWJTZXJ2aWNlSW5mbygpOwotCi0gICAgICAgICAgICBTdHJpbmcgc2VydmVySW5zdGFuY2VJZCA9IHdlYlNlcnZpY2VJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKTsKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQgPSB3ZWJTZXJ2aWNlSW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2ZXJJbnN0YW5jZUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJbnN0YW5jZUlkKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd2ViQ29iQ29tcG9uZW50VVJMID0gU2VydmVyVXRpbHMuZ2V0RW5jb2RlZFdlYkNvbXBvbmVudFVSTChwcm9qZWN0LCBzZXJ2ZXJGYWN0b3J5SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHVybFBhdHRlcm4gPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotICAgICAgICAgICAgICAgIE9iamVjdCBtb2RlbFByb3ZpZGVyID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAvLyBqc3Qud2ViIDIuNQotICAgICAgICAgICAgICAgIGlmIChtb2RlbFByb3ZpZGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCBqYXZhZWVXZWJBcHAgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxQcm92aWRlcjsKLQotICAgICAgICAgICAgICAgICAgICB1cmxQYXR0ZXJuID0gZ2V0VVJMUGF0dGVybihqYXZhZWVXZWJBcHApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGpzdC53ZWIgMi40Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVsUHJvdmlkZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIHdlYkFwcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwKSBtb2RlbFByb3ZpZGVyOwotCi0gICAgICAgICAgICAgICAgICAgIHVybFBhdHRlcm4gPSBnZXRVUkxQYXR0ZXJuKHdlYkFwcCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdXJsUGF0dGVybiA9IHVybFBhdHRlcm4uc3Vic3RyaW5nKDAsIHVybFBhdHRlcm4ubGFzdEluZGV4T2YoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBTdHJpbmcgamF4d3NFbmRwb2ludEFkZHJlc3MgPSBTcHJpbmdVdGlscy5nZXRFbmRwb2ludEFkZHJlc3MocHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldENvbmZpZ0lkKCkpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxBZGRyZXNzID0gd2ViQ29iQ29tcG9uZW50VVJMICsgdXJsUGF0dGVybiArIGpheHdzRW5kcG9pbnRBZGRyZXNzOwotICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsVVJMID0gd3NkbEFkZHJlc3MgKyAiP3dzZGwiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlLmdldFdlYlNlcnZpY2VJbmZvKCkuc2V0V3NkbFVSTCh3c2RsVVJMKTsKLQotICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG1vZGVsLmdldFdzZGxEZWZpbml0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IFdTRExVdGlscy5nZXRFbmRwb2ludEFkZHJlc3MoZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoU09BUEFkZHJlc3MpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5zZXRMb2NhdGlvblVSSSh3c2RsQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUDEyQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgKChTT0FQMTJBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuc2V0TG9jYXRpb25VUkkod3NkbEFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgV1NETFV0aWxzLndyaXRlV1NETChtb2RlbC5nZXRXc2RsVVJMKCksIGRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGlvZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgU3RyaW5nIGdldFVSTFBhdHRlcm4ob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIGphdmFlZVdlYkFwcCkgewotICAgICAgICBMaXN0PG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ+IHNlcnZsZXRzID0gamF2YWVlV2ViQXBwLmdldFNlcnZsZXRzKCk7Ci0gICAgICAgIGZvciAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCBzZXJ2bGV0IDogc2VydmxldHMpIHsKLSAgICAgICAgICAgIGlmIChzZXJ2bGV0LmdldFNlcnZsZXRDbGFzcygpLmVxdWFscyhDWEZfU0VSVkxFVCkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nPiBzZXJ2bGV0TWFwcGluZ3MgPQotICAgICAgICAgICAgICAgICAgICBqYXZhZWVXZWJBcHAuZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyBzZXJ2bGV0TWFwcGluZyA6IHNlcnZsZXRNYXBwaW5ncykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmxldE1hcHBpbmcuZ2V0U2VydmxldE5hbWUoKS5lcXVhbHMoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU+IHVybFBhdHRlcm5zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0TWFwcGluZy5nZXRVcmxQYXR0ZXJucygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVybFBhdHRlcm5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAodXJsUGF0dGVybnMuZ2V0KDApKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIFN0cmluZyBnZXRVUkxQYXR0ZXJuKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCB3ZWJBcHApIHsKLSAgICAgICAgTGlzdDxvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0PiBzZXJ2bGV0cyA9IHdlYkFwcC5nZXRTZXJ2bGV0cygpOwotICAgICAgICBmb3IgKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQgc2VydmxldCA6IHNlcnZsZXRzKSB7Ci0gICAgICAgICAgICBpZiAoc2VydmxldC5nZXRTZXJ2bGV0Q2xhc3MoKS5nZXRKYXZhTmFtZSgpLmVxdWFscyhDWEZfU0VSVkxFVCkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nPiBzZXJ2bGV0TWFwcGluZ3MgPQotICAgICAgICAgICAgICAgICAgICB3ZWJBcHAuZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZyBzZXJ2bGV0TWFwcGluZyA6IHNlcnZsZXRNYXBwaW5ncykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmxldE1hcHBpbmcuZ2V0U2VydmxldCgpLmdldFNlcnZsZXROYW1lKCkuZXF1YWxzKHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2bGV0TWFwcGluZy5nZXRVcmxQYXR0ZXJuKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q1hGRGF0YU1vZGVsKENYRkRhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRDb21wb25lbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gInRlbXBsYXRlLmN4Zi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvQ3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3JDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0NyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTc3NDBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvQ3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBJT05BIFRlY2hub2xvZ2llcyBQTEMsIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSU9OQSBUZWNobm9sb2dpZXMgUExDLCBtb2RpZnkgd2ViLnhtbCBjb2RlIGluaXRpYWxseSBwYXJ0IG9mIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuZmFjZXQuQ1hGRmFjZXRJbnN0YWxsRGVsZWdhdGUKLSAqICAgIFNoYW5lIENsYXJrZSAtIGFkZGVkIHdlYi54bWwgZmlsZSBjcmVhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFlZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldC5JQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuSVdlYkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlcy5XZWJDb250ZW50Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotCi0gICAgcHJpdmF0ZSBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgd2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotCi0gICAgcHVibGljIENyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yQ29tbWFuZChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICB3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyKHByb2plY3ROYW1lKTsKLQotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0gICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBJUGF0aCB3ZWJYbWxGaWxlUGF0aCA9IG5ldyBQYXRoKCJXRUItSU5GL3dlYi54bWwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0gICAgICAgIGlmKHZpcnR1YWxDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiB2aXJ0dWFsQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgSUZpbGUgd2ViWG1sRmlsZSA9IHZpcnR1YWxDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKS5nZXRGaWxlKHdlYlhtbEZpbGVQYXRoKTsKLSAgICAgICAgICAgIGlmICghd2ViWG1sRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoSVdlYkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuY2xhc3MpOwotICAgICAgICAgICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfUFJPSkVDVCwgcHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBDWEYgU2VydmxldCwgU2VydmxldCBNYXBwaW5nIGFuZCBTZXNzaW9uIENvbmZpZyB0byB3ZWIueG1sCi0gICAgICAgIGZpbmFsIElNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KTsKLSAgICAgICAgcHJvdmlkZXIubW9kaWZ5KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbW9kZWxQcm92aWRlciA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VTcHJpbmdBcHBDb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIC8vIGpzdC53ZWIgMi41Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVsUHJvdmlkZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIGphdmFlZVdlYkFwcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSBtb2RlbFByb3ZpZGVyOwotICAgICAgICAgICAgICAgICAgICBhZGRDWEZKU1RXRUIyNVNlcnZsZXQocHJvamVjdCwgamF2YWVlV2ViQXBwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVNwcmluZ0FwcENvbnRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dFdlYjI1KHByb2plY3QsIGphdmFlZVdlYkFwcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIG51bGwpOwotCi0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcik7Ci0KLSAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgTGlzdDxJUmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLSAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwod2ViQ29udGVudENoYW5nZUxpc3RlbmVyLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0gICAgICAgIGlmIChjaGFuZ2VkUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dFdlYjI1KElQcm9qZWN0IHdlYlByb2plY3QsCi0gICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViYXBwKSB7Ci0gICAgICAgIExpc3QgY29udGV4dFBhcmFtcyA9IHdlYmFwcC5nZXRDb250ZXh0UGFyYW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dFBhcmFtcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGFyYW1WYWx1ZSBjb250ZXh0UGFyYW0gPSAoUGFyYW1WYWx1ZSkgY29udGV4dFBhcmFtcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dFBhcmFtLmdldFBhcmFtTmFtZSgpLmVxdWFscygiY29udGV4dENvbmZpZ0xvY2F0aW9uIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgbGlzdGVuZXJzID0gd2ViYXBwLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyIGNvbnRleHRMb2FkZXJMaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lcikgbGlzdGVuZXJzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChjb250ZXh0TG9hZGVyTGlzdGVuZXIuZ2V0TGlzdGVuZXJDbGFzcygpLmVxdWFscygKLSAgICAgICAgICAgICJvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LkNvbnRleHRMb2FkZXJMaXN0ZW5lciIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBKYXZhZWVGYWN0b3J5IGphdmFlZUZhY3RvcnkgPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRTsKLQotICAgICAgICBQYXJhbVZhbHVlIGNvbmZpZ0xvY2F0aW9uUGFyYW0gPSBqYXZhZWVGYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWUoKTsKLSAgICAgICAgY29uZmlnTG9jYXRpb25QYXJhbS5zZXRQYXJhbU5hbWUoImNvbnRleHRDb25maWdMb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbmZpZ0xvY2F0aW9uUGFyYW0uc2V0UGFyYW1WYWx1ZSgiV0VCLUlORi9iZWFucy54bWwiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHdlYmFwcC5nZXRDb250ZXh0UGFyYW1zKCkuYWRkKGNvbmZpZ0xvY2F0aW9uUGFyYW0pOwotCi0gICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciBjb250ZXh0TG9hZGVyTGlzdGVuZXIgPSBqYXZhZWVGYWN0b3J5LmNyZWF0ZUxpc3RlbmVyKCk7Ci0gICAgICAgIGNvbnRleHRMb2FkZXJMaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzKCJvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LkNvbnRleHRMb2FkZXJMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgd2ViYXBwLmdldExpc3RlbmVycygpLmFkZChjb250ZXh0TG9hZGVyTGlzdGVuZXIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCBhZGRDWEZKU1RXRUIyNVNlcnZsZXQoSVByb2plY3Qgd2ViUHJvamVjdCwgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYmFwcCkgewotICAgICAgICBMaXN0IHNlcnZsZXRzID0gd2ViYXBwLmdldFNlcnZsZXRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBzZXJ2bGV0cy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpLmVxdWFscygiY3hmIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENYRiBTZXJ2bGV0Ci0gICAgICAgIFdlYkZhY3RvcnkgZmFjdG9yeSA9IFdlYkZhY3RvcnkuZUlOU1RBTkNFOwotICAgICAgICBTZXJ2bGV0IGN4ZlNlcnZsZXQgPSBmYWN0b3J5LmNyZWF0ZVNlcnZsZXQoKTsKLQotICAgICAgICBjeGZTZXJ2bGV0LnNldFNlcnZsZXROYW1lKCJjeGYiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIERpc3BsYXlOYW1lIGN4ZlNlcnZsZXREaXNwbGF5TmFtZSA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0gICAgICAgIGN4ZlNlcnZsZXREaXNwbGF5TmFtZS5zZXRWYWx1ZSgiY3hmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3hmU2VydmxldC5nZXREaXNwbGF5TmFtZXMoKS5hZGQoY3hmU2VydmxldERpc3BsYXlOYW1lKTsKLQotICAgICAgICBEZXNjcmlwdGlvbiBjeGZTZXJ2bGV0RGVzY3JpcHRpb24gPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOwotICAgICAgICBjeGZTZXJ2bGV0RGVzY3JpcHRpb24uc2V0VmFsdWUoIkFwYWNoZSBDWEYgRW5kcG9pbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjeGZTZXJ2bGV0LmdldERlc2NyaXB0aW9ucygpLmFkZChjeGZTZXJ2bGV0RGVzY3JpcHRpb24pOwotCi0gICAgICAgIGN4ZlNlcnZsZXQuc2V0U2VydmxldENsYXNzKCJvcmcuYXBhY2hlLmN4Zi50cmFuc3BvcnQuc2VydmxldC5DWEZTZXJ2bGV0Iik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBjeGZTZXJ2bGV0LnNldExvYWRPblN0YXJ0dXAoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQotICAgICAgICB3ZWJhcHAuZ2V0U2VydmxldHMoKS5hZGQoY3hmU2VydmxldCk7Ci0KLSAgICAgICAgU2VydmxldE1hcHBpbmcgY3hmU2VydmxldE1hcHBpbmcgPSBmYWN0b3J5LmNyZWF0ZVNlcnZsZXRNYXBwaW5nKCk7Ci0gICAgICAgIGN4ZlNlcnZsZXRNYXBwaW5nLnNldFNlcnZsZXROYW1lKCJjeGYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBVcmxQYXR0ZXJuVHlwZSB1cmwgPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVcmxQYXR0ZXJuVHlwZSgpOwotICAgICAgICB1cmwuc2V0VmFsdWUoIi9zZXJ2aWNlcy8qIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3hmU2VydmxldE1hcHBpbmcuZ2V0VXJsUGF0dGVybnMoKS5hZGQodXJsKTsKLSAgICAgICAgd2ViYXBwLmdldFNlcnZsZXRNYXBwaW5ncygpLmFkZChjeGZTZXJ2bGV0TWFwcGluZyk7Ci0KLSAgICAgICAgU2Vzc2lvbkNvbmZpZyBzZXNzaW9uQ29uZmlnID0gZmFjdG9yeS5jcmVhdGVTZXNzaW9uQ29uZmlnKCk7Ci0gICAgICAgIHNlc3Npb25Db25maWcuc2V0U2Vzc2lvblRpbWVvdXQobmV3IEJpZ0ludGVnZXIoIjYwIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHdlYmFwcC5nZXRTZXNzaW9uQ29uZmlncygpLmFkZChzZXNzaW9uQ29uZmlnKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0pBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KQVhXU0Fubm90YXRlSmF2YUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhMTg2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0pBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuSVVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5BbnRFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHByaXZhdGUgaW50IG51bWJlck9mQ2hhbmdlcyA9IDA7Ci0KLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBJVHlwZSBqYXZhQ2xhc3NUeXBlOwotICAgIHByaXZhdGUgSVR5cGUgamF2YUludGVyZmFjZVR5cGU7Ci0KLSAgICBwdWJsaWMgSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIGlmIChnZXRFbnZpcm9ubWVudCgpIGluc3RhbmNlb2YgQW50RW52aXJvbm1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGVJbnRlcmZhY2UobW9uaXRvcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0ZVNFSUNsYXNzKG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFubm90YXRlQ2xhc3MobW9uaXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBpdGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhbm5vdGF0ZUludGVyZmFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YUludGVyZmFjZVR5cGUgPSBKRFRVdGlscy5maW5kVHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKSwgbW9kZWwKLSAgICAgICAgICAgICAgICAuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpKTsKLQotICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQW5ub3RhdGluZyBJbnRlcmZhY2UiLAotICAgICAgICAgICAgICAgIChJRmlsZSlqYXZhSW50ZXJmYWNlVHlwZS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgdGV4dEZpbGVDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlNlcnZpY2VBbm5vdGF0aW9uQ2hhbmdlKGphdmFJbnRlcmZhY2VUeXBlLCBtb2RlbCwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgIElNZXRob2RbXSB0eXBlTWV0aG9kcyA9IEpEVFV0aWxzLmdldFB1YmxpY01ldGhvZHMoamF2YUludGVyZmFjZVR5cGUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHR5cGVNZXRob2RzW2ldOwotICAgICAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gbWV0aG9kQW5ub3RhdGlvbk1hcCA9IG1vZGVsLmdldE1ldGhvZE1hcCgpLmdldChtZXRob2QpOwotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAgPT0gbnVsbCB8fCBtZXRob2RBbm5vdGF0aW9uTWFwLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5XRUJfTUVUSE9EKSkgewotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViTWV0aG9kQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSKSkgewotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0UmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uQ2hhbmdlKGphdmFJbnRlcmZhY2VUeXBlLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5SRVNQT05TRV9XUkFQUEVSKSkgewotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0UmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNKSkgewotICAgICAgICAgICAgICAgIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IEFubm90YXRpb25VdGlscy5nZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9ucyhtZXRob2QpOwotICAgICAgICAgICAgICAgIGZvciAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViUGFyYW1Bbm5vdGF0aW9uQ2hhbmdlKGphdmFJbnRlcmZhY2VUeXBlLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRJbXBvcnRzQ2hhbmdlKGphdmFJbnRlcmZhY2VUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBtb2RlbCwKLSAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSwgZmFsc2UpOwotCi0gICAgICAgIGV4ZWN1dGVDaGFuZ2UobW9uaXRvciwgdGV4dEZpbGVDaGFuZ2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhbm5vdGF0ZUNsYXNzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBqYXZhQ2xhc3NUeXBlID0gSkRUVXRpbHMuZmluZFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIG1vZGVsCi0gICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKLQotICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQW5ub3RhdGluZyBDbGFzcyIsCi0gICAgICAgICAgICAgICAgKElGaWxlKSBqYXZhQ2xhc3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICB0ZXh0RmlsZUNoYW5nZS5zZXRFZGl0KG11bHRpVGV4dEVkaXQpOwotCi0gICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViU2VydmljZUFubm90YXRpb25DaGFuZ2UoamF2YUNsYXNzVHlwZSwgbW9kZWwsIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICBJTWV0aG9kW10gdHlwZU1ldGhvZHMgPSBKRFRVdGlscy5nZXRQdWJsaWNNZXRob2RzKGphdmFDbGFzc1R5cGUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHR5cGVNZXRob2RzW2ldOwotICAgICAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gbWV0aG9kQW5ub3RhdGlvbk1hcCA9IG1vZGVsLmdldE1ldGhvZE1hcCgpLmdldChtZXRob2QpOwotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAgPT0gbnVsbCB8fCBtZXRob2RBbm5vdGF0aW9uTWFwLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QpKSB7Ci0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRXZWJNZXRob2RBbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1ldGhvZCwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSKSkgewotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0UmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIpKSB7Ci0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLldFQl9QQVJBTSkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMobWV0aG9kKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlBhcmFtQW5ub3RhdGlvbkNoYW5nZShqYXZhQ2xhc3NUeXBlLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRJbXBvcnRzQ2hhbmdlKGphdmFDbGFzc1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIG1vZGVsLAotICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLCBmYWxzZSk7Ci0KLSAgICAgICAgZXhlY3V0ZUNoYW5nZShtb25pdG9yLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFubm90YXRlU0VJQ2xhc3MoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLSAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmFDbGFzc1R5cGUgPSBKRFRVdGlscy5maW5kVHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKSwgbW9kZWwKLSAgICAgICAgICAgICAgICAuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkpOwotCi0gICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKCJBbm5vdGF0aW9uIENoYW5nZXMiLAotICAgICAgICAgICAgICAgIChJRmlsZSlqYXZhQ2xhc3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICB0ZXh0RmlsZUNoYW5nZS5zZXRFZGl0KG11bHRpVGV4dEVkaXQpOwotCi0gICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViU2VydmljZUFubm90YXRpb25DaGFuZ2UoamF2YUNsYXNzVHlwZSwgbW9kZWwsIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICBDWEZNb2RlbFV0aWxzLmdldEltcG9ydHNDaGFuZ2UoamF2YUNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbW9kZWwsCi0gICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UsIHRydWUpOwotCi0gICAgICAgIGV4ZWN1dGVDaGFuZ2UobW9uaXRvciwgdGV4dEZpbGVDaGFuZ2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlQ2hhbmdlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICBpZiAoY2hhbmdlID09IG51bGwgfHwgIWNoYW5nZS5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSVVuZG9NYW5hZ2VyIG1hbmFnZXIgPSBSZWZhY3RvcmluZ0NvcmUuZ2V0VW5kb01hbmFnZXIoKTsKLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzZnVsID0gZmFsc2U7Ci0gICAgICAgIENoYW5nZSB1bmRvQ2hhbmdlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0gICAgICAgICAgICBSZWZhY3RvcmluZ1N0YXR1cyB2YWxpZCA9IGNoYW5nZS5pc1ZhbGlkKG1vbml0b3IpOwotICAgICAgICAgICAgaWYgKHZhbGlkLmlzT0soKSkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIuYWJvdXRUb1BlcmZvcm1DaGFuZ2UoY2hhbmdlKTsKLSAgICAgICAgICAgICAgICB1bmRvQ2hhbmdlID0gY2hhbmdlLnBlcmZvcm0obW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbnVtYmVyT2ZDaGFuZ2VzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbWFuYWdlci5jaGFuZ2VQZXJmb3JtZWQoY2hhbmdlLCBzdWNjZXNzZnVsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodW5kb0NoYW5nZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1bmRvQ2hhbmdlLmluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShtb25pdG9yKTsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkVW5kbyh1bmRvQ2hhbmdlLmdldE5hbWUoKSwgdW5kb0NoYW5nZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgICAgIElVbmRvTWFuYWdlciBtYW5hZ2VyID0gUmVmYWN0b3JpbmdDb3JlLmdldFVuZG9NYW5hZ2VyKCk7Ci0KLSAgICAgICAgaWYgKG1hbmFnZXIuYW55dGhpbmdUb1VuZG8oKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mQ2hhbmdlczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hbmFnZXIucGVyZm9ybVVuZG8obnVsbCwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg2MzhiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5KYXZhMldTUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzLkphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXMuV2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5Db21tYW5kTGluZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkxhdW5jaFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5TcHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jeGYudG9vbHMuamF2YTJ3cy5KYXZhVG9XUzwvY29kZT4gb3IgdGhlCi0gKiA8Y29kZT5vcmcuYXBhY2hlLmN4Zi50b29scy5qYXZhMndzZGwuSmF2YVRvV1NETDwvY29kZT4gY29tbWFuZCBkZXBlbmRpbmcgb24gdGhlIHZlcnNpb24KLSAqIG9mIENYRiB1c2VkLgotICoKLSAqLwotcHVibGljIGNsYXNzIEphdmEyV1NDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBKQVZBMldTRExfVE9PTF9DTEFTU19OQU1FID0gIm9yZy5hcGFjaGUuY3hmLnRvb2xzLmphdmEyd3NkbC5KYXZhVG9XU0RMIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBKQVZBMldTX1RPT0xfQ0xBU1NfTkFNRSA9ICJvcmcuYXBhY2hlLmN4Zi50b29scy5qYXZhMndzLkphdmFUb1dTIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgU3RyaW5nIENYRl9UT09MX0NMQVNTX05BTUU7Ci0KLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7Ci0KLSAgICBwcml2YXRlIEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotICAgIHByaXZhdGUgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBKYXZhMldTQ29tbWFuZChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIElUeXBlIHN0YXJ0aW5nUG9pbnQgPSBKRFRVdGlscy5maW5kVHlwZShwcm9qZWN0TmFtZSwgbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSk7Ci0gICAgICAgIGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKEpEVFV0aWxzCi0gICAgICAgICAgICAgICAgLmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChzdGFydGluZ1BvaW50KSk7Ci0gICAgICAgIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIocHJvamVjdE5hbWUpOwotCi0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIod2ViQ29udGVudENoYW5nZUxpc3RlbmVyLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQotICAgICAgICBpZiAobW9kZWwuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkuY29tcGFyZVRvKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKSA+PSAwKSB7Ci0gICAgICAgICAgICBDWEZfVE9PTF9DTEFTU19OQU1FID0gSkFWQTJXU19UT09MX0NMQVNTX05BTUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDWEZfVE9PTF9DTEFTU19OQU1FID0gSkFWQTJXU0RMX1RPT0xfQ0xBU1NfTkFNRTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIHByb2dBcmdzID0gQ29tbWFuZExpbmVVdGlscy5nZXRKYXZhMldTUHJvZ3JhbUFyZ3VtZW50cyhtb2RlbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBGaWxlVXRpbHMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0gICAgICAgICAgICBMYXVuY2hVdGlscy5sYXVuY2goamF2YVByb2plY3QsIENYRl9UT09MX0NMQVNTX05BTUUsIHByb2dBcmdzKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5SjJXRmlsZXNGcm9tVG1wKG1vZGVsKTsKLQotICAgICAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVXU0RMKCkpIHsKLSAgICAgICAgICAgICAgICBTcHJpbmdVdGlscy5sb2FkU3ByaW5nQ29uZmlnSW5mb3JtYXRpb25Gcm9tV1NETChtb2RlbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0ltcGxlbWVudGF0aW9uU2VsZWN0ZWQoKSB8fCBpc0dlbmVyYXRlU2VydmVyKCkpIHsKLSAgICAgICAgICAgICAgICBTcHJpbmdVdGlscy5jcmVhdGVKQVhXU0VuZHBvaW50KG1vZGVsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGlvZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIod2ViQ29udGVudENoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5yZWZyZXNoUHJvamVjdChwcm9qZWN0TmFtZSwgbW9uaXRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ltcGxlbWVudGF0aW9uU2VsZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSAhPSBudWxsICYmCi0gICAgICAgIG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzR2VuZXJhdGVTZXJ2ZXIoKSB7Ci0gICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlU2VydmVyKCkpIHsKLSAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZShtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkgKyAiSW1wbCIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIExpc3Q8SVJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0gICAgICAgIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0gICAgICAgIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotICAgICAgICBpZiAoY2hhbmdlZFJlc291cmNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5kZWxldGUodHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQ2xpZW50KGNvbnRleHQuaXNHZW5lcmF0ZUNsaWVudCgpKTsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXIoY29udGV4dC5pc0dlbmVyYXRlU2VydmVyKCkpOwotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKGNvbnRleHQuaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkpOwotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdTREwoY29udGV4dC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICAgICAgbW9kZWwuc2V0U29hcDEyQmluZGluZyhjb250ZXh0LmlzU29hcDEyQmluZGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGNvbnRleHQuaXNHZW5lcmF0ZVhTREltcG9ydHMoKSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIENYRkRhdGFNb2RlbCBnZXRDWEZEYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLSAgICAvL0FOVCBFbnZpcm9ubWVudCBNYXBwaW5ncwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQ2xpZW50KEJvb2xlYW4gZ2VuZXJhdGVDbGllbnQpIHsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVDbGllbnQoZ2VuZXJhdGVDbGllbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VydmVyKEJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXIpIHsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuZXJhdGVTZXJ2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoQm9vbGVhbiBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnModHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVXU0RMKEJvb2xlYW4gZ2VuZXJhdGVXU0RMKSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlV1NETChnZW5lcmF0ZVdTREwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxGaWxlTmFtZShTdHJpbmcgd3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIG1vZGVsLnNldFdzZGxGaWxlTmFtZSh3c2RsRmlsZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlWFNESW1wb3J0cyhCb29sZWFuIGdlbmVyYXRlWFNESW1wb3J0cykgewotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVhTREltcG9ydHMoZ2VuZXJhdGVYU0RJbXBvcnRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VTT0FQMTJCaW5kaW5nKEJvb2xlYW4gdXNlU09BUDEyQmluZGluZykgewotICAgICAgICBtb2RlbC5zZXRTb2FwMTJCaW5kaW5nKHVzZVNPQVAxMkJpbmRpbmcpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NEZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRkZTliYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NEZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5KYXZhMldTUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLQotICAgIHB1YmxpYyBKYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAgICAgICAgIG1vZGVsLnNldERlZmF1bHRSdW50aW1lVmVyc2lvbihjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldERlZmF1bHRSdW50aW1lVHlwZShjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpKTsKLQotICAgICAgICAgICAgSVR5cGUgc3RhcnRpbmdQb2ludFR5cGUgPSBnZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShzdGFydGluZ1BvaW50VHlwZS5pc0ludGVyZmFjZSgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEV4dHJhY3RJbnRlcmZhY2UoZmFsc2UpOwotCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBzdGFydGluZ1BvaW50VHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgbW9kZWwuc2V0VGFyZ2V0TmFtZXNwYWNlKEpEVFV0aWxzLmdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkpOwotCi0gICAgICAgICAgICBtb2RlbC5zZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoY29udGV4dC5pc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbihjb250ZXh0LmlzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oY29udGV4dC5pc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oY29udGV4dC5pc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRBbm5vdGF0aW9uTWFwKENYRk1vZGVsVXRpbHMuZ2V0QW5ub3RhdGlvbk1hcChtb2RlbCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0TWV0aG9kTWFwKENYRk1vZGVsVXRpbHMuZ2V0TWV0aG9kTWFwKHN0YXJ0aW5nUG9pbnRUeXBlLCBtb2RlbCkpOwotCi0gICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVhTREltcG9ydHMoY29udGV4dC5pc0dlbmVyYXRlWFNESW1wb3J0cygpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldERhdGFiaW5kaW5nKGNvbnRleHQuZ2V0RGF0YWJpbmRpbmcoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRGcm9udGVuZChjb250ZXh0LmdldEZyb250ZW5kKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVDbGllbnQoY29udGV4dC5pc0dlbmVyYXRlQ2xpZW50KCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXIoY29udGV4dC5pc0dlbmVyYXRlU2VydmVyKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0U29hcDEyQmluZGluZyhjb250ZXh0LmlzU29hcDEyQmluZGluZygpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoY29udGV4dC5pc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdTREwoY29udGV4dC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dChjb250ZXh0LmlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0VmVyYm9zZShjb250ZXh0LmlzVmVyYm9zZSgpKTsKLQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBtb2RlbC5nZXRKYXZhU3RhcnRpbmdQb2ludCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFdzZGxGaWxlTmFtZShjbGFzc05hbWUudG9Mb3dlckNhc2UoKSArIFdTRExVdGlscy5XU0RMX0ZJTEVfRVhURU5TSU9OKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgc3RhdHVzID0gam1lLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIENYRkRhdGFNb2RlbCBnZXRKYXZhMldTRGF0YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgcHVibGljIElUeXBlIGdldEphdmFTdGFydGluZ1BvaW50VHlwZSgpIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0UHJvamVjdE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGphdmFTdGFydGluZ1BvaW50ID0gbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKTsKLQotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlID0gSkRUVXRpbHMuZmluZFR5cGUoamF2YVByb2plY3QsIGphdmFTdGFydGluZ1BvaW50KTsKLSAgICAgICAgcmV0dXJuIHN0YXJ0aW5nUG9pbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBKRFRVdGlscy5maW5kVHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSksIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKQotICAgICAgICAuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTU2VsZWN0U0VJQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTU2VsZWN0U0VJQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjAzZjhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU1NlbGVjdFNFSUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3Jpbmcuc3RydWN0dXJlLkV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmFjdGlvbnMuV29ya2JlbmNoUnVubmFibGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5KYXZhUHJlZmVyZW5jZXNTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudXRpbC5CdXN5SW5kaWNhdG9yUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoZWNrQ29uZGl0aW9uc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DcmVhdGVDaGFuZ2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUGVyZm9ybUNoYW5nZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlByb2Nlc3NvckJhc2VkUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5BbnRFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NTZWxlY3RTRUlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHByaXZhdGUgQ2hhbmdlIHVuZG9FeHRyYWN0SW50ZXJmYWNlQ2hhbmdlOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHJpdmF0ZSAgSVR5cGUgc3RhcnRpbmdQb2ludFR5cGU7Ci0KLSAgICBwdWJsaWMgSmF2YTJXU1NlbGVjdFNFSUNvbW1hbmQoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgamF2YVN0YXJ0aW5nUG9pbnQgPSBtb2RlbC5nZXRKYXZhU3RhcnRpbmdQb2ludCgpOwotCi0gICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBzdGFydGluZ1BvaW50VHlwZSA9IEpEVFV0aWxzLmZpbmRUeXBlKGphdmFQcm9qZWN0LCBqYXZhU3RhcnRpbmdQb2ludCk7Ci0KLSAgICAgICAgICAgIGlmIChzdGFydGluZ1BvaW50VHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZShzdGFydGluZ1BvaW50VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0aW5nUG9pbnRUeXBlLmlzQ2xhc3MoKSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZShzdGFydGluZ1BvaW50VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgJiYgbW9kZWwuaXNFeHRyYWN0SW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZShzdGFydGluZ1BvaW50VHlwZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBqbWUuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0SW50ZXJmYWNlKElUeXBlIHR5cGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBpZiAoZ2V0RW52aXJvbm1lbnQoKSBpbnN0YW5jZW9mIEFudEVudmlyb25tZW50KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIEV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3IgZXh0cmFjdEludGVyZmFjZVByb2Nlc3NvciA9IG5ldyBFeHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yKHR5cGUsCi0gICAgICAgICAgICAgICAgICAgIEphdmFQcmVmZXJlbmNlc1NldHRpbmdzLmdldENvZGVHZW5lcmF0aW9uU2V0dGluZ3ModHlwZS5nZXRKYXZhUHJvamVjdCgpKSk7Ci0gICAgICAgICAgICBSZWZhY3RvcmluZyBleHRyYWN0SW50ZXJmYWNlUmVmYWN0b3JpbmcgPSBuZXcgUHJvY2Vzc29yQmFzZWRSZWZhY3RvcmluZyhleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yKSB7Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgUmVmYWN0b3JpbmdQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdEludGVyZmFjZVByb2Nlc3NvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gbW9kZWwuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpOwotICAgICAgICAgICAgaWYgKHR5cGVOYW1lLmluZGV4T2YoIi4iKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKHR5cGVOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxLCB0eXBlTmFtZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLnNldFR5cGVOYW1lKHR5cGVOYW1lKTsKLSAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3Iuc2V0UmVwbGFjZShmYWxzZSk7Ci0KLSAgICAgICAgICAgIFNldDxJTWV0aG9kPiBtZXRob2RzID0gbW9kZWwuZ2V0TWV0aG9kTWFwKCkua2V5U2V0KCk7Ci0gICAgICAgICAgICBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLnNldEV4dHJhY3RlZE1lbWJlcnMobWV0aG9kcy50b0FycmF5KG5ldyBJTWVtYmVyW21ldGhvZHMuc2l6ZSgpXSkpOwotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRBYnN0cmFjdChmYWxzZSk7Ci0gICAgICAgICAgICBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLnNldFB1YmxpYyh0cnVlKTsKLSAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3Iuc2V0Q29tbWVudHMoZmFsc2UpOwotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRJbnN0YW5jZU9mKGZhbHNlKTsKLQotICAgICAgICAgICAgQ3JlYXRlQ2hhbmdlT3BlcmF0aW9uIGNyZWF0ZUNoYW5nZU9wZXJhdGlvbiA9IG5ldyBDcmVhdGVDaGFuZ2VPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDaGVja0NvbmRpdGlvbnNPcGVyYXRpb24oZXh0cmFjdEludGVyZmFjZVJlZmFjdG9yaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ29uZGl0aW9uc09wZXJhdGlvbi5GSU5BTF9DT05ESVRJT05TKSwgUmVmYWN0b3JpbmdDb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbmRpdGlvbkNoZWNraW5nRmFpbGVkU2V2ZXJpdHkoKSk7Ci0KLSAgICAgICAgICAgIFBlcmZvcm1DaGFuZ2VPcGVyYXRpb24gcGVyZm9ybUNoYW5nZU9wZXJhdGlvbiA9IG5ldyBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uKGNyZWF0ZUNoYW5nZU9wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIFdvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlciBhZGFwdGVyID0gbmV3IFdvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlcihwZXJmb3JtQ2hhbmdlT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ1c3lJbmRpY2F0b3JSdW5uYWJsZUNvbnRleHQoKSwgYWRhcHRlciwgYWRhcHRlci5nZXRTY2hlZHVsaW5nUnVsZSgpKTsKLQotICAgICAgICAgICAgaWYgKHBlcmZvcm1DaGFuZ2VPcGVyYXRpb24uY2hhbmdlRXhlY3V0ZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArPSAiLiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lID0gcGFja2FnZU5hbWUgKyBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLmdldFR5cGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZShmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRNZXRob2RNYXAoQ1hGTW9kZWxVdGlscy5nZXRNZXRob2RNYXAoSkRUVXRpbHMuZmluZFR5cGUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUpLCBtb2RlbCkpOwotCi0gICAgICAgICAgICAgICAgdW5kb0V4dHJhY3RJbnRlcmZhY2VDaGFuZ2UgPSBwZXJmb3JtQ2hhbmdlT3BlcmF0aW9uLmdldFVuZG9DaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhpdGUpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhpZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBpZiAodW5kb0V4dHJhY3RJbnRlcmZhY2VDaGFuZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uIGNoYW5nZU9wZXJhdGlvbiA9IG5ldyBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uKHVuZG9FeHRyYWN0SW50ZXJmYWNlQ2hhbmdlKTsKLQotICAgICAgICAgICAgICAgIFdvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlciBhZGFwdGVyPSBuZXcgV29ya2JlbmNoUnVubmFibGVBZGFwdGVyKGNoYW5nZU9wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW5JblVJKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1c3lJbmRpY2F0b3JSdW5uYWJsZUNvbnRleHQoKSwgYWRhcHRlciwgYWRhcHRlci5nZXRTY2hlZHVsaW5nUnVsZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmICghc3RhcnRpbmdQb2ludFR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkuaXNDb25zaXN0ZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmdQb2ludFR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkubWFrZUNvbnNpc3RlbnQobW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbW9kZWwuc2V0TWV0aG9kTWFwKENYRk1vZGVsVXRpbHMuZ2V0TWV0aG9kTWFwKHN0YXJ0aW5nUG9pbnRUeXBlLCBtb2RlbCkpOwotCi0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gam1lLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBpdGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NWYWxpZGF0ZUlucHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwY2ZiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NWYWxpZGF0ZUlucHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHVibGljIEphdmEyV1NWYWxpZGF0ZUlucHV0Q29tbWFuZChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBKRFRVdGlscy5maW5kVHlwZShqYXZhUHJvamVjdCwgbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSk7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsIHx8ICF0eXBlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuSkFWQTJXU19TRVJWSUNFX0lNUExfTk9UX0ZPVU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge21vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCksIG1vZGVsLmdldFByb2plY3ROYW1lKCl9KSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUuaXNCaW5hcnkoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLkpBVkEyV1NfU0VSVklDRV9JTVBMX05PVF9CSU5BUlkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0NDRmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXMuSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlcy5XZWJDb250ZW50Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNvbW1hbmRMaW5lVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuTGF1bmNoVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLlNwcmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZTsKLQotLyoqCi0gKiBQcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmN4Zi50b29scy53c2RsdG8uV1NETFRvSmF2YTwvY29kZT4gY29tbWFuZC4KLSAqCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDWEZfVE9PTF9DTEFTU19OQU1FID0gIm9yZy5hcGFjaGUuY3hmLnRvb2xzLndzZGx0by5XU0RMVG9KYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBJV2ViU2VydmljZSB3czsKLQotICAgIHByaXZhdGUgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgd2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotCi0gICAgcHVibGljIFdTREwySmF2YUNvbW1hbmQoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsLCBJV2ViU2VydmljZSB3cykgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMud3MgPSB3czsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihuZXcgUGF0aChtb2RlbC5nZXRKYXZhU291cmNlRm9sZGVyKCkpKTsKLSAgICAgICAgd2ViQ29udGVudENoYW5nZUxpc3RlbmVyID0gbmV3IFdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcihtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLQotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0KLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0UHJvamVjdE5hbWUoKTsKLQotICAgICAgICAvL1RPRE8gcmV2aXNpdAotICAgICAgICB3cy5nZXRXZWJTZXJ2aWNlSW5mbygpLnNldEltcGxVUkxzKG5ldyBTdHJpbmdbXSB7cHJvamVjdE5hbWUgKyAiL0ltcGwuamF2YSJ9KTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIFN0cmluZ1tdIHByb2dBcmdzID0gQ29tbWFuZExpbmVVdGlscy5nZXRXU0RMMkphdmFQcm9ncmFtQXJndW1lbnRzKG1vZGVsKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgTGF1bmNoVXRpbHMubGF1bmNoKGphdmFQcm9qZWN0LCBDWEZfVE9PTF9DTEFTU19OQU1FLCBwcm9nQXJncyk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weVcySkZpbGVzRnJvbVRtcChtb2RlbCk7Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSkgewotICAgICAgICAgICAgICAgIFNwcmluZ1V0aWxzLmNyZWF0ZUNvbmZpZ3VyYXRpb25Gcm9tV1NETChtb2RlbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBpb2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICBGaWxlVXRpbHMucmVmcmVzaFByb2plY3QocHJvamVjdE5hbWUsIG1vbml0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBMaXN0PElSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigpOwotICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLSAgICAgICAgaWYgKGNoYW5nZWRSZXNvdXJjZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZGVsZXRlKHRydWUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ1hGRGF0YU1vZGVsIGdldENYRkRhdGFNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIC8vQU5UIEVudmlyb25tZW50IE1hcHBpbmdzCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YVNvdXJjZUZvbGRlcihTdHJpbmcgamF2YVNvdXJjZUZvbGRlcikgewotICAgICAgICBtb2RlbC5zZXRKYXZhU291cmNlRm9sZGVyKGphdmFTb3VyY2VGb2xkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSkgewotICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVTZXJ2ZXIoYm9vbGVhbiBnZW5lcmF0ZVNlcnZlcikgewotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVNlcnZlcihnZW5lcmF0ZVNlcnZlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihib29sZWFuIGdlbmVyYXRlSW1wbGVtZW50YXRpb24pIHsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihnZW5lcmF0ZUltcGxlbWVudGF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VEZWZhdWx0VmFsdWVzKGJvb2xlYW4gdXNlRGVmYXVsdFZhbHVlcykgewotICAgICAgICBtb2RlbC5zZXRVc2VEZWZhdWx0VmFsdWVzKHVzZURlZmF1bHRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NTT0FQSGVhZGVycyhib29sZWFuIHByb2Nlc3NTT0FQSGVhZGVycykgewotICAgICAgICBtb2RlbC5zZXRQcm9jZXNzU09BUEhlYWRlcnMocHJvY2Vzc1NPQVBIZWFkZXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhib29sZWFuIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKSB7Ci0gICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhib29sZWFuIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKSB7Ci0gICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvTmFtZVJlc29sdXRpb24oYm9vbGVhbiBhdXRvTmFtZVJlc29sdXRpb24pIHsKLSAgICAgICAgbW9kZWwuc2V0QXV0b05hbWVSZXNvbHV0aW9uKGF1dG9OYW1lUmVzb2x1dGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIHhqY1VzZURlZmF1bHRWYWx1ZXMpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyh4amNVc2VEZWZhdWx0VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZyhib29sZWFuIHhqY1RvU3RyaW5nKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nU2ltcGxlKHhqY1RvU3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZ1NpbXBsZShib29sZWFuIHhqY1RvU3RyaW5nU2ltcGxlKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nU2ltcGxlKHhqY1RvU3RyaW5nU2ltcGxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZ011bHRpTGluZShib29sZWFuIHhqY1RvU3RyaW5nTXVsdGlMaW5lKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKHhqY1RvU3RyaW5nTXVsdGlMaW5lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNMb2NhdG9yKGJvb2xlYW4geGpjTG9jYXRvcikgewotICAgICAgICBtb2RlbC5zZXRYamNMb2NhdG9yKHhqY0xvY2F0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1N5bmNNZXRob2RzKGJvb2xlYW4geGpjU3luY01ldGhvZHMpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjU3luY01ldGhvZHMoeGpjU3luY01ldGhvZHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY01hcmtHZW5lcmF0ZWQoYm9vbGVhbiB4amNNYXJrR2VuZXJhdGVkKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY01hcmtHZW5lcmF0ZWQoeGpjTWFya0dlbmVyYXRlZCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZWROYW1lc3BhY2VzKE1hcCB2YWx1ZSkgewotICAgICAgICBtb2RlbC5zZXRJbmNsdWRlZE5hbWVzcGFjZXModmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdGaWxlcyhMaXN0PFN0cmluZz4gYmluZGluZ0ZpbGVzKSB7Ci0gICAgICAgIGZvciAoU3RyaW5nIHBhdGggOiBiaW5kaW5nRmlsZXMpIHsKLSAgICAgICAgICAgIG1vZGVsLmdldEJpbmRpbmdGaWxlcygpLmFkZChwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YURlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YURlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzExOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQnVnICMyNzE1NjIgLSBzdWRoYW5AcHJvZ3Jlc3MuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5XU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXMuV2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudXRpbC5XU0RMQ29waWVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YURlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGlucHV0VVJMOwotCi0gICAgcHJpdmF0ZSBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgd2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotCi0gICAgcHVibGljIFdTREwySmF2YURlZmF1bHRpbmdDb21tYW5kKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgaW5wdXRVUkwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0gICAgICAgIHRoaXMuaW5wdXRVUkwgPSBpbnB1dFVSTDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAiZGVwcmVjYXRpb24iIH0pCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgICAgICB3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyKHByb2plY3ROYW1lKTsKLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIod2ViQ29udGVudENoYW5nZUxpc3RlbmVyLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQotICAgICAgICBXU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V1NETDJKYXZhQ29udGV4dCgpOwotICAgICAgICBtb2RlbC5zZXREZWZhdWx0UnVudGltZVZlcnNpb24oY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSk7Ci0gICAgICAgIG1vZGVsLnNldERlZmF1bHRSdW50aW1lVHlwZShjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpKTsKLSAgICAgICAgLy8KLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihjb250ZXh0LmlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpKTsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXIoY29udGV4dC5pc0dlbmVyYXRlU2VydmVyKCkpOwotICAgICAgICBtb2RlbC5zZXREYXRhYmluZGluZyhjb250ZXh0LmdldERhdGFiaW5kaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRGcm9udGVuZChjb250ZXh0LmdldEZyb250ZW5kKCkpOwotICAgICAgICBtb2RlbC5zZXRXc2RsVmVyc2lvbihjb250ZXh0LmdldFdzZGxWZXJzaW9uKCkpOwotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZUFudEJ1aWxkRmlsZShjb250ZXh0LmlzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKSk7Ci0gICAgICAgIG1vZGVsLnNldEluY2x1ZGVkTmFtZXNwYWNlcyhuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0gICAgICAgIG1vZGVsLnNldEV4Y2x1ZGVkTmFtZXNwYWNlcyhuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0KLSAgICAgICAgLy8gWEpDCi0gICAgICAgIG1vZGVsLnNldFhqY1VzZURlZmF1bHRWYWx1ZXMoY29udGV4dC5pc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nKGNvbnRleHQuaXNYamNUb1N0cmluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoY29udGV4dC5pc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ1NpbXBsZShjb250ZXh0LmlzWGpjVG9TdHJpbmdTaW1wbGUoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY0xvY2F0b3IoY29udGV4dC5pc1hqY0xvY2F0b3IoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1N5bmNNZXRob2RzKGNvbnRleHQuaXNYamNTeW5jTWV0aG9kcygpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjTWFya0dlbmVyYXRlZChjb250ZXh0LmlzWGpjTWFya0dlbmVyYXRlZCgpKTsKLQotICAgICAgICBtb2RlbC5zZXRWYWxpZGF0ZShjb250ZXh0LmlzVmFsaWRhdGUoKSk7Ci0gICAgICAgIG1vZGVsLnNldFByb2Nlc3NTT0FQSGVhZGVycyhjb250ZXh0LmlzUHJvY2Vzc1NPQVBIZWFkZXJzKCkpOwotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhjb250ZXh0LmlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKGNvbnRleHQuaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0VXNlRGVmYXVsdFZhbHVlcyhjb250ZXh0LmlzVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgbW9kZWwuc2V0QXV0b05hbWVSZXNvbHV0aW9uKGNvbnRleHQuaXNBdXRvTmFtZVJlc29sdXRpb24oKSk7Ci0gICAgICAgIG1vZGVsLnNldE5vQWRkcmVzc0JpbmRpbmcoY29udGV4dC5pc05vQWRkcmVzc0JpbmRpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dChjb250ZXh0LmlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkpOwotICAgICAgICBtb2RlbC5zZXRKYXZhU291cmNlRm9sZGVyKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKS50b09TU3RyaW5nKCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotICAgICAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gbmV3IFVSTChpbnB1dFVSTCk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRXc2RsVVJMKHdzZGxVcmwpOwotICAgICAgICAgICAgaWYgKHdzZGxVcmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaWYgKCFGaWxlVXRpbHMuaXNGaWxlSW5XZWJDb250ZW50Rm9sZGVyKHByb2plY3QsIG5ldyBQYXRoKHdzZGxVcmwuZ2V0UGF0aCgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZvbGRlciB3c2RsRm9sZGVyID0gV1NETFV0aWxzLmdldFdTRExGb2xkZXIocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIElQYXRoIHdzZGxGb2xkZXJQYXRoID0gd3NkbEZvbGRlci5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGVUb0NvcHkgPSBuZXcgRmlsZSh3c2RsVXJsLnRvVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICBXU0RMQ29waWVyIGNvcGllciA9IG5ldyBXU0RMQ29waWVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vZm9yIEVjbGlwc2UgMy4zIGNvbXBhdGliaWxpdHkKLSAgICAgICAgICAgICAgICAgICAgY29waWVyLnNldFNvdXJjZVVSSSh3c2RsVXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgICAgICAgICAgICAgICBjb3BpZXIuc2V0VGFyZ2V0Rm9sZGVyVVJJKHdzZGxGb2xkZXIuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgLy9jb3BpZXIuc2V0VGFyZ2V0Rm9sZGVyVVJJKHdzZGxGb2xkZXJQYXRoLnRvRmlsZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB3b3Jrc3BhY2UucnVuKGNvcGllciwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxGb2xkZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICBGaWxlIHdzZGxGaWxlID0gd3NkbEZvbGRlclBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQoZmlsZVRvQ29weS5nZXROYW1lKCkpLnRvRmlsZSgpOwotICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRXc2RsVVJMKHdzZGxGaWxlLnRvVVJMKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uID0gV1NETFV0aWxzLnJlYWRXU0RMKG1vZGVsLmdldFdzZGxVUkwoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXRUTlNPbk1vZGVsKGRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgICAgICBzZXRXU0RMTG9jYXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGRlZmluaXRpb24gPSBXU0RMVXRpbHMucmVhZFdTREwod3NkbFVybCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBNYXAgc2VydmljZXNNYXAgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgIFNldDxNYXAuRW50cnk+IHNlcnZpY2VzU2V0ID0gc2VydmljZXNNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0VE5TT25Nb2RlbChkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0V1NETExvY2F0aW9uKGRlZmluaXRpb24pOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHNlcnZpY2VFbnRyeSA6IHNlcnZpY2VzU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgc2VydmljZUVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgcG9ydHNNYXAgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBwb3J0c1NldCA9IHBvcnRzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeSBwb3J0RW50cnkgOiBwb3J0c1NldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBwb3J0RW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IHBvcnQuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBwb3J0VHlwZS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gcU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBXU0RMVXRpbHMuV1NETF9GSUxFX0VYVEVOU0lPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJUGF0aCB3c2RsRm9sZGVyUGF0aCA9IFdTRExVdGlscy5nZXRXU0RMRm9sZGVyKHByb2plY3QpLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgV1NETENvcGllciBjb3BpZXIgPSBuZXcgV1NETENvcGllcigpOwotICAgICAgICAgICAgICAgIGNvcGllci5zZXRTb3VyY2VVUkkod3NkbFVybC50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgICAgICAgICBjb3BpZXIuc2V0VGFyZ2V0Rm9sZGVyVVJJKHdzZGxGb2xkZXJQYXRoLnRvRmlsZSgpLnRvVVJJKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgY29waWVyLnNldFRhcmdldEZpbGVuYW1lKGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICB3b3Jrc3BhY2UucnVuKGNvcGllciwgbW9uaXRvcik7Ci0KLSAgICAgICAgICAgICAgICBGaWxlIHdzZGxGaWxlID0gd3NkbEZvbGRlclBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQoZmlsZW5hbWUpLnRvRmlsZSgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldFdzZGxVUkwod3NkbEZpbGUudG9VUkkoKS50b1VSTCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1vZGVsLnNldFdzZGxGaWxlTmFtZShnZXRXU0RMRmlsZU5hbWVGcm9tVVJMKG1vZGVsLmdldFdzZGxVUkwoKSkpOwotCi0gICAgICAgICAgICBJUGF0aCB3c2RsTG9jYXRpb25QYXRoID0gbmV3IFBhdGgobW9kZWwuZ2V0V3NkbFVSTCgpLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB3c2RsTG9jYXRpb25QYXRoID0gd3NkbExvY2F0aW9uUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKFdTRExVdGlscy5nZXRXZWJDb250ZW50Rm9sZGVyKHByb2plY3QpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhdGlvbigpLm1hdGNoaW5nRmlyc3RTZWdtZW50cyh3c2RsTG9jYXRpb25QYXRoKSk7Ci0KLSAgICAgICAgICAgIGlmICh3c2RsTG9jYXRpb25QYXRoLmdldERldmljZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb25QYXRoID0gd3NkbExvY2F0aW9uUGF0aC5zZXREZXZpY2UobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtb2RlbC5zZXRXc2RsRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgICAgIG1vZGVsLnNldENvbmZpZ1dzZGxMb2NhdGlvbih3c2RsTG9jYXRpb25QYXRoLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gdXJpc2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIHVyaXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbXVybGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2cobXVybGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGlvZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICB9Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMRmlsZU5hbWVGcm9tVVJMKFVSTCB3c2RsVVJMKSB7Ci0gICAgICAgIElQYXRoIHdzZGxQYXRoID0gbmV3IFBhdGgod3NkbFVSTC50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgcmV0dXJuIHdzZGxQYXRoLmxhc3RTZWdtZW50KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFdTRExMb2NhdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gV1NETFV0aWxzLmdldFdTRExMb2NhdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgaWYgKHdzZGxMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtb2RlbC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRUTlNPbk1vZGVsKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gV1NETFV0aWxzLmdldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICBtb2RlbC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkucHV0KHRhcmdldE5hbWVzcGFjZSwgcGFja2FnZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBXU0RMMkphdmFEYXRhTW9kZWwgZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgTGlzdDxJUmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLSAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwod2ViQ29udGVudENoYW5nZUxpc3RlbmVyLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0gICAgICAgIGlmIChjaGFuZ2VkUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbW9kZWwuZ2V0QmluZGluZ0ZpbGVzKCkuY2xlYXIoKTsKLSAgICAgICAgbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuY2xlYXIoKTsKLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhMGM0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgc3RvcCBnYXAgd29ya2Fyb3VuZCBmb3IgYnVncyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQzMjg2Ij4jMjQzMjg2PC9hPgotICogYW5kIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDMyOTAiPiMyNDMyOTA8L2E+Ci0gKgotICoKLSAqLwotcHVibGljIGNsYXNzIFdTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgSVByb2plY3QgaW5pdGlhbFByb2plY3Q7Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0OwotICAgIHByaXZhdGUgSVByb2plY3QgY3VycmVudFByb2plY3Q7Ci0KLSAgICBwdWJsaWMgV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgICAgIGlmIChjdXJyZW50UHJvamVjdCA9PSBudWxsICYmIGluaXRpYWxQcm9qZWN0ID09IG51bGwgJiYgc2VydmVyUHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgbW9kZWwuc2V0UHJvamVjdE5hbWUoc2VydmVyUHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJyZW50UHJvamVjdCA9PSBudWxsICYmIGluaXRpYWxQcm9qZWN0ICE9IG51bGwgJiYgIWluaXRpYWxQcm9qZWN0LmVxdWFscyhzZXJ2ZXJQcm9qZWN0KSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5XU0RMMkpBVkFfUFJPSkVDVF9TRUxFQ1RJT05fRVJST1IsIG5ldyBPYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJQcm9qZWN0LmdldE5hbWUoKSwgaW5pdGlhbFByb2plY3QuZ2V0TmFtZSgpfSkpOwotICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWxQcm9qZWN0ID09IG51bGwgJiYgY3VycmVudFByb2plY3QgIT0gbnVsbCAmJiAhY3VycmVudFByb2plY3QuZXF1YWxzKHNlcnZlclByb2plY3QpKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLldTREwySkFWQV9QUk9KRUNUX1NFTEVDVElPTl9FUlJPUiwgbmV3IE9iamVjdFtdewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclByb2plY3QuZ2V0TmFtZSgpLCBjdXJyZW50UHJvamVjdC5nZXROYW1lKCl9KSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbFByb2plY3QgIT0gbnVsbCAmJiBjdXJyZW50UHJvamVjdCAhPSBudWxsICYmICFjdXJyZW50UHJvamVjdC5lcXVhbHMoc2VydmVyUHJvamVjdCkpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuV1NETDJKQVZBX1BST0pFQ1RfU0VMRUNUSU9OX0VSUk9SLCBuZXcgT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUHJvamVjdC5nZXROYW1lKCksIGN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKX0pKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzZXJ2ZXJQcm9qZWN0ICE9IG51bGwgJiYgc2VydmVyUHJvamVjdC5nZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldFByb2plY3ROYW1lKHNlcnZlclByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3RhdHVzLmlzT0soKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRFbnZpcm9ubWVudCgpLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFN0YXR1c0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhlIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4gTWFrZSBzdXJlIHRoZSAiU2VydmljZSBQcm9qZWN0IgotICAgICAqIGFuZCB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSB3c2RsIGZpbGUgbWF0Y2guCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdChJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0KSB7Ci0gICAgICAgIHRoaXMuc2VydmVyUHJvamVjdCA9IHNlcnZlclByb2plY3Q7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKgotICAgICAqIFRoZSBpbml0aWFsIHByb2plY3Qgd2lsbCBiZSBudWxsIHdoZW4gdGhlcmUncyBub3RoaW5nIHNlbGVjdGVkIGluIHRoZSBwcm9qZWN0IGV4cGxvcmVyCi0gICAgICogVGhpcyBmb3JjZXMgdGhlIHVzZXIgdG8gbWFrZSBhIHNlbGVjdGlvbiB0aHVzIHNldHRpbmcgdGhlIGN1cnJlbnQgcHJvamVjdAotICAgICAqIGJlbG93LgotICAgICAqCi0gICAgICogSWYgdGhlcmUgd2FzIGFuIGluaXRpYWwgc2VsZWN0aW9uIGFuZCB0aGUgdXNlciBjaGFuZ2VzIGZyb20gb25lIHRvcCBkb3duIHNlcnZpY2UKLSAgICAgKiB0eXBlIHRvIGFub3RoZXIgdGhlbiB3ZSBoYWQgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0aGlzLmluaXRpYWxQcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHRoZXJlIHdhcyBhbiBpbml0aWFsIHNlbGVjdGlvbiBpbiB0aGUgcHJvamVjdCBleHBsb3JlciB0aGUgYWJvdmUgdmFsdWUgaXMgc2V0IGFuZAotICAgICAqIHRoaXMgaXMgc2V0IHRvIG51bGwuCi0gICAgICoKLSAgICAgKiBUaGlzIHdpbGwgY2hhbmdlIGhvd2V2ZXIgaWYgdGhlIHVzZXIgbW9kaWZpZXMgdGhlIHRleHQgZmllbGQgb3IgYnJvd3NlcyBmb3IgYQotICAgICAqIHdzZGwgZmlsZS4gVXBvbiBzZWxlY3RpbmcgYSBmaWxlIGluIGEgdmFsaWQgbG9jYXRpb24sIHRoaXMgdmFsdWUgZ2V0cyBzZXQuCi0gICAgICogTm8gcHJvYmxlbSBpbiB0aGF0IHNpdHVhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50UHJvamVjdCA9IHByb2plY3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMwY2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyNTNlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2FkZDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgTm92IDA3IDIzOjU4OjU1IEVTVCAyMDA4Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjM2QzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53c3J0O3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA1LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDQsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBqYXZheC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS42LjIsMS43LjApIiwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW07YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBqYXZheC5qd3M7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwyLjEuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZjI5NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L2Rpc2FibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi9kaXNhYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDJlNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi9mYWxzZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvZmFsc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQ5YjBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi9mYWxzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvdHJ1ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvdHJ1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWNiOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L3RydWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGYxYjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgQ3JlYXRpb24gVUkKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUNYRl9XU19SVU5USU1FX0xBQkVMPUFwYWNoZSBDWEYgMi54ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3ZTY3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5ydW50aW1lcyI+Ci0gICAgICA8cnVudGltZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jeGZXZWJTZXJ2aWNlUlQiCi0gICAgICAgIGxhYmVsPSIlQ1hGX1dTX1JVTlRJTUVfTEFCRUwiCi0gICAgICAgIHNlcnZlclJlcXVpcmVkPSJmYWxzZSIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLSBkZWZpbmUgc3VwcG9ydCBmb3IgQ1hGIEpBWC1XUyBKYXZhIEZpcnN0IGFuZCBXU0RMIEZpcnN0IGluIHdlYiBwcm9qZWN0cyAtLT4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuc2VydmljZVJ1bnRpbWVzIj4KLSAgICAgIDxzZXJ2aWNlUnVudGltZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5qYXZhIiAKLSAgICAgICAgc2VydmljZUltcGxlbWVudGF0aW9uVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Qud3Mud3NJbXBsLmphdmEiCi0gICAgICAgIHJ1bnRpbWVJZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jeGZXZWJTZXJ2aWNlUlQiCi0gICAgICAgIGJvdHRvbVVwPSJ0cnVlIgotICAgICAgICB0b3BEb3duPSJ0cnVlIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53c3J0LkNYRldlYlNlcnZpY2VSdW50aW1lIj4KLQotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iMi40IiBhbGxvdy1uZXdlcj0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmphdmEiIHZlcnNpb249IjUuMCIgYWxsb3ctbmV3ZXI9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImN4Zi5jb3JlIiB2ZXJzaW9uPSIxLjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICA8L3NlcnZpY2VSdW50aW1lPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gICAgPCEtLSBkZWZpbmUgc3VwcG9ydCBmb3IgQ1hGIEphdmEgY2xpZW50cyBpbiBXZWIgcHJvamVjdHMgLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFJ1bnRpbWVzIj4KLSAgICAgICA8Y2xpZW50UnVudGltZQotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLndlYiIKLSAgICAgICAgICBjbGllbnRJbXBsZW1lbnRhdGlvblR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LndzLmNsaWVudC50eXBlLmphdmEiCi0gICAgICAgICAgcnVudGltZUlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmN4ZldlYlNlcnZpY2VSVCIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53c3J0LkNYRldlYlNlcnZpY2VSdW50aW1lIj4KLQotICAgICAgICAgIDxyZXF1aXJlZC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjQiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSI1LjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImN4Zi5jb3JlIiB2ZXJzaW9uPSIxLjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgPC9jbGllbnRSdW50aW1lPgotICAgIDwvZXh0ZW5zaW9uPiAKLSAgICAKLSAgICA8IS0tIGJ1Z3MgIzI0MzI4NiAjMjQzMjkwIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzLldTREwySmF2YVByb2plY3RTZWxlY3Rpb25XaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgIGlkPSJQcm9qZWN0U2VsZWN0aW9uQ29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kIi8+Ci0gICAgPC9leHRlbnNpb24+IAotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICAgaWQ9IkphdmEyV1NQcmVDaGVja0NvbmZpZyIKLSAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTU2VsZWN0U0VJQ29tbWFuZCI+Ci0gICAgICAgPC93aWRnZXRGYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuSkFYV1NBbm5vdGF0ZVdpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICAgaWQ9IkpBWFdTQW5ub3RhdGVDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kIj4KLSAgICAgICA8L3dpZGdldEZhY3Rvcnk+Ci0gICAgPC9leHRlbnNpb24+Ci0gCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuSmF2YTJXU0NvbmZpZ1dpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICAgaWQ9IkphdmEyV1NDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiPgotICAgICAgIDwvd2lkZ2V0RmFjdG9yeT4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgIDx3aWRnZXRGYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0cy5XU0RMMkphdmFDb25maWdXaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgIGlkPSJXU0RMMkphdmFDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCI+Ci0gICAgICAgPC93aWRnZXRGYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgIDwhLS0gSkFWQTJXUyAtLT4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYW50RGF0YU1hcHBpbmciPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlbkNsaWVudCIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iR2VuZXJhdGVDbGllbnQiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5TZXJ2ZXIiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlU2VydmVyIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuV3JhcHBlckZhdWx0QmVhbnMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5XU0RMIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJHZW5lcmF0ZVdTREwiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJXc2RsRmlsZU5hbWUiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IldzZGxGaWxlTmFtZSIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlblhTREltcG9ydHMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlWFNESW1wb3J0cyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IlVzZVNPQVAxMkJpbmRpbmciCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlVzZVNPQVAxMkJpbmRpbmciCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICA8L2V4dGVuc2lvbj4KLQotICAgIDwhLS0gV1NETDJKYXZhIC0tPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5hbnREYXRhTWFwcGluZyI+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iTWFwcGluZ3MiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iSW5jbHVkZWROYW1lc3BhY2VzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmVudi5hbnQuTWFwcGluZ3NUcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkJpbmRpbmdzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkJpbmRpbmdGaWxlcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5lbnYuYW50LkJpbmRpbmdzVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJKYXZhT3V0cHV0IgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkphdmFTb3VyY2VGb2xkZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJTZXJ2aWNlTmFtZSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJTZXJ2aWNlTmFtZSIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlblNlcnZlciIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJHZW5lcmF0ZVNlcnZlciIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlbkltcGwiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iR2VuZXJhdGVJbXBsZW1lbnRhdGlvbiIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkRlZmF1bHRWYWx1ZXMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iVXNlRGVmYXVsdFZhbHVlcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkV4dFNPQVBIZWFkZXJzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlByb2Nlc3NTT0FQSGVhZGVycyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkRlZmF1bHROYW1lc3BhY2UiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmciCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJEZWZhdWx0RXhjbHVkZXNOYW1lc3BhY2UiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmciCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJBdXRvTmFtZVJlc29sdXRpb24iCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iQXV0b05hbWVSZXNvbHV0aW9uIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX2R2IgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY1VzZURlZmF1bHRWYWx1ZXMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfdHMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjVG9TdHJpbmciCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfdHNfbXVsdGkiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjVG9TdHJpbmdNdWx0aUxpbmUiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfdHNfc2ltcGxlIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY1RvU3RyaW5nU2ltcGxlIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX2xvY2F0b3IiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjTG9jYXRvciIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY19zeW5jX21ldGhvZHMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjU3luY01ldGhvZHMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfbWFya19nZW5lcmF0ZWQiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjTWFya0dlbmVyYXRlZCIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDNhNDQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSW1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRU5URVJfU0VJX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX0VYVFJBQ1RFRF9NRVRIT0RTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9NRVNTQUdFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9PUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX0RJQUxPR19USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfRElBTE9HX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9XRUJTRVJWSUNFX05BTUVfQVRUUklCVVRFX1BSRVNFTlQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTF9ESUFMT0dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTF9ESUFMT0dfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19FTlRFUl9WQUxJRF9XU0RMX05BTUU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0NMQVNTX0NPTkZJR19QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfQ0xBU1NfQ09ORklHX1BBR0VfREVTQ1JJUFRJT047Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0lOVEVSRkFDRV9DT05GSUdfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0lOVEVSRkFDRV9DT05GSUdfUEFHRV9ERVNDUklQVElPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0pBWFdTX0FOTk9UQVRFX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX0RFU0NSSVBUSU9OOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1BBR0VfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQU5OT1RBVEVfSkpBVkFfV0lER0VUX1BSRVZJRVc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQU5OT1RBVEVfSkpBVkFfV0lER0VUX1NFTEVDVF9NRVRIT0RfVE9fQU5OT1RBVEU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFHRV9ERVNDUklQVElPTjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUU19QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HUk9VUF9MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9MQUJFTDsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9GT1VORDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0lNUExFTUVOVEFUSU9OX05PVF9GT1VORDsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDWEZDcmVhdGlvblVJTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNmZTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRkNyZWF0aW9uVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ1hGQ3JlYXRpb25VSVBsdWdpbiBwbHVnaW47Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGQ3JlYXRpb25VSVBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZDcmVhdGlvblVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4gcGx1Zy1pbgotICAgICAqIHJlbGF0aXZlIHBhdGgKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aAotICAgICAqICAgICAgICAgICAgdGhlIHBhdGgKLSAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgZXhjZXB0aW9uLnRvU3RyaW5nKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlNDJkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSW1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI0phdmEyV1MgUHJlIENvbmZpZyBXaWRnZXQgRmFjdG9yeQotSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIEphdmEgQ2xhc3MgU3RhcnRpbmcgUG9pbnQgQ29uZmlndXJhdGlvbgotSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9ERVNDUklQVElPTj1TZWxlY3QgYW4gZXhpc3RpbmcgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgKFNFSSkgb3IgY3JlYXRlIGFuIFNFSSBieSBleHRyYWN0aW5nIGFuIGludGVyZmFjZSBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQotSkFWQTJXU19JTlRFUkZBQ0VfQ09ORklHX1BBR0VfVElUTEU9ezB9IHsxfSBXZWIgU2VydmljZSBKYXZhIEludGVyZmFjZSBTdGFydGluZyBQb2ludCBDb25maWd1cmF0aW9uCi1KQVhXU19BTk5PVEFURV9KSkFWQV9XSURHRVRfUFJFVklFVz1QcmV2aWV3OgotSkFWQTJXU19JTlRFUkZBQ0VfQ09ORklHX1BBR0VfREVTQ1JJUFRJT049U2VsZWN0IGFuIGltcGxlbWVudGF0aW9uIHRoYXQgaW1wbGVtZW50cyBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIFNFSS4KLQotI0phdmEyV1MgQ29uZmlnIFdpZGdldCBGYWN0b3J5Ci1KQVZBMldTX0pBWFdTX0FOTk9UQVRFX1BBR0VfVElUTEU9ezB9IHsxfSBXZWIgU2VydmljZSBKQVgtV1MgQW5ub3RhdGlvbnMgQ29uZmlndXJhdGlvbgotSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX0RFU0NSSVBUSU9OPU9wdGlvbmFsbHksIHNlbGVjdCB0aGUgSkFYLVdTIEFubm90YXRpb25zIHRvIGFkZC4KLQotSkFWQTJXU19QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgSmF2YTJXUyBDb25maWd1cmF0aW9uCi1KQVZBMldTX1BBR0VfREVTQ1JJUFRJT049Q29uZmlndXJlIHRoZSB7MH0gSmF2YSB0byBXUyBvcHRpb25zLgotCi0jV1NETDJKYXZhIENvbmZpZyBXaWRnZXQgRmFjdG9yeQotV1NETDJKQVZBX1BBR0VfVElUTEU9ezB9IHsxfSBXZWIgU2VydmljZSBXU0RMMkphdmEgQ29uZmlndXJhdGlvbgotV1NETDJKQVZBX1BBR0VfREVTQ1JJUFRJT049Q29uZmlndXJlIHRoZSB7MH0gV1NETCB0byBKYXZhIG9wdGlvbnMuCi0KLVdTREwySkFWQV9ERUZBVUxUU19QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgV1NETDJKYXZhIENvbmZpZ3VyYXRpb24KLVdTREwySkFWQV9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OPVRoZSBwYWdlIGFsbG93cyB0aGUgb3ZlcnJpZGluZyBvZiB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgdGhpcyBXZWIgU2VydmljZSBnZW5lcmF0aW9uLgotCi0jSmF2YTJXUyBDb25maWcgV2lkZ2V0Ci1KQVZBMldTX0dST1VQX0xBQkVMPUphdmEyV1MgR2VuZXJhdGlvbiBPcHRpb25zOgotCi1KQVZBMldTX0VOVEVSX1NFSV9OQU1FPVBsZWFzZSBlbnRlciB0aGUgbmFtZSBvZiB0aGUgU0VJIHRvIGV4dHJhY3QKLUpBVkEyV1NfU0VMRUNUX1NFSV9FWFRSQUNURURfTUVUSE9EUz1QbGVhc2Ugc2VsZWN0IHRoZSBtZXRob2RzIHlvdSB3aXNoIHRvIGV4dHJhY3QgZnJvbSB0aGUgezB9IGNsYXNzCi1KQVZBMldTX1NFTEVDVF9TRUlfTUVTU0FHRT1QbGVhc2Ugc2VsZWN0IGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLUpBVkEyV1NfU0VMRUNUX1NFSV9PUFRJT049UGxlYXNlIHNlbGVjdCBhbiBTRUkgb3B0aW9uCi1KQVZBMldTX1NFTEVDVF9TRUlfRElBTE9HX1RJVExFPVNlbGVjdCBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotSkFWQTJXU19TRUxFQ1RfU0VJX0RJQUxPR19ERVNDUklQVElPTj1TZWxlY3QgdGhlIEludGVyZmFjZSB0byB1c2UgYXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi1KQVZBMldTX1NFTEVDVF9TRUlfV0VCU0VSVklDRV9OQU1FX0FUVFJJQlVURV9QUkVTRU5UPUltcGxlbWVudGF0aW9uIGNsYXNzIGNvbnRhaW5zIGFuIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gd2l0aCBhIG5hbWUgYXR0cmlidXRlIHdoaWNoIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZQotSkFWQTJXU19TRUxFQ1RfSU1QTF9ESUFMT0dfVElUTEU9U2VsZWN0IGFuIEltcGxlbWVudGF0aW9uCi1KQVZBMldTX1NFTEVDVF9JTVBMX0RJQUxPR19ERVNDUklQVElPTj1TZWxlY3QgdGhlIEltcGxlbWVudGF0aW9uIHRvIHVzZSBmb3IgdGhlIFdlYiBTZXJ2aWNlCi0KLUpBVkEyV1NfRU5URVJfVkFMSURfV1NETF9OQU1FPVBsZWFzZSBlbnRlciBhIHZhbGlkIFdTREwgRmlsZSBuYW1lCi0KLSNXU0RMMkphdmEgRGVmYXVsdHMgQ29uZmlnIFdpZGdldAotV1NETDJKQVZBX0dST1VQX0xBQkVMPVdTREwySmF2YSBHZW5lcmF0aW9uIE9wdGlvbnMKLVdTREwySkFWQV9YSkNfQVJHX0dST1VQX0xBQkVMPVhKQyBBcmd1bWVudHMKLUpBWFdTX0FOTk9UQVRFX0pKQVZBX1dJREdFVF9TRUxFQ1RfTUVUSE9EX1RPX0FOTk9UQVRFPVNlbGVjdCB0aGUgTWV0aG9kcyB0byBhbm5vdGF0ZToKLQotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5UPUltcGxlbWVudGF0aW9uIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBTRUkgbWV0aG9kICcnezB9JycKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfRk9VTkQ9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgY2Fubm90IGJlIGZvdW5kCi1XRUJTRVJWSUNFX0lNUExFTUVOVEFUSU9OX05PVF9GT1VORD1UaGUgSW1wbGVtZW50YXRpb24gJyd7MH0nJyBjYW5ub3QgYmUgZm91bmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9zZWxlY3Rpb24vSVN0cnVjdHVyZWRTZWxlY3Rpb25Ub0lQcm9qZWN0VHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9zZWxlY3Rpb24vSVN0cnVjdHVyZWRTZWxlY3Rpb25Ub0lQcm9qZWN0VHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1NDY2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvc2VsZWN0aW9uL0lTdHJ1Y3R1cmVkU2VsZWN0aW9uVG9JUHJvamVjdFRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSVN0cnVjdHVyZWRTZWxlY3Rpb25Ub0lQcm9qZWN0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciB7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmFsdWU7Ci0gICAgICAgIE9iamVjdCBmaXJzdEVsZW1lbnQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBmaXJzdEVsZW1lbnQ7Ci0gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3ZpZXdlcnMvQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS92aWV3ZXJzL0Fubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNTdmYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3ZpZXdlcnMvQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQ29sdW1uTGFiZWxQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBJbWFnZSBhZGRBbm5vdGF0aW9uSW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZSByZW1vdmVBbm5vdGF0aW9uSW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZSBkaXNhYmxlZDsKLQotICAgIHByaXZhdGUgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBtZXRob2RNYXA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbktleTsKLSAgICBwcml2YXRlIElUeXBlIHR5cGU7Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIGFubm90YXRpb25LZXksIElUeXBlIHR5cGUpIHsKLSAgICAgICAgdGhpcy5tZXRob2RNYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKTsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uS2V5ID0gYW5ub3RhdGlvbktleTsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgYWRkQW5ub3RhdGlvbkltYWdlID0gQ1hGQ3JlYXRpb25VSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICJpY29ucy9vYmoxNi90cnVlLmdpZiIpLmNyZWF0ZUltYWdlKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVtb3ZlQW5ub3RhdGlvbkltYWdlID0gQ1hGQ3JlYXRpb25VSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICJpY29ucy9vYmoxNi9mYWxzZS5naWYiKS5jcmVhdGVJbWFnZSgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRpc2FibGVkID0gQ1hGQ3JlYXRpb25VSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICJpY29ucy9vYmoxNi9kaXNhYmxlZC5naWYiKS5jcmVhdGVJbWFnZSgpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNvdXJjZU1ldGhvZCkgewotICAgICAgICAgICAgaWYgKG1ldGhvZE1hcCA9PSBudWxsIHx8IGFubm90YXRpb25LZXkgPT0gbnVsbCB8fCB0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoU291cmNlTWV0aG9kKSBlbGVtZW50OwotCi0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbktleS5lcXVhbHMoQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0pKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gQW5ub3RhdGlvblV0aWxzLmdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgCUlMb2NhbFZhcmlhYmxlIHZhcmlhYmxlID0gKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQodmFyaWFibGUsIGFubm90YXRpb25LZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIGFubm90YXRpb25LZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRpc2FibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobWV0aG9kTWFwLmdldChtZXRob2QpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBCb29sZWFuIGFkZEFubm90YXRpb24gPSAgbWV0aG9kTWFwLmdldChtZXRob2QpLmdldChhbm5vdGF0aW9uS2V5KTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkQW5ub3RhdGlvbkltYWdlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZW1vdmVBbm5vdGF0aW9uSW1hZ2U7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIGFkZEFubm90YXRpb25JbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIHJlbW92ZUFubm90YXRpb25JbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIGRpc2FibGVkLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0pBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlSmF2YVdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmM5ZjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0pBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5KYXZhU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LlNpbXBsZUphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuSUNvbG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5JSmF2YVBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuSmF2YVRleHRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXJDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLnZpZXdlcnMuQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSkFYV1NBbm5vdGF0ZUphdmFXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgIHByaXZhdGUgSVR5cGUgdHlwZTsKLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBUcmVlVmlld2VyIGphdmFUcmVlVmlld2VyOwotICAgIHByaXZhdGUgU291cmNlVmlld2VyIGFubm90YXRpb25QcmV2aWV3Vmlld2VyOwotCi0gICAgcHJpdmF0ZSBUcmVlVmlld2VyQ29sdW1uIHdlYk1ldGhvZFZpZXdlckNvbHVtbjsKLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gd2ViUGFyYW1WaWV3ZXJDb2x1bW47Ci0gICAgcHJpdmF0ZSBUcmVlVmlld2VyQ29sdW1uIHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uOwotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW47Ci0KLSAgICBwdWJsaWMgSkFYV1NBbm5vdGF0ZUphdmFXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgICAgICBTYXNoRm9ybSBzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5WRVJUSUNBTCB8IFNXVC5TTU9PVEgpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgc2FzaEZvcm0uc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIHNhc2hGb3JtLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIENvbXBvc2l0ZSBqYXZhVHJlZWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2FzaEZvcm0sIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBqYXZhVHJlZWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgamF2YVRyZWVjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgb3V0bGluZUxhYmVsID0gbmV3IExhYmVsKGphdmFUcmVlY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG91dGxpbmVMYWJlbC5zZXRUZXh0KENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVhXU19BTk5PVEFURV9KSkFWQV9XSURHRVRfU0VMRUNUX01FVEhPRF9UT19BTk5PVEFURSk7Ci0KLSAgICAgICAgVHJlZSBqYXZhVHJlZSA9IG5ldyBUcmVlKGphdmFUcmVlY29tcG9zaXRlLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMCi0gICAgICAgICAgICAgICAgfCBTV1QuSF9TQ1JPTEwpOwotICAgICAgICBqYXZhVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGphdmFUcmVlKTsKLQotICAgICAgICBqYXZhVHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gMTA7Ci0gICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLSAgICAgICAgamF2YVRyZWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVHJlZVZpZXdlckNvbHVtbiBjbGFzc1ZpZXdlckNvbHVtbiA9IG5ldyBUcmVlVmlld2VyQ29sdW1uKGphdmFUcmVlVmlld2VyLCBTV1QuTk9ORSk7Ci0gICAgICAgIFRyZWVDb2x1bW4gY2xhc3NDb2x1bW4gPSBjbGFzc1ZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgY2xhc3NDb2x1bW4uc2V0V2lkdGgoMjAwKTsKLSAgICAgICAgY2xhc3NDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOwotCi0gICAgICAgIGZpbmFsIEphdmFFbGVtZW50TGFiZWxQcm92aWRlciBqYXZhRWxlbWVudExhYmVsUHJvdmlkZXIgPSBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIGNsYXNzVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IENvbHVtbkxhYmVsUHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGphdmFFbGVtZW50TGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGphdmFUcmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcih0cnVlKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSVR5cGUgdHlwZSA6IHR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBJVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt0eXBlfTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJVHlwZSBzb3VyY2VUeXBlID0gKElUeXBlKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJTWV0aG9kPiBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgSU1ldGhvZFtdIG1ldGhvZHMgPSBzb3VyY2VUeXBlLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSkRUVXRpbHMuaXNQdWJsaWNNZXRob2QobWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljTWV0aG9kcy5hZGQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwdWJsaWNNZXRob2RzLnRvQXJyYXkobmV3IE9iamVjdFtwdWJsaWNNZXRob2RzLnNpemUoKV0pOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBOT19DSElMRFJFTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBqYXZhVHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVRyZWVTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgSVRyZWVTZWxlY3Rpb24gdHJlZVNlbGVjdGlvbiA9IChUcmVlU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9IHRyZWVTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgZmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgPQotICAgICAgICAgICAgICAgICAgICAJbmV3IEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKGRvY3VtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlIHNvdXJjZVR5cGUgPSAoSVR5cGUpIGZpcnN0RWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBzb3VyY2VUeXBlLmdldEVsZW1lbnROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJlZ2V4ID0gbmV3IFN0cmluZ0J1aWxkZXIoIlxcYnB1YmxpY1xcVysoPzpcXHcrXFxXKyl7MSwzfT8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZCgiXFxiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlZ2lvbiByZWdpb24gPSBmaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlci5maW5kKDAsIHJlZ2V4LnRvU3RyaW5nKCksIHRydWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5yZXZlYWxSYW5nZShyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWV0aG9kIHNvdXJjZU1ldGhvZCA9IChJTWV0aG9kKSBmaXJzdEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVR5cGUgc291cmNlVHlwZSA9IChJVHlwZSkgc291cmNlTWV0aG9kLmdldFBhcmVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lID0gc291cmNlTWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJlZ2V4ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VUeXBlLmlzQ2xhc3MoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoIlxcYnB1YmxpYyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZCgiXFxXKyg/OlxcdytcXFcrKXsxLDN9PyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZChlbGVtZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXHMqP1xcKFxccyo/Lio/Iik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IHNvdXJjZU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtdGVyTmFtZXMgPSBzb3VyY2VNZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXHMqPyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGVyVHlwZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQodHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoIlxccyo/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZChwYXJhbXRlck5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJaWYgKGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICByZWdleC5hcHBlbmQoIlxccyo/LFxccyo/Lio/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCX0KLQkJCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXHMqP1xcKSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAJSVJlZ2lvbiByZWdpb24gPSBmaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlci5maW5kKDAsIHJlZ2V4LnRvU3RyaW5nKCksIHRydWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVnaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlZ2lvbiBlbGVtZW50TmFtZVJlZ2lvbiA9IGZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyLmZpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJcmVnaW9uLmdldE9mZnNldCgpLCBlbGVtZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWVSZWdpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShlbGVtZW50TmFtZVJlZ2lvbi5nZXRPZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJZWxlbWVudE5hbWVSZWdpb24uZ2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIucmV2ZWFsUmFuZ2UoZWxlbWVudE5hbWVSZWdpb24uZ2V0T2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWVsZW1lbnROYW1lUmVnaW9uLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhibGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjcmVhdGVXZWJNZXRob2RWaWV3ZXJDb2x1bW4oamF2YVRyZWVWaWV3ZXIpOwotICAgICAgICBjcmVhdGVXZWJQYXJhbVZpZXdlckNvbHVtbihqYXZhVHJlZVZpZXdlcik7Ci0gICAgICAgIGNyZWF0ZVJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uKGphdmFUcmVlVmlld2VyKTsKLSAgICAgICAgY3JlYXRlUmVzcG9uc2VXcmFwcGVyVmlld2VyQ29sdW1uKGphdmFUcmVlVmlld2VyKTsKLQotICAgICAgICBqYXZhVHJlZVZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoVHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLSAgICAgICAgamF2YVRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIHByZXZpZXdDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNhc2hGb3JtLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgcHJldmlld0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgamF2YVRyZWVjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgcHJldmlld0xhYmVsID0gbmV3IExhYmVsKHByZXZpZXdDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgcHJldmlld0xhYmVsLnNldFRleHQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBWFdTX0FOTk9UQVRFX0pKQVZBX1dJREdFVF9QUkVWSUVXKTsKLQotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlciA9IGNyZWF0ZUFubm90YXRpb25QcmV2aWV3ZXIocHJldmlld0NvbXBvc2l0ZSwgU1dULlJFQURfT05MWSB8IFNXVC5WX1NDUk9MTAotICAgICAgICAgICAgICAgIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhlaWdodEhpbnQgPSAxMDsKLSAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2FzaEZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W117NTAsIDUwfSk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxpemUoKSB7Ci0gICAgICAgIHR5cGUgPSBudWxsOwotICAgICAgICB1cGRhdGVMYWJlbFByb3ZpZGVycygpOwotICAgICAgICBqYXZhVHJlZVZpZXdlci5zZXRJbnB1dChnZXRUeXBlKCkuZ2V0VHlwZVJvb3QoKSk7Ci0gICAgICAgIGphdmFUcmVlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgaGFuZGxlQW5ub3RhdGlvbihnZXRUeXBlKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgSVR5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlID0gSkRUVXRpbHMuZmluZFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIG1vZGVsCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPUpEVFV0aWxzLmZpbmRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBtb2RlbAotICAgICAgICAgICAgICAgICAgICAuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9IEpEVFV0aWxzLmZpbmRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBtb2RlbAotICAgICAgICAgICAgICAgICAgICAuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtb2RlbC5zZXRNZXRob2RNYXAoQ1hGTW9kZWxVdGlscy5nZXRNZXRob2RNYXAodHlwZSwgbW9kZWwpKTsKLQotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gY3JlYXRlV2ViTWV0aG9kVmlld2VyQ29sdW1uKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotICAgICAgICB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiB3ZWJNZXRob2RDb2x1bW4gPSB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2ViTWV0aG9kQ29sdW1uLnNldFdpZHRoKDEwMCk7Ci0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIHdlYk1ldGhvZFZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QsIGdldFR5cGUoKSkpOwotICAgICAgICB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCh0cmVlVmlld2VyLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCkpOwotICAgICAgICByZXR1cm4gd2ViTWV0aG9kVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiBjcmVhdGVXZWJQYXJhbVZpZXdlckNvbHVtbihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgd2ViUGFyYW1WaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiB3ZWJQYXJhbUNvbHVtbiA9IHdlYlBhcmFtVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRXaWR0aCgxMDApOwotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0gICAgICAgIHdlYlBhcmFtQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsKLSAgICAgICAgd2ViUGFyYW1WaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0sIGdldFR5cGUoKSkpOwotICAgICAgICB3ZWJQYXJhbVZpZXdlckNvbHVtbi5zZXRFZGl0aW5nU3VwcG9ydChuZXcgQW5ub3RhdGlvbkVkaXRpbmdTdXBwb3J0KHRyZWVWaWV3ZXIsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0pKTsKLSAgICAgICAgcmV0dXJuIHdlYlBhcmFtVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiBjcmVhdGVSZXF1ZXN0V3JhcHBlclZpZXdlckNvbHVtbihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbiA9IHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbi5zZXRXaWR0aCgxMDApOwotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSLCBnZXRUeXBlKCkpKTsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCh0cmVlVmlld2VyLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSKSk7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0V3JhcHBlclZpZXdlckNvbHVtbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gY3JlYXRlUmVzcG9uc2VXcmFwcGVyVmlld2VyQ29sdW1uKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotICAgICAgICByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiByZXNwb25jZVdyYXBwZXJDb2x1bW4gPSByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHJlc3BvbmNlV3JhcHBlckNvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVzcG9uY2VXcmFwcGVyQ29sdW1uLnNldFdpZHRoKDEwMCk7Ci0gICAgICAgIHJlc3BvbmNlV3JhcHBlckNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIHJlc3BvbmNlV3JhcHBlclZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIsIGdldFR5cGUoKSkpOwotICAgICAgICByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCh0cmVlVmlld2VyLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUikpOwotICAgICAgICByZXR1cm4gcmVzcG9uY2VXcmFwcGVyVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYWJlbFByb3ZpZGVycygpIHsKLSAgICAgICAgd2ViTWV0aG9kVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCwgZ2V0VHlwZSgpKSk7Ci0gICAgICAgIHdlYlBhcmFtVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNLCBnZXRUeXBlKCkpKTsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5SRVFVRVNUX1dSQVBQRVIsIGdldFR5cGUoKSkpOwotICAgICAgICByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5SRVNQT05TRV9XUkFQUEVSLCBnZXRUeXBlKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQW5ub3RhdGlvbihJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSAgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFubm90YXRpb24gQ2hhbmdlcyIsCi0gICAgICAgICAgICAgICAgICAgIChJRmlsZSljb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEtlZXBQcmV2aWV3RWRpdHModHJ1ZSk7Ci0KLSAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViU2VydmljZUFubm90YXRpb25DaGFuZ2UodHlwZSwgbW9kZWwsIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgSU1ldGhvZFtdIHR5cGVNZXRob2RzID0gSkRUVXRpbHMuZ2V0UHVibGljTWV0aG9kcyh0eXBlKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZU1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHR5cGVNZXRob2RzW2ldOwotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1ldGhvZEFubm90YXRpb25NYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5XRUJfTUVUSE9EKSkgewotICAgICAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYk1ldGhvZEFubm90YXRpb25DaGFuZ2UodHlwZSwgbWV0aG9kLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRSZXF1ZXN0V3JhcHBlckFubm90YXRpb25DaGFuZ2UodHlwZSwgbWV0aG9kLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0UmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZSh0eXBlLCBtZXRob2QsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNKSkgewotCQkJCQlMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMobWV0aG9kKTsKLQkJCQkJZm9yIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKLQkJCQkJCUNYRk1vZGVsVXRpbHMuZ2V0V2ViUGFyYW1Bbm5vdGF0aW9uQ2hhbmdlKHR5cGUsIG1ldGhvZCwKLQkJCQkJCQkJKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpLCB0ZXh0RmlsZUNoYW5nZSk7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0SW1wb3J0c0NoYW5nZShjb21waWxhdGlvblVuaXQsIG1vZGVsLCB0ZXh0RmlsZUNoYW5nZSwgZmFsc2UpOwotICAgICAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQodGV4dEZpbGVDaGFuZ2UuZ2V0UHJldmlld0NvbnRlbnQobW9uaXRvcikpOwotCi0gICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBtdGUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKG10ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNvdXJjZVZpZXdlciBjcmVhdGVBbm5vdGF0aW9uUHJldmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZXMpIHsKLSAgICAgICAgSmF2YVBsdWdpbiBqYXZhUGx1Z2luID0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBqYXZhUGx1Z2luLmdldENvbWJpbmVkUHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIEphdmFUZXh0VG9vbHMgamF2YVRleHRUb29scyA9IGphdmFQbHVnaW4uZ2V0SmF2YVRleHRUb29scygpOwotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlciA9IG5ldyBKYXZhU291cmNlVmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgdHJ1ZSwgc3R5bGVzLCBzdG9yZSk7Ci0gICAgICAgIElDb2xvck1hbmFnZXIgY29sb3JNYW5hZ2VyID0gamF2YVRleHRUb29scy5nZXRDb2xvck1hbmFnZXIoKTsKLSAgICAgICAgU2ltcGxlSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBTaW1wbGVKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigKLSAgICAgICAgICAgICAgICBjb2xvck1hbmFnZXIsIHN0b3JlLCBudWxsLCBJSmF2YVBhcnRpdGlvbnMuSkFWQV9QQVJUSVRJT05JTkcsIHRydWUpOwotCi0gICAgICAgIGFubm90YXRpb25QcmV2aWV3Vmlld2VyLmNvbmZpZ3VyZShjb25maWd1cmF0aW9uKTsKLQotICAgICAgICBGb250IGZvbnQgPSBKRmFjZVJlc291cmNlcy5nZXRGb250KFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1RFWFRfRk9OVCk7Ci0gICAgICAgIGFubm90YXRpb25QcmV2aWV3Vmlld2VyLmdldFRleHRXaWRnZXQoKS5zZXRGb250KGZvbnQpOwotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQotICAgICAgICBTdHJpbmcgc291cmNlID0gZ2V0U291cmNlRnJvbVR5cGUoZ2V0VHlwZSgpKTsKLSAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KHNvdXJjZSk7Ci0KLSAgICAgICAgSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YVRleHRUb29scygpLnNldHVwSmF2YURvY3VtZW50UGFydGl0aW9uZXIoZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HKTsKLSAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uUHJldmlld1ZpZXdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUZyb21UeXBlKElUeXBlIHR5cGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQW5ub3RhdGlvbkVkaXRpbmdTdXBwb3J0IGV4dGVuZHMgRWRpdGluZ1N1cHBvcnQgewotICAgICAgICBwcml2YXRlIENoZWNrYm94Q2VsbEVkaXRvciBjaGVja2JveENlbGxFZGl0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbktleTsKLQotICAgICAgICBwdWJsaWMgQW5ub3RhdGlvbkVkaXRpbmdTdXBwb3J0KFRyZWVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgYW5ub3RhdGlvbktleSkgewotICAgICAgICAgICAgc3VwZXIodmlld2VyKTsKLSAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbktleSA9IGFubm90YXRpb25LZXk7Ci0gICAgICAgICAgICBjaGVja2JveENlbGxFZGl0b3IgPSBuZXcgQ2hlY2tib3hDZWxsRWRpdG9yKHZpZXdlci5nZXRUcmVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkVkaXQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudCh0eXBlLmZpbmRNZXRob2RzKG1ldGhvZClbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hlY2tib3hDZWxsRWRpdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIEJvb2xlYW4gYW5ub3RhdGUgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQoZWxlbWVudCkuZ2V0KGFubm90YXRpb25LZXkpOwotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgQm9vbGVhbiBhbm5vdGF0ZSA9IChCb29sZWFuKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBhbm5vdGF0aW9uTWFwID0gbW9kZWwuZ2V0TWV0aG9kTWFwKCkuZ2V0KGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFubm90YXRpb25NYXAucHV0KGFubm90YXRpb25LZXksIGFubm90YXRlKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVBbm5vdGF0aW9uKG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOwotICAgICAgICAgICAgICAgIGdldFZpZXdlcigpLnJlZnJlc2godHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSkFYV1NBbm5vdGF0ZVdpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1MTU3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciBqYXh3c0Fubm90YXRlV2lkZ2V0Q29udHJpYnV0b3I7Ci0KLSAgICBwcml2YXRlIEpBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0IGpheHdzQW5ub3RhdGVKYXZhV2lkZ2V0ID0gbmV3IEpBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0KCk7Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIHsKLSAgICAgICAgaWYgKGpheHdzQW5ub3RhdGVXaWRnZXRDb250cmlidXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGpheHdzQW5ub3RhdGVXaWRnZXRDb250cmlidXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiSmF2YTJXU0RhdGFNb2RlbCIsIEpBWFdTQW5ub3RhdGVXaWRnZXRGYWN0b3J5LmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBqYXh3c0Fubm90YXRlSmF2YVdpZGdldC5zZXRKYXZhMldTRGF0YU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9IENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0pBWFdTX0FOTk9UQVRFX1BBR0VfVElUTEUsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2NvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCksIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yLnNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgIC5zZXREZXNjcmlwdGlvbihDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGpheHdzQW5ub3RhdGVKYXZhV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ2xhc3NDb25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDbGFzc0NvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTY1Mjc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDbGFzc0NvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5FRlM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5KYXZhMldTV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIEpBVkFfVFlQRV9OQU1FX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBwcml2YXRlIElTdGF0dXMgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0KLSAgICBwcml2YXRlIGludCBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFM7Ci0gICAgcHJpdmF0ZSBpbnQgTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUzsKLSAgICBwcml2YXRlIElNZXRob2RbXSBwdWJsaWNNZXRob2RzOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gdXNlU0VJQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHNlbGVjdFNFSUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBicm93c2VTRUlCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZXh0cmFjdFNFSUJ1dHRvbjsKLQotICAgIHByaXZhdGUgQ29tYm8gc2VsZWN0U0VJQ29tYm87Ci0gICAgcHJpdmF0ZSBUZXh0IHNlaUludGVyZmFjZU5hbWVUZXh0OwotCi0gICAgcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlcjsKLSAgICBwcml2YXRlIFRhYmxlIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZTsKLSAgICBwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0KLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBJVHlwZSBzdGFydGluZ1BvaW50VHlwZTsKLQotICAgIHB1YmxpYyBKYXZhMldTQ2xhc3NDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoSVR5cGUgc3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAgICAgdGhpcy5zdGFydGluZ1BvaW50VHlwZSA9IHN0YXJ0aW5nUG9pbnRUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCkgewotICAgICAgICBib29sZWFuIHVzZVNFSSA9IG1vZGVsLmlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0gICAgICAgIHVzZVNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24odXNlU0VJKTsKLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbih1c2VTRUkpOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICBpZiAoIXVzZVNFSSkgewotICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uZGVzZWxlY3RBbGwoKTsKLSAgICAgICAgfQotICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyh1c2VTRUkpOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICBlbmFibGVFeHRyYWN0U0VJQ29udHJvbHModXNlU0VJKTsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLSAgICAgICAgTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA9IDA7Ci0gICAgICAgIHZhbGlkYXRlU0VJU2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHVzZVNFSUJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVVzZVNFSUJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICB1c2VTRUlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHVzZVNFSSA9IHVzZVNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UodXNlU0VJKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICAgICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgICAgIGlmICghdXNlU0VJKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoIiIpOwotCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyhmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBlbmFibGVFeHRyYWN0U0VJQ29udHJvbHMoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHVzZVNFSUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMYWJlbCBwYWRkaW5nTGFiZWwgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWRkaW5nTGFiZWwoY29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBwYWRkaW5nTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU2VsZWN0U0VJQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGVuYWJsZVNlbGVjdFNFSUNvbnRyb2xzKHNlbGVjdFNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgZW5hYmxlRXh0cmFjdFNFSUNvbnRyb2xzKCFzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2VsZWN0U0VJQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTZWxlY3RTRUlDb21ibyhjb21wb3NpdGUsIG1vZGVsLCBzdGFydGluZ1BvaW50VHlwZSk7Ci0gICAgICAgIHNlbGVjdFNFSUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzZWxlY3RTRUlDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotICAgICAgICBzZWxlY3RTRUlDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBicm93c2VTRUlCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVCcm93c2VCdXR0b24oY29tcG9zaXRlKTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLSAgICAgICAgYnJvd3NlU0VJQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGJyb3dzZVNFSUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0U2hlbGwoKSwgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9ESUFMT0dfVElUTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX0RJQUxPR19ERVNDUklQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBJSmF2YVNlYXJjaENvbnN0YW50cy5JTlRFUkZBQ0UpOwotCi0gICAgICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBzZWxlY3Rpb25EaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5Db2RlID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNlbGVjdGVkQ29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIHNlbGVjdGlvbkRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0ZWRJbnRlcmZhY2UgPSBzZWxlY3RlZENvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHNlaXMgPSBBcnJheXMuYXNMaXN0KHNlbGVjdFNFSUNvbWJvLmdldEl0ZW1zKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXNlaXMuY29udGFpbnMoc2VsZWN0ZWRJbnRlcmZhY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RTRUlDb21iby5hZGQoc2VsZWN0ZWRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdFNFSUNvbWJvLnNldFRleHQoc2VsZWN0ZWRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcGFkZGluZ0xhYmVsID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgcGFkZGluZ0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVFeHRyYWN0U0VJQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGV4dHJhY3QgPSBleHRyYWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEV4dHJhY3RJbnRlcmZhY2UoZXh0cmFjdCk7Ci0gICAgICAgICAgICAgICAgZW5hYmxlRXh0cmFjdFNFSUNvbnRyb2xzKGV4dHJhY3QpOwotICAgICAgICAgICAgICAgIGVuYWJsZVNlbGVjdFNFSUNvbnRyb2xzKCFleHRyYWN0KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzRXh0cmFjdEludGVyZmFjZSgpKTsKLSAgICAgICAgZXh0cmFjdFNFSUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTRUlJbnRlcmZhY2VOYW1lVGV4dChjb21wb3NpdGUpOwotICAgICAgICBzZWlJbnRlcmZhY2VOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXh0cmFjdFNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHNlaUludGVyZmFjZU5hbWVUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlaU5hbWUgPSBpbnRlcmZhY2VOYW1lOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBzdGFydGluZ1BvaW50VHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWlOYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyBpbnRlcmZhY2VOYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoc2VpTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBpbGF0aW9uVW5pdE5hbWUgPSBpbnRlcmZhY2VOYW1lICsgIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBKQVZBX1RZUEVfTkFNRV9TVEFUVVMgPSBKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBpbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgSkFWQV9UWVBFX0VYSVNUU19TVEFUVVMgPSBjaGVja1R5cGVFeGlzdHMoc3RhcnRpbmdQb2ludFR5cGUsIGNvbXBpbGF0aW9uVW5pdE5hbWUpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0gICAgICAgIHNlaUludGVyZmFjZU5hbWVUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChjb21wb3NpdGUpOwotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWRkaW5nTGFiZWwoY29tcG9zaXRlKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVNZW1lYmVyc1RvRXh0cmFjdExhYmVsKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChjb21wb3NpdGUpOwotCi0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlciA9IEphdmEyV1NXaWRnZXRGYWN0b3J5Ci0gICAgICAgIC5jcmVhdGVTRUlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIoY29tcG9zaXRlKTsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlID0gc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBjaGVja2VkTWV0aG9kcyA9IHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQotICAgICAgICAgICAgICAgIE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gbWV0aG9kTWFwID0gbmV3IEhhc2hNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtZXRob2RNYXAucHV0KChJTWV0aG9kKWNoZWNrZWRNZXRob2RzW2ldLCBtb2RlbC5nZXRBbm5vdGF0aW9uTWFwKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRNZXRob2RNYXAobWV0aG9kTWFwKTsKLQotICAgICAgICAgICAgICAgIE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPSBjaGVja2VkTWV0aG9kcy5sZW5ndGg7Ci0KLSAgICAgICAgICAgICAgICBpZiAoTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA8IE5VTUJFUl9PRl9QVUJMSUNfTUVUSE9EUykgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPT0gTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotICAgICAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gMTAwOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2VsZWN0QWxsQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU2VsZWN0QWxsQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0gICAgICAgICAgICAgICAgVGFibGVJdGVtW10gY2hlY2tlZE1ldGhvZHMgPSBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IGNoZWNrZWRNZXRob2RzW2ldOwotICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25FdmVudCA9IGV2ZW50OwotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FdmVudC5kZXRhaWwgPSBTV1QuQ0hFQ0s7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkV2ZW50Lml0ZW0gPSB0YWJsZUl0ZW07Ci0gICAgICAgICAgICAgICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5oYW5kbGVTZWxlY3Qoc2VsZWN0aW9uRXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVEZXNlbGVjdEFsbEJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIFRhYmxlSXRlbVtdIGNoZWNrZWRNZXRob2RzID0gc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBjaGVja2VkTWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uRXZlbnQgc2VsZWN0aW9uRXZlbnQgPSBldmVudDsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRXZlbnQuZGV0YWlsID0gU1dULkNIRUNLOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FdmVudC5pdGVtID0gdGFibGVJdGVtOwotICAgICAgICAgICAgICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuaGFuZGxlU2VsZWN0KHNlbGVjdGlvbkV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcHVibGljTWV0aG9kcyA9IEpEVFV0aWxzLmdldFB1YmxpY01ldGhvZHMoc3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFMgPSBwdWJsaWNNZXRob2RzLmxlbmd0aDsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLnNldElucHV0KHB1YmxpY01ldGhvZHMpOwotCi0gICAgICAgIGVuYWJsZVNlbGVjdFNFSUNvbnRyb2xzKGZhbHNlKTsKLSAgICAgICAgZW5hYmxlRXh0cmFjdFNFSUNvbnRyb2xzKGZhbHNlKTsKLSAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICBpZiAobW9kZWwuaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgaWYgKHNlbGVjdFNFSUNvbWJvLmluZGV4T2YobW9kZWwuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHNlbGVjdFNFSUNvbWJvLmFkZChtb2RlbC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uc2V0VGV4dChtb2RlbC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZShtb2RlbC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU0VJU2VsZWN0aW9uKCkgewotICAgICAgICBpZiAoIXVzZVNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIElUeXBlIHNlaVR5cGUgPSBKRFRVdGlscy5maW5kVHlwZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBzZWxlY3RTRUlDb21iby5nZXRUZXh0KCkpOwotICAgICAgICBpZiAoc2VpVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElNZXRob2RbXSBzZWlNZXRob2RzID0gc2VpVHlwZS5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJTWV0aG9kIHNlaU1ldGhvZCA6IHNlaU1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgSU1ldGhvZFtdIGltcGxNZXRob2RzID0gc3RhcnRpbmdQb2ludFR5cGUuZmluZE1ldGhvZHMoc2VpTWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxNZXRob2RzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9NVVNUX0lNUExFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZShzZWlUeXBlLCBzZWlNZXRob2QpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gdmFsaWRhdGVTRUlBZGRpdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1vZGVsLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfRk9VTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbXBsZW1lbnRzTWVzc2FnZShJVHlwZSBzZWlUeXBlLCBJTWV0aG9kIHNlaU1ldGhvZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcihzZWlUeXBlLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKHNlaU1ldGhvZC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IHNlaU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyVHlwZSA9IFNpZ25hdHVyZS50b1N0cmluZyhwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChwYXJhbWV0ZXJUeXBlKTsKLSAgICAgICAgICAgIGlmIChpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVNFSUFkZGl0aW9uKCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcywgc3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9iamVjdCBuYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJTZXJ2aWNlLCBOQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9XRUJTRVJWSUNFX05BTUVfQVRUUklCVVRFX1BSRVNFTlQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZVNlbGVjdFNFSUNvbnRyb2xzKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIHNlbGVjdFNFSUNvbWJvLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgYnJvd3NlU0VJQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVFeHRyYWN0U0VJQ29udHJvbHMoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGUuc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBpZiAoZW5hYmxlICYmIE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPCBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFMpIHsKLSAgICAgICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVuYWJsZSAmJiBOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID4gMCkgewotICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZW5hYmxlKSB7Ci0gICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIGZpbmRNb3N0U2V2ZXJlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpIHsKLSAgICAgICAgaWYgKHVzZVNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgaWYgKCFzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgIWV4dHJhY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX09QVElPTik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX01FU1NBR0UpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlU0VJU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChleHRyYWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIHNlaUludGVyZmFjZU5hbWVUZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0VOVEVSX1NFSV9OQU1FKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0cmFjdFNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAmJiBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFMgPiAwCi0gICAgICAgICAgICAgICAgICAgICYmIE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPT0gMCkgewotICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX0VYVFJBQ1RFRF9NRVRIT0RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZ1BvaW50VHlwZS5nZXRFbGVtZW50TmFtZSgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dHJhY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgc2VpSW50ZXJmYWNlTmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTID4gMCAmJiBOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID4gMCkgewotICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgSkFWQV9UWVBFX05BTUVfU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyBmaW5kTW9zdFNldmVyZSgpIHsKLSAgICAgICAgaWYgKEpBVkFfVFlQRV9OQU1FX1NUQVRVUy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFWQV9UWVBFX05BTUVfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICAgIGlmIChKQVZBX1RZUEVfRVhJU1RTX1NUQVRVUy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFWQV9UWVBFX0VYSVNUU19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFNFSV9TRUxFQ1RJT05fU1RBVFVTLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLSAgICAgICAgICAgIHJldHVybiBTRUlfU0VMRUNUSU9OX1NUQVRVUzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChTRUlfU0VMRUNUSU9OX1NUQVRVUy5nZXRTZXZlcml0eSgpID49IEpBVkFfVFlQRV9OQU1FX1NUQVRVUy5nZXRTZXZlcml0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gU0VJX1NFTEVDVElPTl9TVEFUVVM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoSkFWQV9UWVBFX0VYSVNUU19TVEFUVVMuZ2V0U2V2ZXJpdHkoKSA+PSBKQVZBX1RZUEVfTkFNRV9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEpBVkFfVFlQRV9OQU1FX1NUQVRVUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0YXR1cyBjaGVja1R5cGVFeGlzdHMoSVR5cGUgdHlwZSwgU3RyaW5nIGNvbXBpbGF0aW9uVW5pdE5hbWUpIHsKLSAgICAgICAgY29tcGlsYXRpb25Vbml0TmFtZSA9IGNvbXBpbGF0aW9uVW5pdE5hbWUudHJpbSgpOwotCi0gICAgICAgIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBwYWNrYWdlRnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0KGNvbXBpbGF0aW9uVW5pdE5hbWUpOwotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKTsKLQotICAgICAgICBpZiAocmVzb3VyY2UuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEpBWFdTQ29yZU1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC5iaW5kKEpBWFdTQ29yZU1lc3NhZ2VzLlRZUEVfV0lUSF9OQU1FX0FMUkVBRFlfRVhJU1RTLCBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdE5hbWUsIHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpIH0pKTsKLSAgICAgICAgfQotICAgICAgICBVUkkgbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJRmlsZVN0b3JlIGZpbGVTdG9yZSA9IEVGUy5nZXRTdG9yZShsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVTdG9yZS5mZXRjaEluZm8oKS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU0NvcmVQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLlRZUEVfTkFNRV9ESUZGRVJFTlRfQ0FTRV9FWElTVFMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ29uZmlnV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZjRmNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5KYXZhMldTV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgSVN0YXR1cyBXU0RMX0ZJTEVOQU1FX09LX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIFdTRExfRklMRU5BTUVfRVJST1JfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0VOVEVSX1ZBTElEX1dTRExfTkFNRSk7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZUNsaWVudEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVNlcnZlckJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVdyYXBlckZhdWx0QmVhbnNCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVXU0RMQnV0dG9uOwotICAgIHByaXZhdGUgQ29tYm8gc29hcEJpbmRpbmdDb21ibzsKLSAgICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVYU0RJbXBvcnRzOwotICAgIHByaXZhdGUgVGV4dCB3c2RsRmlsZVRleHQ7Ci0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHVibGljIEphdmEyV1NDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbGl6ZSgpIHsKLSAgICAgICAgaWYgKG1vZGVsLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgZ2VuZXJhdGVDbGllbnRCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVDbGllbnQoKSk7Ci0gICAgICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgICAgIGdlbmVyYXRlV3JhcGVyRmF1bHRCZWFuc0J1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkpOwotICAgICAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICAgICAgICAgIGVuYWJsZVdTRExHcm91cChtb2RlbC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9kZWwuaXNTb2FwMTJCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgY3JlYXRlWFNESW1wb3J0cy5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZVhTREltcG9ydHMoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIGphdmEyd3NHcm91cCA9IG51bGw7Ci0gICAgICAgIGlmIChtb2RlbC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIC8vIEZyb250ZW5kCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUZyb250ZW5kTGFiZWwoY29tcG9zaXRlKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIGZpbmFsIENvbWJvIGZyb250ZW5kQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVGcm9udGVuZENvbWJvKGNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZnJvbnRlbmRDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAgICAgLy8gSmF2YTJXUyBHcm91cAotICAgICAgICAgICAgamF2YTJ3c0dyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULlNIQURPV19JTik7Ci0gICAgICAgICAgICBqYXZhMndzR3JvdXAuc2V0VGV4dChDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19HUk9VUF9MQUJFTCk7Ci0gICAgICAgICAgICBHcmlkTGF5b3V0IGphdmEyd3NsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCi0gICAgICAgICAgICBqYXZhMndzbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0gICAgICAgICAgICBqYXZhMndzbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotICAgICAgICAgICAgamF2YTJ3c0dyb3VwLnNldExheW91dChqYXZhMndzbGF5b3V0KTsKLSAgICAgICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgICAgICBqYXZhMndzR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgICAgIC8vIEdlbiBDbGllbnQKLSAgICAgICAgICAgIGdlbmVyYXRlQ2xpZW50QnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVDbGllbnRCdXR0b24oamF2YTJ3c0dyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgICAgIC8vIEdlbiBTZXJ2ZXIKLSAgICAgICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24oamF2YTJ3c0dyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgICAgIC8vIEdlbiBXcmFwcGVyIGFuZCBGYXVsdCBCZWFuCi0gICAgICAgICAgICBnZW5lcmF0ZVdyYXBlckZhdWx0QmVhbnNCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24oCi0gICAgICAgICAgICAgICAgICAgIGphdmEyd3NHcm91cCwgbW9kZWwpOwotCi0gICAgICAgICAgICAvLyBHZW4gV1NETAotICAgICAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVXU0RMQnV0dG9uKGphdmEyd3NHcm91cCwgbW9kZWwpOwotICAgICAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlV1NETEdyb3VwKGdlbmVyYXRlV1NETEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgR3JvdXAgd3NkbEdyb3VwID0gbmV3IEdyb3VwKGphdmEyd3NHcm91cCA9PSBudWxsID8gY29tcG9zaXRlIDogamF2YTJ3c0dyb3VwLCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0gICAgICAgIEdyaWRMYXlvdXQgd3NkbEdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICB3c2RsR3JvdXAuc2V0TGF5b3V0KHdzZGxHcm91cExheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgd3NkbEdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVdTRExGaWxlTmFtZUxhYmVsKHdzZGxHcm91cCk7Ci0KLSAgICAgICAgd3NkbEZpbGVUZXh0ID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlV1NETEZpbGVOYW1lVGV4dCh3c2RsR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgd3NkbEZpbGVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB3c2RsRmlsZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU09BUEJpbmRpbmdMYWJlbCh3c2RsR3JvdXApOwotCi0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTT0FQQmluZ0NvbWJvKHdzZGxHcm91cCwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVYU0RJbXBvcnRzQnV0dG9uKHdzZGxHcm91cCwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGVuYWJsZVdTRExHcm91cChtb2RlbC5pc0dlbmVyYXRlV1NETCgpKTsKLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5hYmxlV1NETEdyb3VwKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIHdzZGxGaWxlVGV4dC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRXU0RMRmlsZU5hbWVTdGF0dXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgZ2V0V1NETEZpbGVOYW1lU3RhdHVzKCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFdTRExfRklMRU5BTUVfT0tfU1RBVFVTOwotICAgICAgICBTdHJpbmcgd3NkbEZpbGVOYW1lID0gd3NkbEZpbGVUZXh0LmdldFRleHQoKTsKLSAgICAgICAgaWYgKCFXU0RMVXRpbHMuaXNWYWxpZFdTRExGaWxlTmFtZSh3c2RsRmlsZU5hbWUpKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBXU0RMX0ZJTEVOQU1FX0VSUk9SX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQ5ZDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IgamF2YTJXU1dpZGdldENvbnRyaWJ1dG9yOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTQ29uZmlnV2lkZ2V0IGphdmEyV1NDb25maWdXaWRnZXQgPSBuZXcgSmF2YTJXU0NvbmZpZ1dpZGdldCgpOwotCi0gICAgcHVibGljIEphdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5KCkgewotCi0gICAgfQotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmIChqYXZhMldTV2lkZ2V0Q29udHJpYnV0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqYXZhMldTV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldChJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0gICAgICAgICAgICAgICAgIkphdmEyV1NEYXRhTW9kZWwiLCBKYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhMldTRGF0YU1vZGVsKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgamF2YTJXU0NvbmZpZ1dpZGdldC5zZXRKYXZhMldTRGF0YU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgamF2YTJXU1dpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9IENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXXtjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKX0pOwotCi0gICAgICAgIGphdmEyV1NXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZSh0aXRsZSk7Ci0gICAgICAgIGphdmEyV1NXaWRnZXRDb250cmlidXRvcgotICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfUEFHRV9ERVNDUklQVElPTiwKLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpKSk7Ci0gICAgICAgIGphdmEyV1NXaWRnZXRDb250cmlidXRvci5zZXRGYWN0b3J5KG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBqYXZhMldTQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMGE0ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuSmF2YTJXU1dpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgSVN0YXR1cyBJTVBMX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgSVR5cGUgc3RhcnRpbmdQb2ludFR5cGU7Ci0KLSAgICBwcml2YXRlIENvbWJvIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm87Ci0gICAgCi0gICAgcHVibGljIEphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoSVR5cGUgc3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAgICAgdGhpcy5zdGFydGluZ1BvaW50VHlwZSA9IHN0YXJ0aW5nUG9pbnRUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlbGVjdEltcGxlbWVudGF0aW9uTGFiZWwoY29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgLmNyZWF0ZVNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8oY29tcG9zaXRlLCBtb2RlbCwgc3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVJbXBsZW1lbnRhdGlvblNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCi0gICAgICAgIAlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAJdmFsaWRhdGVJbXBsZW1lbnRhdGlvblNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIEJ1dHRvbiBicm93c2VJbXBsQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlQnJvd3NlQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYnJvd3NlSW1wbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIGJyb3dzZUltcGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldFNoZWxsKCksIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9JTVBMX0RJQUxPR19USVRMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9JTVBMX0RJQUxPR19ERVNDUklQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUyk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IHNlbGVjdGlvbkRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHVybkNvZGUgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgc2VsZWN0ZWRDb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgc2VsZWN0aW9uRGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3RlZEltcGxlbWVudGF0aW9uID0gc2VsZWN0ZWRDb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBpbXBscyA9IEFycmF5cy5hc0xpc3Qoc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5nZXRJdGVtcygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBscy5jb250YWlucyhzZWxlY3RlZEltcGxlbWVudGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAJc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5hZGQoc2VsZWN0ZWRJbXBsZW1lbnRhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5zZXRUZXh0KHNlbGVjdGVkSW1wbGVtZW50YXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIElNUExfU0VMRUNUSU9OX1NUQVRVUzsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSW1wbGVtZW50YXRpb25TZWxlY3Rpb24oKSB7Ci0gICAgICAgIElUeXBlIGltcGxUeXBlID0gSkRUVXRpbHMuZmluZFR5cGUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5nZXRUZXh0KCkpOwotICAgICAgICBpZiAoaW1wbFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kW10gc2VpTWV0aG9kcyA9IHN0YXJ0aW5nUG9pbnRUeXBlLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKElNZXRob2Qgc2VpTWV0aG9kIDogc2VpTWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICBJTWV0aG9kW10gaW1wbE1ldGhvZCA9IGltcGxUeXBlLmZpbmRNZXRob2RzKHNlaU1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbXBsTWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCUlNUExfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIAkgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9NVVNUX0lNUExFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEltcGxlbWVudHNNZXNzYWdlKHN0YXJ0aW5nUG9pbnRUeXBlLCBzZWlNZXRob2QpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBJTVBMX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKHN0YXJ0aW5nUG9pbnRUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlJTVBMX1NFTEVDVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAJICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XRUJTRVJWSUNFX0lNUExFTUVOVEFUSU9OX05PVF9GT1VORCwKLSAgICAgICAgICAgICAgICAgICAgCQlzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmdldFRleHQoKSkpOyAgIAotICAgICAgICB9ICAgICAgICAKLQl9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbXBsZW1lbnRzTWVzc2FnZShJVHlwZSBzZWlUeXBlLCBJTWV0aG9kIHNlaU1ldGhvZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcihzZWlUeXBlLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKHNlaU1ldGhvZC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IHNlaU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyVHlwZSA9IFNpZ25hdHVyZS50b1N0cmluZyhwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChwYXJhbWV0ZXJUeXBlKTsKLSAgICAgICAgICAgIGlmIChpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NTZWxlY3RTRUlXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOThiZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NTZWxlY3RTRUlXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfSU5URVJGQUNFID0gImVuZHBvaW50SW50ZXJmYWNlIjsKLQotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IgY2xhc3NXaWRnZXRDb250cmlidXRvcjsKLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIGludGVyZmFjZVdpZGdldENvbnRyaWJ1dG9yOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTQ2xhc3NDb25maWdXaWRnZXQgamF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0ID0gbmV3IEphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldCgpOwotICAgIHByaXZhdGUgSmF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldCBqYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0ID0gbmV3IEphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQoKTsKLQotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlOwotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmIChzdGFydGluZ1BvaW50VHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnRlcmZhY2VXaWRnZXRDb250cmlidXRvciA9PSBudWxsIHx8IGNsYXNzV2lkZ2V0Q29udHJpYnV0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdGFydGluZ1BvaW50VHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGludGVyZmFjZVdpZGdldENvbnRyaWJ1dG9yOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydGluZ1BvaW50VHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgICAgICBjaGVja0ZvclNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc1dpZGdldENvbnRyaWJ1dG9yOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIElBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBzdGFydGluZ1BvaW50VHlwZS5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICBmb3IgKElBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgaWYgKGFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgSU1lbWJlclZhbHVlUGFpcltdIG1lbWJlclZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uLmdldE1lbWJlclZhbHVlUGFpcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKElNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldE1lbWJlck5hbWUoKS5lcXVhbHMoRU5EUE9JTlRfSU5URVJGQUNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlIHNlaVR5cGUgPSBzdGFydGluZ1BvaW50VHlwZS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWlUeXBlICE9IG51bGwgJiYgc2VpVHlwZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLAotICAgICAgICAgICAgICAgICJKYXZhMldTRGF0YU1vZGVsIiwgSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiSmF2YVN0YXJ0aW5nUG9pbnRUeXBlIiwgSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgamF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0LnNldEphdmEyV1NEYXRhTW9kZWwobW9kZWwpOwotICAgICAgICBqYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LnNldEphdmEyV1NEYXRhTW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFTdGFydGluZ1BvaW50VHlwZShJVHlwZSBzdGFydGluZ1BvaW50VHlwZSkgewotICAgICAgICB0aGlzLnN0YXJ0aW5nUG9pbnRUeXBlID0gc3RhcnRpbmdQb2ludFR5cGU7Ci0gICAgICAgIGphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldC5zZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoc3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICBqYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LnNldEphdmFTdGFydGluZ1BvaW50VHlwZShzdGFydGluZ1BvaW50VHlwZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGNsYXNzV2lkZ2V0Q29udHJpYnV0b3IgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLSAgICAgICAgQ1hGQ29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzQ29uZmlnVGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9USVRMRSwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117Y29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSwgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKX0pOwotICAgICAgICBjbGFzc1dpZGdldENvbnRyaWJ1dG9yLnNldFRpdGxlKGNsYXNzQ29uZmlnVGl0bGUpOwotICAgICAgICBjbGFzc1dpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgIC5zZXREZXNjcmlwdGlvbihDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgICAgIGNsYXNzV2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpbnRlcmZhY2VXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBTdHJpbmcgaW50ZXJmYWNlQ29uZmlnVGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19JTlRFUkZBQ0VfQ09ORklHX1BBR0VfVElUTEUsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2NvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCksIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgaW50ZXJmYWNlV2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUoaW50ZXJmYWNlQ29uZmlnVGl0bGUpOwotICAgICAgICBpbnRlcmZhY2VXaWRnZXRDb250cmlidXRvcgotICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfSU5URVJGQUNFX0NPTkZJR19QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgaW50ZXJmYWNlV2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDb25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRlOTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnMuUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnMuUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuV1NETDJKYXZhV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YUNvbmZpZ1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotICAgIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgQ29tYm8gb3V0cHV0RGlyQ29tYm87Ci0gICAgcHJpdmF0ZSBUZXh0IHBhY2thZ2VOYW1lVGV4dDsKLSAgICBwcml2YXRlIEJ1dHRvbiBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uOwotICAgIHByaXZhdGUgVGFibGVWaWV3ZXIgcGFja2FnZU5hbWVUYWJsZVZpZXdlcjsKLSAgICBwcml2YXRlIENvbWJvIHNlcnZpY2VOYW1lQ29tYm87Ci0gICAgcHJpdmF0ZSBMaXN0IGJpbmRpbmdGaWxlc0xpc3Q7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXI7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbmFtZXNwYWNlQ29tcG9zaXRlOwotICAgIHByaXZhdGUgaW50IG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9IC0xOwotCi0gICAgcHVibGljIFdTREwySmF2YUNvbmZpZ1dpZGdldCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbGl6ZSgpIHsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5wb3B1bGF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKG91dHB1dERpckNvbWJvLCBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LnNldFRleHQobW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuZ2V0KG1vZGVsLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgZXhwYW5kTmFtZXNwYWNlQ29tcG9zaXRlKGZhbHNlKTsKLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuc2V0SW5wdXQobW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5wb3B1bGF0ZVNlcnZpY2VOYW1lQ29tYm8oc2VydmljZU5hbWVDb21ibywgbW9kZWwpOwotCi0gICAgICAgIGJpbmRpbmdGaWxlc0xpc3QucmVtb3ZlQWxsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIHRoaXMuc3RhdHVzTGlzdGVuZXIgPSBzdGF0dXNMaXN0ZW5lcjsKLQotICAgICAgICBmaW5hbCBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBPdXRwdXQgRGlyCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlT3V0cHV0RGlyZWN0b3J5TGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgb3V0cHV0RGlyQ29tYm8gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKG1haW5Db21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBvdXRwdXREaXJDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBQYWNrYWdlIE5hbWU6Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFja2FnZU5hbWVMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRleHQgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhY2thZ2VOYW1lVGV4dChtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHBhY2thZ2VOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZVRleHQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEpEVFV0aWxzLnZhbGlkYXRlUGFja2FnZU5hbWUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeQotICAgICAgICAuY3JlYXRlTmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24obWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBleHBhbmROYW1lc3BhY2VDb21wb3NpdGUobmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlciA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gU2VydmljZSBOYW1lOgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlcnZpY2VOYW1lTGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgc2VydmljZU5hbWVDb21ibyA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlU2VydmljZU5hbWVDb21ibyhtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgc2VydmljZU5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMYWJlbCBiaW5kaW5nRmlsZXNMYWJlbCA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQmluZGluZ0ZpbGVzTGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gMzsKLSAgICAgICAgYmluZGluZ0ZpbGVzTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgYmluZGluZ0ZpbGVzTGlzdCA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQmluZGluZ0ZpbGVzTGlzdChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDM7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xpc3Quc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIGFkZEJpbmRpbmdGaWxlQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBZGRCaW5kaW5nRmlsZUJ1dHRvbihtYWluQ29tcG9zaXRlLCBtb2RlbCwKLSAgICAgICAgICAgICAgICBiaW5kaW5nRmlsZXNMaXN0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBhZGRCaW5kaW5nRmlsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBCdXR0b24gcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uKG1haW5Db21wb3NpdGUsCi0gICAgICAgICAgICAgICAgbW9kZWwsIGJpbmRpbmdGaWxlc0xpc3QpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIC8qCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWE1MQ2F0YWxvZ0xhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIFRleHQgeG1sQ2F0YWxvZ1RleHQgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dUZXh0KG1haW5Db21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHhtbENhdGFsb2dUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWE1MQ2F0YWxvZ0Jyb3dzZUJ1dHRvbihtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgICovCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHBhbmROYW1lc3BhY2VDb21wb3NpdGUoYm9vbGVhbiBleHBhbmQpIHsKLSAgICAgICAgaWYgKGV4cGFuZCkgewotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICAgICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDc7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5wYWNrKCk7Ci0KLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUgPSBnZXROYW1lc3BhY2VNYXBwaW5nQ29tcG9zaXRlKG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBQb2ludCBncm91cFNpemUgPSBuYW1lc3BhY2VDb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0ID0gZ3JvdXBTaXplLnk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgUG9pbnQgc2hlbGxTaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIHNoZWxsLnNldFNpemUoc2hlbGxTaXplLngsIHNoZWxsU2l6ZS55ICsgbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5sYXlvdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5wYWNrKCk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUgPSBudWxsOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5sYXlvdXQoKTsKLSAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgICAgICAgICAgICAgIFBvaW50IHNoZWxsU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBzaGVsbC5zZXRTaXplKHNoZWxsU2l6ZS54LCBzaGVsbFNpemUueSAtIG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBnZXROYW1lc3BhY2VNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBUYWJsZSBwYWNrYWdlTmFtZVRhYmxlID0gY3JlYXRlTmFtZXNwYWNlTWFwcGluZ1RhYmxlKG5hbWVzcGFjZUNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA2OwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHJldHVybiBuYW1lc3BhY2VDb21wb3NpdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUYWJsZSBjcmVhdGVOYW1lc3BhY2VNYXBwaW5nVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULkNIRUNLIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUgotICAgICAgICAgICAgICAgIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotICAgICAgICBUYWJsZSBwYWNrYWdlTmFtZVRhYmxlID0gcGFja2FnZU5hbWVUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVdTRExOYW1lc3BhY2VWaWV3ZXJDb2x1bW4ocGFja2FnZU5hbWVUYWJsZVZpZXdlcik7Ci0KLSAgICAgICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMTAwLCAxMDAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWNrYWdlTmFtZUNvbHVtbigKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLCBtb2RlbCk7Ci0KLSAgICAgICAgVGV4dENlbGxFZGl0b3IgdGV4dENlbGxFZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IocGFja2FnZU5hbWVUYWJsZVZpZXdlci5nZXRUYWJsZSgpKTsKLSAgICAgICAgdGV4dENlbGxFZGl0b3IuYWRkTGlzdGVuZXIoIG5ldyBJQ2VsbEVkaXRvckxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBlZGl0b3JWYWx1ZUNoYW5nZWQoYm9vbGVhbiBvbGRWYWxpZFN0YXRlLCBib29sZWFuIG5ld1ZhbGlkU3RhdGUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2FuY2VsRWRpdG9yKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseUVkaXRvclZhbHVlKCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0ZXh0Q2VsbEVkaXRvci5zZXRWYWxpZGF0b3IobmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSkRUVXRpbHMudmFsaWRhdGVQYWNrYWdlTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBwYWNrYWdlTmFtZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBQYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0KHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIsCi0gICAgICAgICAgICAgICAgdGV4dENlbGxFZGl0b3IsIG1vZGVsKSk7Ci0KLSAgICAgICAgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlci5zZXRJbnB1dChtb2RlbC5nZXRXc2RsRGVmaW5pdGlvbigpKTsKLQotICAgICAgICBUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gcGFja2FnZU5hbWVUYWJsZS5nZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZUl0ZW1zW2ldOwotICAgICAgICAgICAgaWYgKG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLmNvbnRhaW5zS2V5KHRhYmxlSXRlbS5nZXRUZXh0KDApKSkgewotICAgICAgICAgICAgICAgIHRhYmxlSXRlbS5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZVRhYmxlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDb25maWdXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MDBiYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yOwotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3Igd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvcjsKLQotICAgIHByaXZhdGUgV1NETDJKYXZhQ29uZmlnV2lkZ2V0IHdzZGwySmF2YUNvbmZpZ1dpZGdldCA9IG5ldyBXU0RMMkphdmFDb25maWdXaWRnZXQoKTsKLSAgICBwcml2YXRlIFdTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0IHdzZGwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0ID0gbmV3IFdTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0KCk7Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIHsKLSAgICAgICAgaWYgKHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yID09IG51bGwgfHwgd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLSAgICAgICAgaWYgKHdpZGdldENvbnRyaWJ1dG9yID09IHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiV1NETDJKYXZhRGF0YU1vZGVsIiwgV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHdzZGwySmF2YUNvbmZpZ1dpZGdldC5zZXRXU0RMMkphdmFEYXRhTW9kZWwobW9kZWwpOwotICAgICAgICB3c2RsMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldC5zZXRXU0RMMkphdmFEYXRhTW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyB3c2RsMkphdmFQYWdlVGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXXtjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKX0pOwotICAgICAgICB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZSh3c2RsMkphdmFQYWdlVGl0bGUpOwotICAgICAgICB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvcgotICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9QQUdFX0RFU0NSSVBUSU9OLAotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkpKTsKLSAgICAgICAgd3NkbDJKYXZhV2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB3c2RsMkphdmFEZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIFN0cmluZyB3c2RsMkphdmFEZWZhdWx0c1BhZ2VUaXRsZSA9IENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfREVGQVVMVFNfUEFHRV9USVRMRSwgbmV3IE9iamVjdFtdewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSwgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKX0pOwotICAgICAgICB3c2RsMkphdmFEZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yLnNldFRpdGxlKHdzZGwySmF2YURlZmF1bHRzUGFnZVRpdGxlKTsKLSAgICAgICAgd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvcgotICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvci5zZXRGYWN0b3J5KG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB3c2RsMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhRGVmYXVsdHNDb25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2JlYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhRGVmYXVsdHNDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLldTREwySmF2YVdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhRGVmYXVsdHNDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHVibGljIFdTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIHdzZGwyamF2YUdyb3VwID0gbmV3IEdyb3VwKG1haW5Db21wb3NpdGUsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRUZXh0KENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGwyamF2YWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXQod3NkbDJqYXZhbGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVEZWZhdWx0VmFsdWVzQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQcm9jZXNzU09BUEhlYWRlcnNCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVFeGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLQotICAgICAgICBpZiAoQ1hGTW9kZWxVdGlscy5pc0F1dG9OYW1lUmVzb2x1dGlvblBlcm1pdHRlZCgpKSB7Ci0gICAgICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGVsLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOb0FkZHJlc3NCaW5kaW5nQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBHcm91cCB4amNBcmdHcm91cCA9IG5ldyBHcm91cChtYWluQ29tcG9zaXRlLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0VGV4dChDWEZDcmVhdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19BUkdfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IHhqY0FyZ0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXQoeGpjQXJnTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFRhYmxlIHhqY0FyZ3NUYWJsZSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDQXJnVGFibGUoeGpjQXJnR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA2OwotICAgICAgICB4amNBcmdzVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNEZWZhdWx0VmFsdWVzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0xvY2F0b3JUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDU3luY01ldGhvZHNUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDTWFya0dlbmVyYXRlZFRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbldpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3YzA0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5TZXJ2ZXJXaXphcmRXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyBzdG9wIGdhcCB3b3JrYXJvdW5kIGZvciBidWdzIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDMyODYiPiMyNDMyODY8L2E+Ci0gKiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzI5MCI+IzI0MzI5MDwvYT4KLSAqIDxwPgotICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIDxjb2RlPldTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kPC9jb2RlPgotICogCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbldpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgewotCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLQkJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJbml0aWFsUHJvamVjdCIsICAvLyROT04tTkxTLTEkCi0JCQkJV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MpOwotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCAgLy8kTk9OLU5MUy0xJAotCSAgICAJCVdTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiUHJvamVjdCIsIFdTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2MDRiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuQ1hGRGVwbG95Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuQ3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KQVhXU0Fubm90YXRlSmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NTZWxlY3RTRUlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YURlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQ1hGV2ViU2VydmljZSBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZSB7Ci0KLSAgICBwdWJsaWMgQ1hGV2ViU2VydmljZShXZWJTZXJ2aWNlSW5mbyBpbmZvKSB7Ci0gICAgICAgIHN1cGVyKGluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYXNzZW1ibGUoSUVudmlyb25tZW50IGVudmlyb25tZW50LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsZWN0aW9uLAotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRlcGxveShJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sCi0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGV2ZWxvcChJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sCi0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIFZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgICBFY2xpcHNlRW52aXJvbm1lbnQgZWNsaXBzZUVudmlyb25tZW50ID0gKEVjbGlwc2VFbnZpcm9ubWVudCkgZW52aXJvbm1lbnQ7Ci0gICAgICAgIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKGVjbGlwc2VFbnZpcm9ubWVudC5nZXRDb21tYW5kTWFuYWdlcigpLmdldE1hcHBpbmdSZWdpc3RyeSgpKTsKLQotICAgICAgICBpZiAoY3R4LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVApIHsKLSAgICAgICAgICAgIEphdmEyV1NEYXRhTW9kZWwgamF2YTJXU0RhdGFNb2RlbCA9IENYRkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmEyV1NEYXRhTW9kZWwoKTsKLSAgICAgICAgICAgIGphdmEyV1NEYXRhTW9kZWwuc2V0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgamF2YTJXU0RhdGFNb2RlbC5zZXRKYXZhU3RhcnRpbmdQb2ludCh0aGlzLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0SW1wbFVSTCgpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgSmF2YTJXU1ZhbGlkYXRlSW5wdXRDb21tYW5kKGphdmEyV1NEYXRhTW9kZWwpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgQ3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3JDb21tYW5kKHByb2plY3ROYW1lKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZChqYXZhMldTRGF0YU1vZGVsKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IEphdmEyV1NTZWxlY3RTRUlDb21tYW5kKGphdmEyV1NEYXRhTW9kZWwpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kKGphdmEyV1NEYXRhTW9kZWwpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgSmF2YTJXU0NvbW1hbmQoamF2YTJXU0RhdGFNb2RlbCkpOwotICAgICAgICB9IGVsc2UgaWYgKGN0eC5nZXRTY2VuYXJpbygpLmdldFZhbHVlKCkgPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pIHsKLSAgICAgICAgICAgIFdTREwySmF2YURhdGFNb2RlbCB3c2RsMkphdmFEYXRhTW9kZWwgPSBDWEZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMMkphdmFEYXRhTW9kZWwoKTsKLSAgICAgICAgICAgIHdzZGwySmF2YURhdGFNb2RlbC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IFdTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kKHdzZGwySmF2YURhdGFNb2RlbCkpOwotICAgICAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBDcmVhdGVEZXBsb3ltZW50RGVzY3JpcHRvckNvbW1hbmQocHJvamVjdE5hbWUpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQod3NkbDJKYXZhRGF0YU1vZGVsLCBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0V2ViU2VydmljZUluZm8oKS5nZXRXc2RsVVJMKCkpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgV1NETDJKYXZhQ29tbWFuZCh3c2RsMkphdmFEYXRhTW9kZWwsIHRoaXMpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeShjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YTJXU0NvbW1hbmQuY2xhc3MsICJDWEZEYXRhTW9kZWwiLCBDWEZEZXBsb3lDb21tYW5kLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFDb21tYW5kLmNsYXNzLCAiQ1hGRGF0YU1vZGVsIiwgQ1hGRGVwbG95Q29tbWFuZC5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ1hGRGVwbG95Q29tbWFuZC5jbGFzcywgIkNsaWVudENvbXBvbmVudFR5cGUiLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoSUVudmlyb25tZW50IGVudmlyb25tZW50LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsZWN0aW9uLAotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IHJ1bihJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sCi0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIFZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBDWEZEZXBsb3lDb21tYW5kKHByb2plY3ROYW1lLCB0aGlzKSk7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlSW5mbyBnZXRXZWJTZXJ2aWNlSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFdlYlNlcnZpY2VJbmZvKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZVJ1bnRpbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2VSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OGM2ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZVJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud3NydC5DWEZXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LkFic3RyYWN0V2ViU2VydmljZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUNsaWVudEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUluZm87Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQ1hGV2ViU2VydmljZVJ1bnRpbWUgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDWEZXZWJTZXJ2aWNlKGluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJV2ViU2VydmljZUNsaWVudCBnZXRXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm8pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDWEZXZWJTZXJ2aWNlQ2xpZW50KGluZm8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjFkMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwMzQxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2FkZDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgTm92IDA3IDIzOjU4OjU1IEVTVCAyMDA4Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1OGZjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuZGlhbG9nczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkudmlld2Vyczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA1LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMjA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDEuNS4wKSIKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTY5YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2N2M0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvaWNvbnMvb2JqMTYvbGlicmFyeV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL29iajE2L2xpYnJhcnlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1NWUzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvaWNvbnMvb2JqMTYvbGlicmFyeV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL3dpemJhbi9saWJyYXJ5X3dpei5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvaWNvbnMvd2l6YmFuL2xpYnJhcnlfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1ZGMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvaWNvbnMvd2l6YmFuL2xpYnJhcnlfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyMzA5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1DWEYgV2ViIFNlcnZpY2VzIFVJCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1QUkVGRVJFTkNFX0NBVEVHT1JZX0NYRl9SVU5USU1FPUNYRiAyLnggUHJlZmVyZW5jZXMKLVBST1BFUlRJRVNfQ0FURUdPUllfQ1hGX1JVTlRJTUU9Q1hGIDIueCBTZXR0aW5ncwotCi1DWEZfUlVOVElNRV9OQU1FPUNYRiBSdW50aW1lCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmIxOTRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnByZWZlcmVuY2VzLkNYRlJ1bnRpbWVQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UiCi0gICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9DWEZfUlVOVElNRSI+Ci0gICAgICA8L3BhZ2U+IAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICBuYW1lPSIlUFJPUEVSVElFU19DQVRFR09SWV9DWEZfUlVOVElNRSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnByb3BlcnRpZXMuQ1hGUHJvcGVydHlQYWdlIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYucHJvcGVydHlQYWdlcy5DWEZQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICAgPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJjeGYuY29yZSIgLz4KLSAgICAgICAgICAgIDwvYWRhcHQ+ICAgICAgICAgCi0gICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+IC0tPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXMiPgotICAgICAgPHdpemFyZC1wYWdlcyBhY3Rpb249ImN4Zi5jb3JlLmluc3RhbGwiPgotICAgICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHMuQ1hGRmFjZXRJbnN0YWxsV2l6YXJkUGFnZSI+Ci0gICAgICAgICA8L3BhZ2U+Ci0gICAgICA8L3dpemFyZC1wYWdlcz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQudWkuY2xhc3NwYXRoQ29udGFpbmVyUGFnZSI+Ci0gICAgICA8Y2xhc3NwYXRoQ29udGFpbmVyUGFnZQotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2l6YXJkcy5DWEZDbGFzc3BhdGhDb250YWluZXJQYWdlIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS5DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiIKLSAgICAgICAgIG5hbWU9IiVDWEZfUlVOVElNRV9OQU1FIj4KLSAgICAgIDwvY2xhc3NwYXRoQ29udGFpbmVyUGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDk2NDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDWEZVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSW1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfSE9NRV9UQUJfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX0hPTUVfRElSX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX05PVF9TRVQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0FERF9CVVRUT05fTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VESVRfQlVUVE9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SRU1PVkVfQlVUVE9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9CUk9XU0VfQlVUVE9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9DWEZfVkVSU0lPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX1RZUEVfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfREVTQ1JJUFRJT05fTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1ZFUlNJT05fQ09MVU1OX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0xPQ0FUSU9OX0NPTFVNTl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9UWVBFX0NPTFVNTl9OQU1FOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VOVEVSX1RZUEVfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfSU5WQUxJRF9UWVBFX05BTUU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUFJPUEVSVFlfUEFHRV9SVU5USU1FX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9DT05GSUdVUkVfSU5TVEFMTEVEX1JVTlRJTUVTX0xBQkVMOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX0lOU1RBTExfV0laQVJEX1BBR0VfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX0lOU1RBTExfV0laQVJEX0FERF9XSU5ET1dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX0lOU1RBTExfV0laQVJEX0VESVRfV0lORE9XX1RJVExFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX0ZBQ0VUX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX0ZBQ0VUX0lOU1RBTExfV0laQVJEX1BBR0VfREVTQ1JJUFRJT047Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1BSRUZFUkVOQ0VTX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTRExfUFJFRkVSRU5DRVNfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU0RMX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUFJFRkVSRU5DRVNfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTUFJJTkdfQ09ORklHX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfTElOSzsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9ERUZBVUxUX0ZST05URU5EX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9ERUZBVUxUX0RBVEFCSU5ESU5HX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU0RMX0dST1VQX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTl9DTElFTlRfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5fU0VSVkVSX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX0lNUExFTUVOVEFUSU9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX1dSQVBQRVJfRkFVTFRfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5fV1NETF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0RFRkFVTFRfU09BUEJJTkRJTkdfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5fWFNEX0lNUE9SVFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX0lOVkFMSURfVkVSU0lPTl9GT1JNQVQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1ZFUlNJT05fTk9UX1NQRUNJRklFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTUFJJTkdfQ09ORklHX0dST1VQX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNQUklOR19DT05GSUdfVVNFX0NYRl9TRVJWTEVUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNQUklOR19DT05GSUdfVVNFX0NYRl9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUFJPQ0VTU19TT0FQX0hFQURFUlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9NQVBQSU5HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9VU0VfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfV1NETF9WRVJTSU9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9VU0VfREVGQVVMVF9WQUxVRVM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19BTk5PVEFUSU9OU19HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19BTk5PVEFUSU9OU19HUk9VUF9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0dFTkVSQVRFX1dFQl9NRVRIT0Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfR0VORVJBVEVfV0VCX1BBUkFNOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0FOTk9UQVRJT05TX1BST0NFU1NJTkdfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19FTkFCTEVfQU5OT1RBVElPTl9QUk9DRVNTSU5HX1RPT0xUSVA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NPQVAxMl9CSU5ESU5HX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19DUkVBVEVfWFNEX0lNUE9SVFNfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0RBVEFCSU5ESU5HX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19GUk9OVEVORF9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VORVJBVEVfV1NETF9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VORVJBVEVfV1JBUFBFUkJFQU5fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX0NMSUVOVF9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VORVJBVEVfU0VSVkVSX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5FUkFURV9BTlRfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0JFQU5TX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19UQVJHRVRfTkFNRVNQQUNFX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRVJWSUNFX05BTUVfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1BPUlRfTkFNRV9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfQUREUkVTU19UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19XU0RMX0ZJTEVfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX09VVFBVVF9GSUxFX1RPT0xUSVA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1VTRV9TRUlfQlVUVE9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfVVNFX1NFSV9JTkZPX0xBQkVMOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0JST1dTRV9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0VYVFJBQ1RfU0VJOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRVhUUkFDVF9TRUlfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19FWFRSQUNUX1NFSV9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRVhUUkFDVF9NRU1CRVJTX0xBQkVMOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfQUxMX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0RFU0VMRUNUX0FMTF9CVVRUT047Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9JTVBMRU1FTlRBVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9JTVBMRU1FTlRBVElPTl9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0ZST05URU5EX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0RBVEFCSU5ESU5HX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1dTRExfVkVSU0lPTl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9HRU5FUkFURV9JTVBMRU1FTlRBVElPTl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9HRU5FUkFURV9DTElFTlRfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR0VORVJBVEVfU0VSVkVSX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0RFRkFVTFRfVkFMVUVTX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0VYQ0xVREVfTkFNRVNQQUNFX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BST0NFU1NfU09BUF9IRUFERVJTX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0RFRkFVTFRfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfRVhDTFVERV9OQU1FU1BBQ0VfTE9BRElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9XU0RMX0xPQ0FUSU9OX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX05PX0FERFJFU1NfQklORElORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfTk9fQUREUkVTU19CSU5ESU5HX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0FVVE9fTkFNRV9SRVNPTFVUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9BVVRPX05BTUVfUkVTT0xVVElPTl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YTUxfQ0FUQUxPR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfQVJHU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfQVJHX0dST1VQX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfQVJHX0NPTFVNTl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfREVTQ1JJUFRJT05fQ09MVU1OX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19ERUZBVUxUX1ZBTFVFUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX1RPU1RSSU5HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfVE9TVFJJTkdfTVVMVElMSU5FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfVE9TVFJJTkdfU0lNUExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfTE9DQVRPUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX1NZTkNfTUVUSE9EUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX01BUktfR0VORVJBVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfRVBJU09ERV9GSUxFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfU0VMRUNUSU5fRElBTE9HX0JST1dTRV9XT1JLU1BBQ0VfQlVUVE9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfRklMRV9TWVNURU1fQlVUVE9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfRklMRV9OT1RfRk9VTkRfRVJST1I7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfT1VUUFVUX0RJUkVDVE9SWTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfT1VUUFVUX0RJUkVDVE9SWV9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BBQ0tBR0VfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFDS0FHRV9OQU1FX1RPT0xUSVA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFDS0FHRV9OQU1FX09QVElPTkFMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QQUNLQUdFX05BTUVfT1BUSU9OQUxfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9XU0RMX05BTUVTUEFDRV9DT0xVTU5fSEVBREVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QQUNLQUdFX05BTUVfQ09MVU1OX0hFQURFUjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9TRVJWSUNFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1NFUlZJQ0VfTkFNRV9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRVM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfTkFNRV9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9CSU5ESU5HX0ZJTEVTX0FERDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQklORElOR19GSUxFU19SRU1PVkU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19NRVNTQUdFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9CSU5ESU5HX0ZJTEVfRElBTE9HX0ZJTFRFUl9OQU1FOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hNTF9DQVRMT0c7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hNTF9DQVRMT0dfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWE1MX0NBVExPR19CUk9XU0U7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ1hGVUlNZXNzYWdlcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZVSU1lc3NhZ2VzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL0NYRlVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTIyOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL0NYRlVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1hGVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ1hGVUlQbHVnaW4gcGx1Z2luOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENYRlVJUGx1Z2luKCkgewotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENYRlVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBDWEZVSVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBDWEZVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBDWEZVSVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsIAotICAgICAgICAgICAgZXhjZXB0aW9uLnRvU3RyaW5nKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSW1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUltZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGYzMjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSW1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNDWEYgUHJlZmVyZW5jZSBQYWdlcwotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfSE9NRV9UQUJfTkFNRT0mQ1hGIFJ1bnRpbWUKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX1RPT0xUSVA9QnJvd3NlIGFuZCBzZWxlY3QgQ1hGIEJpbmFyeSBkaXN0cmlidXRpb24gZm9sZGVyCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX0hPTUVfRElSX0xBQkVMPUNYRiAmaG9tZToKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX05PVF9TRVQ9TWlzc2luZyBDWEYgamFyOiBQbGVhc2Ugc2VsZWN0IHRoZSBDWEYgaG9tZSBkaXJlY3RvcnkuCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQUREX0JVVFRPTl9MQUJFTD0mQWRkLi4uCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfRURJVF9CVVRUT05fTEFCRUw9RSZkaXQuLi4KLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SRU1PVkVfQlVUVE9OX0xBQkVMPSZSZW1vdmUKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9CUk9XU0VfQlVUVE9OX0xBQkVMPSZCcm93c2UuLi4KLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9DWEZfVkVSU0lPTl9MQUJFTD0mVmVyc2lvbjoKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9DWEZfVFlQRV9MQUJFTD0mVHlwZToKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI9RXgmcG9ydCBydW50aW1lIGxpYnJhcmllcyB0byBXRUItSU5GL2xpYiBhdCBkZXBsb3ltZW50IHRpbWUKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9ERVNDUklQVElPTl9MQUJFTD1BZGQsIHJlbW92ZSBvciBlZGl0IENYRiBydW50aW1lcy4gQnkgZGVmYXVsdCwgdGhlIGNoZWNrZWQgQ1hGIHJ1bnRpbWUgaXMgYWRkZWQgdG8gdGhlIGJ1aWxkIHBhdGggb2YgYSBwcm9qZWN0IHdoZW4gaW5zdGFsbGluZyB0aGUgQ1hGIGZhY2V0LgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1ZFUlNJT05fQ09MVU1OX05BTUU9VmVyc2lvbgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0xPQ0FUSU9OX0NPTFVNTl9OQU1FPUxvY2F0aW9uCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfVFlQRV9DT0xVTU5fTkFNRT1UeXBlCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfRU5URVJfVFlQRV9OQU1FPUVudGVyIHR5cGUgbmFtZQotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0lOVkFMSURfVFlQRV9OQU1FPUludmFsaWQgdHlwZSBuYW1lOiB7MH0KLUNYRl9QUk9QRVJUWV9QQUdFX1JVTlRJTUVfTEFCRUw9QyZYRiBydW50aW1lOgotQ1hGX0NPTkZJR1VSRV9JTlNUQUxMRURfUlVOVElNRVNfTEFCRUw9PEE+Q29uZmlndXJlIGluc3RhbGxlZCBydW50aW1lczwvQT4KLQotQ1hGX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEU9Q1hGIFJ1bnRpbWUKLUNYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OPVNwZWNpZnkgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSBDWEYgcnVudGltZS4KLUNYRl9JTlNUQUxMX1dJWkFSRF9BRERfV0lORE9XX1RJVExFPUFkZCBDWEYgUnVudGltZQotQ1hGX0lOU1RBTExfV0laQVJEX0VESVRfV0lORE9XX1RJVExFPUVkaXQgQ1hGIFJ1bnRpbWUKLQotQ1hGX0ZBQ0VUX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEU9Q1hGIEZhY2V0Ci1DWEZfRkFDRVRfSU5TVEFMTF9XSVpBUkRfUEFHRV9ERVNDUklQVElPTj1Db25maWd1cmUgdGhlIENYRiBmYWNldCBzZXR0aW5ncy4KLSAgICAKLUpBVkEyV1NETF9QUkVGRVJFTkNFU19UQUJfTkFNRT1KYXZhMldTREwKLUpBVkEyV1NETF9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUD1QbGVhc2Ugc2VsZWN0IHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciB0aGUgSmF2YTJXU0RMIHRvb2wKLQotSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfTkFNRT0mSmF2YTJXUwotSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUD1QbGVhc2Ugc2VsZWN0IHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciB0aGUgSmF2YTJXUyB0b29sCi0KLUFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX0xJTks9U2VlIHRoZSA8QT4nSkFYLVdTJzwvQT4gdGFiIGZvciB0aGUgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcy4KLQotQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX05BTUU9SkEmWC1XUwotQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA9UGxlYXNlIHNlbGVjdCB0aGUgSkFYLVdTIGFubm90YXRpb25zIHRoYXQgYXJlIGdlbmVyYXRlZCBieSBkZWZhdWx0IG9uIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgYmVmb3JlIGlucHV0IHRvIEphdmEyV1MKLQotV1NETDJKQVZBX1BSRUZFUkVOQ0VTX1RBQl9OQU1FPSZXU0RMMkphdmEKLVdTREwySkFWQV9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUD1QbGVhc2Ugc2VsZWN0IHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciB0aGUgV1NETDJKYXZhIHRvb2wKLQotU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfTkFNRT1FJm5kcG9pbnQgQ29uZmlnCi1TUFJJTkdfQ09ORklHX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQPVBsZWFzZSBzZWxlY3QgdGhlIGRlZmF1bHQgb3B0aW9uIGZvciBTcHJpbmcgY29uZmlndXJhdGlvbiBnZW5lcmF0aW9uCi1TUFJJTkdfQ09ORklHX1VTRV9DWEZfU0VSVkxFVD1Vc2UgQ1gmRiBTZXJ2bGV0Ci1TUFJJTkdfQ09ORklHX1VTRV9DWEZfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ9VXNlIFNwcmluZyAmQXBwbGljYXRpb24gQ29udGV4dAotCi1DWEZfREVGQVVMVF9GUk9OVEVORF9MQUJFTD1EZWZhdWx0ICZGcm9udGVuZDoKLUNYRl9ERUZBVUxUX0RBVEFCSU5ESU5HX0xBQkVMPURlZmF1bHQgJkRhdGFiaW5kbmc6Ci1KQVZBMldTX0dST1VQX0xBQkVMPUphdmEyV1MgR2VuZXJhdGlvbiBPcHRpb25zOgotSkFWQTJXU0RMX0dST1VQX0xBQkVMPUphdmEyV1NETCBHZW5lcmF0aW9uIE9wdGlvbnM6Ci1XU0RMMkpBVkFfR1JPVVBfTEFCRUw9V1NETDJKYXZhIEdlbmVyYXRpb24gT3B0aW9uczoKLUpBVkEyV1NfR0VOX0NMSUVOVF9MQUJFTD0mR2VuZXJhdGUgQ2xpZW50Ci1KQVZBMldTX0dFTl9TRVJWRVJfTEFCRUw9R2VuZXJhdGUgU2VyJnZlcgotSkFWQTJXU19HRU5fSU1QTEVNRU5UQVRJT05fTEFCRUw9R2VuZXJhdGUgJkltcGxlbWVudGF0aW9uCi1KQVZBMldTX0dFTl9XUkFQUEVSX0ZBVUxUX0xBQkVMPUdlbmVyYXRlIFdyYXBwZXIgYW5kIEZhdWx0ICZCZWFucwotSkFWQTJXU19HRU5fV1NETF9MQUJFTD1HZW5lcmF0ZSBXU0QmTAotSkFWQTJXU19ERUZBVUxUX1NPQVBCSU5ESU5HX0xBQkVMPURlZmF1bHQgUyZPQVAgQmluZGluZzoKLUpBVkEyV1NfR0VOX1hTRF9JTVBPUlRTPUdlbmVyYXRlIHNlcGFyYXRlIFhTRCBmb3IgdGhlICZ0eXBlcwotQ1hGX0lOVkFMSURfVkVSU0lPTl9GT1JNQVQ9SW52YWxpZCBWZXJzaW9uIEZvcm1hdAotQ1hGX1ZFUlNJT05fTk9UX1NQRUNJRklFRD1DWEYgdmVyc2lvbiB2YWx1ZSBub3Qgc3BlY2lmaWVkCi1TUFJJTkdfQ09ORklHX0dST1VQX0xBQkVMPUNYRiBFbmRwb2ludCBDb25maWd1cmF0aW9uIE9wdGlvbnM6Ci1XU0RMMkpBVkFfUFJPQ0VTU19TT0FQX0hFQURFUlM9RW5hYmxlICZwcm9jZXNzaW5nIG9mIGltcGxpY2l0IFNPQVAgaGVhZGVycwotV1NETDJKQVZBX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9NQVBQSU5HPUVuYWJsZSAmbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcKLVdTREwySkFWQV9VU0VfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORz1FbmFibGUgdGhlIHVzZSBvZiB0aGUgZGVmYXVsdCAmZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmcKLVdTREwySkFWQV9XU0RMX1ZFUlNJT05fTEFCRUw9V1NETCBWZXJzaW9uOgotV1NETDJKQVZBX1VTRV9ERUZBVUxUX1ZBTFVFUz1HZW5lcmF0ZSAmZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzCi0KLUpBWFdTX0FOTk9UQVRJT05TX0dST1VQX0xBQkVMPUpBWC1XUyBBbm5vdGF0aW9uIEdlbmVyYXRpb24KLUpBWFdTX0FOTk9UQVRJT05TX0dST1VQX1RPT0xUSVA9U2VsZWN0IHRoZSBhbm5vdGF0aW9ucyB3aGljaCBhcmUgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgb24gdGhlIGNsYXNzIG9yIGludGVyZmFjZSBiZWZvcmUgaW5wdXQgdG8gSmF2YTJXUwotSkFYV1NfR0VORVJBVEVfV0VCX01FVEhPRD1AV2ViJk1ldGhvZAotSkFYV1NfR0VORVJBVEVfV0VCX1BBUkFNPUBXZWImUGFyYW0KLUpBWFdTX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUj1AUmUmcXVlc3RXcmFwcGVyCi1KQVhXU19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSPUAmUmVzcG9uc2VXcmFwcGVyCi1KQVhXU19BTk5PVEFUSU9OU19QUk9DRVNTSU5HX0dST1VQX0xBQkVMPUpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3NpbmcKLUpBWFdTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkc9JkVuYWJsZSBhbm5vdGF0aW9uIHZhbGlkYXRpb24gcHJvY2Vzc2luZwotSkFYV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19UT09MVElQPVR1cm4gSkFYLVdTIGFubm90YXRpb24gcHJvY2Vzc2luZyBvbiBvciBvZmYgaW4gcHJvamVjdHMgY29uZmlndXJlZCBmb3IgezB9IHdlYiBzZXJ2aWNlcwotICAgIAotSkFWQTJXU19TT0FQMTJfQklORElOR19UT09MVElQPVNwZWNpZnkgdG8gZ2VuZXJhdGUgU09BUCAxLjIgYmluZGluZwotSkFWQTJXU19DUkVBVEVfWFNEX0lNUE9SVFNfVE9PTFRJUD0gT3V0cHV0IHNjaGVtYXMgdG8gc2VwYXJhdGUgZmlsZXMgYW5kIHVzZSBpbXBvcnRzIHRvIGxvYWQgdGhlbSBpbnN0ZWFkIG9mIGlubGluaW5nIHRoZW0gaW50byB0aGUgd3NkbAotSkFWQTJXU19EQVRBQklORElOR19UT09MVElQPSBTcGVjaWZ5IHRoZSBkYXRhIGJpbmRpbmcuIERlZmF1bHQgaXMgamF4YiBmb3IgamF4d3MgZnJvbnRlbmQKLSNKQVZBMldTX0RBVEFCSU5ESU5HX1RPT0xUSVA9IFNwZWNpZnkgdGhlIGRhdGEgYmluZGluZyAoYWVnaXMgb3IgamF4YikuIERlZmF1bHQgaXMgamF4YiBmb3IgamF4d3MgZnJvbnRlbmQsIGFuZCBhZWdpcyBmb3Igc2ltcGxlIGZyb250ZW5kCi1KQVZBMldTX0ZST05URU5EX1RPT0xUSVA9U3BlY2lmeSB0aGUgZnJvbnRlbmQgdG8gdXNlCi0jSkFWQTJXU19GUk9OVEVORF9UT09MVElQPVNwZWNpZnkgdGhlIGZyb250ZW5kIHRvIHVzZS4gamF4d3MgYW5kIHRoZSBzaW1wbGUgZnJvbnRlbmQgYXJlIHN1cHBvcnRlZAotSkFWQTJXU19HRU5FUkFURV9XU0RMX1RPT0xUSVA9U3BlY2lmeSB0byBnZW5lcmF0ZSB0aGUgV1NETCBmaWxlCi1KQVZBMldTX0dFTkVSQVRFX1dSQVBQRVJCRUFOX1RPT0xUSVA9U3BlY2lmeSB0byBnZW5lcmF0ZSB0aGUgd3JhcHBlciBhbmQgZmF1bHQgYmVhbgotSkFWQTJXU19HRU5FUkFURV9DTElFTlRfVE9PTFRJUD1HZW5lcmF0ZSBhIGNsaWVudCBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJc1xuLi4uLi5cbiBqYXZheC54bWwud3MuU2VydmljZSBzZXJ2aWNlID0gamF2YXgueG1sLndzLlNlcnZpY2UuY3JlYXRlKC4uLik7XG4uLi4gY2xpZW50ID0gc2VydmljZS5nZXRQb3J0KC4uLik7XG4KLUpBVkEyV1NfR0VORVJBVEVfU0VSVkVSX1RPT0xUSVA9R2VuZXJhdGUgYSBzZXJ2ZXIgbWFpbmxpbmUgdXNpbmcgSkFYLVdTIEFQSXNcbi4uLi4uXG4gamF2YXgueG1sLndzLkVuZHBvaW50LnB1Ymxpc2goLi4uKTtcbi4uLi4uXG4KLUpBVkEyV1NfR0VORVJBVEVfQU5UX1RPT0xUSVA9U3BlY2lmeSB0byBnZW5lcmF0ZSBhbiBBbnQgYnVpbGQueG1sIGZpbGUKLUpBVkEyV1NfQkVBTlNfVE9PTFRJUD1TcGVjaWZ5IHRoZSBwYXRobmFtZSBvZiBhIGZpbGUgZGVmaW5pbmcgYWRkaXRpb25hbCBTcHJpbmcgYmVhbnMgdG8gY3VzdG9taXNlIGRhdGEgYmluZGluZyBjb25maWd1cmF0aW9uCi1KQVZBMldTX1RBUkdFVF9OQU1FU1BBQ0VfVE9PTFRJUD1TcGVjaWZ5IHRoZSB0YXJnZXQgbmFtZXNwYWNlIHRvIHVzZSBpbiB0aGUgd3NkbAotSkFWQTJXU19TRVJWSUNFX05BTUVfVE9PTFRJUD1TcGVjaWZ5IHRoZSBzZXJ2aWNlIG5hbWUgdG8gdXNlIGluIHRoZSBnZW5lcmF0ZWQgd3NkbAotSkFWQTJXU19QT1JUX05BTUVfVE9PTFRJUD1TcGVjaWZ5IHRoZSBwb3J0IG5hbWUgdG8gdXNlIGluIHRoZSBnZW5lcmF0ZWQgd3NkbAotSkFWQTJXU19BRERSRVNTX1RPT0xUSVA9IFNwZWNpZnkgdGhlIHBvcnQgYWRkcmVzcwotCi1KQVZBMldTX1dTRExfRklMRV9OQU1FPSZXU0RMIEZpbGU6Ci1KQVZBMldTX09VVFBVVF9GSUxFX1RPT0xUSVA9U3BlY2lmeSB0aGUgb3V0cHV0IHdzZGwgZmlsZSBuYW1lCi0KLUpBVkEyV1NfVVNFX1NFSV9CVVRUT049JlVzZSBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlOgotSkFWQTJXU19VU0VfU0VJX0lORk9fTEFCRUw9KFlvdSBtYXkgd29yayBkaXJlY3RseSB3aXRoIHRoZSB7MH0gSmF2YSBjbGFzcy4gQnV0IHdvcmtpbmcgZnJvbSBhbiBpbnRlcmZhY2UgaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoLiBUd28gb3B0aW9ucyBhcmUgcHJvdmlkZWQgaGVyZS4pCi1KQVZBMldTX1NFTEVDVF9TRUk9U2VsZWN0IFNFSToKLSNKQVZBMldTX1NFTEVDVF9TRUlfTEFCRUw9U2VsZWN0IFNFSSBmcm9tICZUeXBlIEhpZXJhcmNoeToKLUpBVkEyV1NfU0VMRUNUX1NFSV9MQUJFTD1TZWxlYyZ0IGFuIFNFSToKLUpBVkEyV1NfU0VMRUNUX1NFSV9UT09MVElQPVNlbGVjdCB0aGUgSW50ZXJmYWNlIGZyb20gdGhlIFR5cGUgSGllcmFyY2h5IHRvIHVzZSBhcyB0aGUgU0VJCi1KQVZBMldTX0JST1dTRV9MQUJFTD1Ccm8md3NlLi4uCi1KQVZBMldTX0VYVFJBQ1RfU0VJPUV4dHJhY3QgU0VJOgotSkFWQTJXU19FWFRSQUNUX1NFSV9MQUJFTD0mQ3JlYXRlIGFuIFNFSToKLUpBVkEyV1NfRVhUUkFDVF9TRUlfVE9PTFRJUD1UeXBlIHRoZSBuYW1lIG9mIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSB0byBleHRyYWN0Ci1KQVZBMldTX0VYVFJBQ1RfTUVNQkVSU19MQUJFTD1NZW1iZXJzIHRvIGRlY2xhcmUgaW4gdGhlIGV4dHJhY3RlZCBTRUk6Ci1KQVZBMldTX1NFTEVDVF9BTExfQlVUVE9OPSZTZWxlY3QgQWxsLi4uCi1KQVZBMldTX0RFU0VMRUNUX0FMTF9CVVRUT049JkRlc2VsZWN0IEFsbC4uLgotSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT049U2VsZWN0ICZJbXBsZW1lbnRhdGlvbjoKLUpBVkEyV1NfU0VMRUNUX0lNUExFTUVOVEFUSU9OX1RPT0xUSVA9U2VsZWN0IHRoZSBJbXBsZW1lbnRhdGlvbgotCi1XU0RMMkpBVkFfRlJPTlRFTkRfVE9PTFRJUD1TcGVjaWZ5IHRoZSBmcm9udGVuZC4gRGVmYXVsdCBpcyBKQVhXUy4gQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkgSkFYV1MgZnJvbnRlbmQKLVdTREwySkFWQV9EQVRBQklORElOR19UT09MVElQPVNwZWNpZnkgdGhlIGRhdGFiaW5kaW5nLiBEZWZhdWx0IGlzIEpBWEIuIEN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IEpBWEIgZGF0YWJpbmRpbmcKLVdTREwySkFWQV9XU0RMX1ZFUlNJT05fVE9PTFRJUD1TcGVjaWZ5IHRoZSB3c2RsIHZlcnNpb24gLkRlZmF1bHQgaXMgV1NETDEuMS4gQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkgV1NETDEuMSB2ZXJzaW9uCi1XU0RMMkpBVkFfR0VORVJBVEVfSU1QTEVNRU5UQVRJT05fVE9PTFRJUD1HZW5lcmF0ZSBzdGFydGluZyBwb2ludCBjb2RlIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvYmplY3QKLVdTREwySkFWQV9HRU5FUkFURV9DTElFTlRfVE9PTFRJUD1HZW5lcmF0ZSB0aGUgY2xpZW50IGNvZGUKLVdTREwySkFWQV9HRU5FUkFURV9TRVJWRVJfVE9PTFRJUD1HZW5lcmF0ZSB0aGUgc2VydmVyIGNvZGUKLVdTREwySkFWQV9ERUZBVUxUX1ZBTFVFU19UT09MVElQPUdlbmVyYXRlIGRlZmF1bHQgdmFsdWVzIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgY2xpZW50LiBJZ25vcmVkIGlmIGltcGxlbWVudGF0aW9uIG9yIGNsaWVudCBpcyBub3QgYmVpbmcgZ2VuZXJhdGVkCi1XU0RMMkpBVkFfRVhDTFVERV9OQU1FU1BBQ0VfVE9PTFRJUD1JZ25vcmUgdGhlIHNwZWNpZmllZCBXU0RMIHNjaGVtYSBuYW1lc3BhY2VzIHdoZW4gZ2VuZXJhdGluZyBjb2RlCi1XU0RMMkpBVkFfUFJPQ0VTU19TT0FQX0hFQURFUlNfVE9PTFRJUD1FbmFibGVzIG9yIGRpc2FibGVzIHByb2Nlc3Npbmcgb2YgZXh0ZW5kZWQgc29hcCBoZWFkZXIgbWVzc2FnZSBiaW5kaW5nCi1XU0RMMkpBVkFfREVGQVVMVF9OQU1FU1BBQ0VfTE9BRElOR19UT09MVElQPUVuYWJsZXMgb3IgZGlzYWJsZXMgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcKLVdTREwySkFWQV9FWENMVURFX05BTUVTUEFDRV9MT0FESU5HX1RPT0xUSVA9RW5hYmxlcyBvciBkaXNhYmxlcyBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nCi1XU0RMMkpBVkFfV1NETF9MT0NBVElPTl9UT09MVElQPVNwZWNpZmllcyB0aGUgdmFsdWUgb2YgdGhlIEBXZWJTZXJ2aWNlIGFubm90YXRpb24ncyB3c2RsTG9jYXRpb24gcHJvcGVydHkKLVdTREwySkFWQV9YTUxfQ0FUQUxPR19UT09MVElQPVNwZWNpZnkgdGhlIFVSTCBvZiBhbiBYTUwgY2F0YWxvZyB0byB1c2UgZm9yIHJlc29sdmluZyBpbXBvcnRlZCBzY2hlbWFzIGFuZCBXU0RMIGRvY3VtZW50cwotV1NETDJKQVZBX05PX0FERFJFU1NfQklORElORz1Vc2UgdGhlIHswfSBwcm9wcmlldGFyeSBXUy0mQWRkcmVzc2luZyB0eXBlCi1XU0RMMkpBVkFfTk9fQUREUkVTU19CSU5ESU5HX1RPT0xUSVA9VXNlIHRoZSB7MH0gcHJvcHJpZXRhcnkgV1MtQWRkcmVzc2luZyB0eXBlIGluc3RlYWQgb2YgdGhlIEpBWC1XUyAyLjEgY29tcGxpYW50IG1hcHBpbmcKLVdTREwySkFWQV9BVVRPX05BTUVfUkVTT0xVVElPTj1FbmFibGUgQXV0byBOYW1lICZSZXNvbHV0aW9uCi1XU0RMMkpBVkFfQVVUT19OQU1FX1JFU09MVVRJT05fVE9PTFRJUD1BdXRvbWF0aWNhbGx5IHJlc29sdmUgbmFtaW5nIGNvbmZsaWN0cyB3aXRob3V0IHJlcXVpcmluZyB0aGUgdXNlIG9mIGJpbmRpbmcgY3VzdG9taXphdGlvbnMKLVdTREwySkFWQV9YSkNfQVJHU19UT09MVElQPVNwZWNpZnkgdGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIFhKQwotV1NETDJKQVZBX1hKQ19BUkdfR1JPVVBfVElUTEU9WEpDIEFyZ3VtZW50cwotV1NETDJKQVZBX1hKQ19BUkdfQ09MVU1OX05BTUU9WEpDIEFyZwotV1NETDJKQVZBX1hKQ19ERVNDUklQVElPTl9DT0xVTU5fTkFNRT1EZXNjcmlwdGlvbgotV1NETDJKQVZBX1hKQ19ERUZBVUxUX1ZBTFVFUz1Jbml0aWFsaXNlIGZpZWxkcyBtYXBwZWQgZnJvbSBlbGVtZW50cyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzCi1XU0RMMkpBVkFfWEpDX1RPU1RSSU5HPUFjdGl2YXRlIHBsdWdpbiB0byBhZGQgYSB0b1N0cmluZygpIG1ldGhvZCB0byBnZW5lcmF0ZWQgY2xhc3NlcwotV1NETDJKQVZBX1hKQ19UT1NUUklOR19NVUxUSUxJTkU9SGF2ZSB0b1N0cmluZyBwcm9kdWNlIG11bHRpIGxpbmUgb3V0cHV0Ci1XU0RMMkpBVkFfWEpDX1RPU1RSSU5HX1NJTVBMRT1IYXZlIHRvU3RyaW5nIHByb2R1Y2Ugc2luZ2xlIGxpbmUgdGVyc2Ugb3V0cHV0Ci1XU0RMMkpBVkFfWEpDX0xPQ0FUT1I9RW5hYmxlIHNvdXJjZSBsb2NhdGlvbiBzdXBwb3J0IGZvciBnZW5lcmF0ZWQgY29kZQotV1NETDJKQVZBX1hKQ19TWU5DX01FVEhPRFM9R2VuZXJhdGUgYWNjZXNzb3IgbWV0aG9kcyB3aXRoIHRoZSAnc3luY2hyb25pemVkJyBrZXl3b3JkCi1XU0RMMkpBVkFfWEpDX01BUktfR0VORVJBVEVEPUFkZCBAR2VuZXJhdGVkIGFubm90YXRpb25zIHRvIHRoZSBnZW5lcmF0ZWQgY29kZQotI01hcmsgdGhlIGdlbmVyYXRlZCBjb2RlIGFzIEBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZAotV1NETDJKQVZBX1hKQ19FUElTT0RFX0ZJTEU9IEdlbmVyYXRlIHRoZSBlcGlzb2RlIGZpbGUgZm9yIHNlcGFyYXRlIGNvbXBpbGF0aW9uCi0jUmVzb3VyY2UgU2VsZWN0aW9uIERpYWxvZwotUkVTT1VSQ0VfU0VMRUNUSU5fRElBTE9HX0JST1dTRV9XT1JLU1BBQ0VfQlVUVE9OPUJyb3dzZSAmV29ya3NwYWNlLi4uCi1SRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfU1lTVEVNX0JVVFRPTj1Ccm93c2UgJkZpbGUgU3lzdGVtLi4uCi1SRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfTk9UX0ZPVU5EX0VSUk9SPUZpbGUgTm90IEZvdW5kCi0KLVdTREwySkFWQV9PVVRQVVRfRElSRUNUT1JZPSZPdXRwdXQgRGlyZWN0b3J5OgotV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUllfVE9PTFRJUD1TcGVjaWZ5IHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIGNvZGUgZmlsZXMgYXJlIHdyaXR0ZW4KLQotV1NETDJKQVZBX1BBQ0tBR0VfTkFNRT0mUGFja2FnZSBOYW1lOgotV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9UT09MVElQPVRoZSBqYXZhIHBhY2thZ2UgbmFtZSB0byB1c2UgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZQotCi1XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX09QVElPTkFMPVNwZWNpZnkgJldTREwgTmFtZXBzYWNlIHRvIFBhY2thZ2UgTmFtZSBNYXBwaW5ncwotV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9PUFRJT05BTF9UT09MVElQPU9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgd3NkbCBuYW1lc3BhY2UgbWFwcGluZyB0byBhIHBhcnRpY3VsYXIgamF2YSBwYWNrYWdlIG5hbWUKLQotV1NETDJKQVZBX1dTRExfTkFNRVNQQUNFX0NPTFVNTl9IRUFERVI9V1NETCBOYW1lc3BhY2UKLVdTREwySkFWQV9QQUNLQUdFX05BTUVfQ09MVU1OX0hFQURFUj1QYWNrYWdlIE5hbWUKLQotV1NETDJKQVZBX1NFUlZJQ0VfTkFNRT0mU2VydmljZSBOYW1lOgotV1NETDJKQVZBX1NFUlZJQ0VfTkFNRV9UT09MVElQPVNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIFdTREwgc2VydmljZSBmb3Igd2hpY2ggY29kZSBpcyB0byBiZSBnZW5lcmF0ZWQuIFRoZSBkZWZhdWx0IGlzIHRvIGdlbmVyYXRlIGNvZGUgZm9yIGV2ZXJ5IHNlcnZpY2UgaW4gdGhlIFdTREwgZG9jdW1lbnQKLQotV1NETDJKQVZBX0JJTkRJTkdfRklMRVM9JkJpbmRpbmcgRmlsZXM6Ci1XU0RMMkpBVkFfQklORElOR19OQU1FX1RPT0xUSVA9U3BlY2lmeSB6ZXJvLCBvciBtb3JlLCBKQVhXUyBvciBKQVhCIGJpbmRpbmcgZmlsZXMKLVdTREwySkFWQV9CSU5ESU5HX0ZJTEVTX0FERD0mQWRkLi4uCi1XU0RMMkpBVkFfQklORElOR19GSUxFU19SRU1PVkU9JlJlbW92ZS4uLgotCi1XU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19USVRMRT1Ccm93c2UgZm9yIEJpbmRpbmcgRmlsZQotV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfTUVTU0FHRT1CaW5kaW5nIEZpbGU6Ci1XU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19GSUxURVJfTkFNRT1KQVhXUyBvciBKQVhCIEJpbmRpbmcgRmlsZXMgKCoueG1sKQotCi1XU0RMMkpBVkFfWE1MX0NBVExPRz1YTUwgQ2F0YWxvZzoKLVdTREwySkFWQV9YTUxfQ0FUTE9HX1RPT0xUSVA9U3BlY2lmeSBjYXRhbG9nIGZpbGUgdG8gbWFwIHRoZSBpbXBvcnRlZCB3c2RsL3NjaGVtYQotV1NETDJKQVZBX1hNTF9DQVRMT0dfQlJPV1NFPUJyb3dzZS4uLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL2RpYWxvZ3MvUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9kaWFsb2dzL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZWZjZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL2RpYWxvZ3MvUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uU3RhdHVzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIEEgPGNvZGU+U2VsZWN0aW9uU3RhdHVzRGlhbG9nPC9jb2RlPiB3aGljaCBhbGxvd3MgdGhlIHNlbGVjdGlvbiBvZiBmaWxlcwotICogd2l0aCBhIHNwZWNpZmljIGV4dGVuc2lvbiBmcm9tIHRoZSB3b3Jrc3BhY2Ugb3IgZmlsZSBzeXN0ZW0uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uU3RhdHVzRGlhbG9nIHsKLSAgICBwcml2YXRlIElTdGF0dXMgT0tfRklMRV9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIElTdGF0dXMgRVJST1JfRklMRV9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuUkVTT1VSQ0VfU0VMRUNUSU5fRElBTE9HX0JST1dTRV9GSUxFX05PVF9GT1VORF9FUlJPUik7Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgVkFMSURBVEVfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgVGV4dCByZXNvdXJjZVRleHQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBmaWx0ZXJFeHRlbnNpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsdGVyTmFtZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+UmVzb3VyY2VTZWxlY3Rpb25EaWFsb2c8L2NvZGU+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqIEBwYXJhbSBmaWx0ZXJFeHRlbnNpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlIG5hbWUgZXh0ZW5zaW9uIHdoaWNoIHRoZSBkaWFsb2dzIHdpbGwgdXNlIHRvIGZpbHRlcgotICAgICAqICAgICAgICAgICAgZmlsZXMKLSAgICAgKiBAcGFyYW0gZmlsdGVyTmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgdGhhdCBkZXNjcmliZXMgdGhlIGZpbHRlckV4dGVuc2lvbgotICAgICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgICAqICAgICAgICAgICAgdGhlIGRpYWxvZyB0aXRsZQotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyBmaWx0ZXJFeHRlbnNpb24sIFN0cmluZyBmaWx0ZXJOYW1lLCBTdHJpbmcgZGlhbG9nVGl0bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50KTsKLQotICAgICAgICB0aGlzLmZpbHRlckV4dGVuc2lvbiA9IGZpbHRlckV4dGVuc2lvbjsKLSAgICAgICAgdGhpcy5maWx0ZXJOYW1lID0gZmlsdGVyTmFtZTsKLQotICAgICAgICBzZXRUaXRsZShkaWFsb2dUaXRsZSk7Ci0gICAgICAgIHNldFN0YXR1c0xpbmVBYm92ZUJ1dHRvbnModHJ1ZSk7Ci0gICAgICAgIGludCBzaGVsbFN0eWxlID0gZ2V0U2hlbGxTdHlsZSgpOwotICAgICAgICBzZXRTaGVsbFN0eWxlKHNoZWxsU3R5bGUgfCBTV1QuTUFYIHwgU1dULlJFU0laRSk7Ci0gICAgICAgIHVwZGF0ZVN0YXR1cyhWQUxJREFURV9TRUxFQ1RJT05fU1RBVFVTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotICAgICAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDUwMDsKLSAgICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBMYWJlbCBtZXNzYWdlTGFiZWwgPSBjcmVhdGVNZXNzYWdlQXJlYShidXR0b25Db21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBCdXR0b24gYnJvd3NlV29ya3NwYWNlID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgICAgYnJvd3NlV29ya3NwYWNlLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5SRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX1dPUktTUEFDRV9CVVRUT04pOwotICAgICAgICBicm93c2VXb3Jrc3BhY2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gY3JlYXRlV29ya3NwYWNlUmVzb3VyY2VEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCkpOwotICAgICAgICAgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFNlbGVjdGlvbkRpYWxvZy5PSykgewotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHJlc3VsdFswXTsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VUZXh0LnNldFRleHQocmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGJyb3dzZVdvcmtzcGFjZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBCdXR0b24gYnJvd3NlRmlsZVN5c3RlbSA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgIGJyb3dzZUZpbGVTeXN0ZW0uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLlJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfRklMRV9TWVNURU1fQlVUVE9OKTsKLSAgICAgICAgYnJvd3NlRmlsZVN5c3RlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIEZpbGVEaWFsb2cgZGlhbG9nID0gY3JlYXRlRmlsZVN5c3RlbVJlc291cmNlRGlhbG9nKGNvbXBvc2l0ZS5nZXRTaGVsbCgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJUGF0aCBmaWx0ZXJQYXRoID0gbmV3IFBhdGgoZGlhbG9nLmdldEZpbHRlclBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJ1aWxkRmlsZU5hbWUgPSBkaWFsb2cuZ2V0RmlsZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gZmlsdGVyUGF0aC5hcHBlbmQoYnVpbGRGaWxlTmFtZSkubWFrZUFic29sdXRlKCk7Ci0KLSAgICAgICAgICAgICAgICByZXNvdXJjZVRleHQuc2V0VGV4dChwYXRoLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYnJvd3NlRmlsZVN5c3RlbS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICByZXNvdXJjZVRleHQgPSBuZXcgVGV4dChidXR0b25Db21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgcmVzb3VyY2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZSA9IHJlc291cmNlVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChBcnJheXMuYXNMaXN0KHJlc291cmNlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhPS19GSUxFX1NUQVRVUyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKEVSUk9SX0ZJTEVfU1RBVFVTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHJlc291cmNlVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgU2VsZWN0aW9uRGlhbG9nIGNyZWF0ZVdvcmtzcGFjZVJlc291cmNlRGlhbG9nKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKHNoZWxsLAotICAgICAgICAgICAgICAgIG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0KLSAgICAgICAgd29ya3NwYWNlUmVzb3VyY2VEaWFsb2cuc2V0VGl0bGUoZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgd29ya3NwYWNlUmVzb3VyY2VEaWFsb2cuc2V0TWVzc2FnZShmaWx0ZXJOYW1lKTsKLSAgICAgICAgd29ya3NwYWNlUmVzb3VyY2VEaWFsb2cuc2V0QWxsb3dNdWx0aXBsZShmYWxzZSk7Ci0KLSAgICAgICAgd29ya3NwYWNlUmVzb3VyY2VEaWFsb2cuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmlzQWNjZXNzaWJsZSgpICYmIGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhmaWx0ZXJFeHRlbnNpb24pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QgJiYgISgoSVByb2plY3QpIGVsZW1lbnQpLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Qodmlld2VyLCBwYXJlbnRFbGVtZW50LCByZXNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZVSVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgd29ya3NwYWNlUmVzb3VyY2VEaWFsb2cuc2V0VmFsaWRhdG9yKG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGVkID0gc2VsZWN0aW9uWzBdOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgc2VsZWN0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKGZpbHRlckV4dGVuc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0tfRklMRV9TVEFUVVM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZBTElEQVRFX1NFTEVDVElPTl9TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCi0gICAgICAgIHJldHVybiB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGVEaWFsb2cgY3JlYXRlRmlsZVN5c3RlbVJlc291cmNlRGlhbG9nKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIEZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLSAgICAgICAgZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIioiICsgZmlsdGVyRXh0ZW5zaW9uIH0pOyAvLyROT04tTkxTLTEkOwotICAgICAgICBkaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHsgZmlsdGVyTmFtZSB9KTsKLSAgICAgICAgcmV0dXJuIGRpYWxvZzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVzdWx0KCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvcHJlZmVyZW5jZXMvQ1hGUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvcHJlZmVyZW5jZXMvQ1hGUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOGYzYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ByZWZlcmVuY2VzL0NYRlJ1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLkFubm90YXRpb25zQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5CbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuSmF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5KYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5TcHJpbmdDb25maWdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aXphcmRzLkNYRkluc3RhbGxXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgQ1hGUnVudGltZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotICAgIC8vICAgIHByaXZhdGUgSVN0YXR1cyBDWEZfTE9DQVRJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsIG51bGwpOwotICAgIC8vICAgIHByaXZhdGUgSVN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgLy8KLSAgICBwcml2YXRlIElTZWxlY3Rpb24gcHJldmlvdXNJbnN0YWxsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQotICAgIHByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBlZGl0QnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQotICAgIHByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjeGZJbnN0YWxsYXRpb25zOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBDWEZDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIEphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBqYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBKYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgOwotCi0gICAgcHJpdmF0ZSBDWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlIGN4ZjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBDWEYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlIGN4ZjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIEFubm90YXRpb25zQ29tcG9zaXRlIGFubm90YXRpb25zQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBTcHJpbmdDb25maWdDb21wb3NpdGUgc3ByaW5nQ29uZmlnQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBTdGFja0xheW91dCBqYXZhMldTU3RhY2tMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBTdGFja0xheW91dCB3c2RsMmphdmFTdGFja0xheW91dDsKLSAgICBwcml2YXRlIFN0YWNrTGF5b3V0IGpheHdzU3RhY2tMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBTdGFja0xheW91dCBzcHJpbmdDb25maWdTdGFja0xheW91dDsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIGphdmEyV1NQcmVmZXJuY2VzR3JvdXA7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgd3NkbDJKYXZhUHJlZmVyZW5jZXNHcm91cDsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBqYXh3c1ByZWZlcmVuY2VzR3JvdXA7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgc3ByaW5nQ29uZmlnUHJlZmVybmNlc0dyb3VwOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgamF2YTJXU0RMUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgamF2YTJXU1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgamF4d3NQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIHdzZGwySmF2YTIwUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgd3NkbDJKYXZhMjFQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIHNwcmluZ1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBqYXZhMldTQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICBwcml2YXRlIEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIHdzZGwySmF2YUJsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBqYXh3c0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBzcHJpbmdDb25maWdCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBJbWFnZSBsaWJyYXJ5SW1hZ2U7Ci0KLSAgICBwdWJsaWMgQ1hGUnVudGltZVByZWZlcmVuY2VQYWdlKCkgewotICAgICAgICBsaWJyYXJ5SW1hZ2UgPSBDWEZVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgImljb25zL29iajE2L2xpYnJhcnlfb2JqLmdpZiIpLmNyZWF0ZUltYWdlKCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLQotICAgICAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgICAgICBHcmlkTGF5b3V0IG1haW5MYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG1haW5MYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVGFiRm9sZGVyIGN4ZlByZWZlcmVuY2VUYWIgPSBuZXcgVGFiRm9sZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBjeGZQcmVmZXJlbmNlVGFiLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vQ1hGIFJ1bnRpbWUgTG9jYXRpb24KLSAgICAgICAgVGFiSXRlbSBydW50aW1lSW5zdGFsTG9jYXRpb25JdGVtID0gbmV3IFRhYkl0ZW0oY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotICAgICAgICBydW50aW1lSW5zdGFsTG9jYXRpb25JdGVtLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9IT01FX1RBQl9OQU1FKTsKLSAgICAgICAgcnVudGltZUluc3RhbExvY2F0aW9uSXRlbS5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX1RPT0xUSVApOwotCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBydW50aW1lR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLQotICAgICAgICBydW50aW1lSW5zdGFsTG9jYXRpb25JdGVtLnNldENvbnRyb2wocnVudGltZUdyb3VwKTsKLSAgICAgICAgcnVudGltZUdyb3VwLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfSE9NRV9UQUJfVE9PTFRJUCk7Ci0KLSAgICAgICAgR3JpZExheW91dCBydW50aW1lTG9hY3Rpb25sYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBydW50aW1lTG9hY3Rpb25sYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgICAgIHJ1bnRpbWVMb2FjdGlvbmxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLSAgICAgICAgcnVudGltZUdyb3VwLnNldExheW91dChydW50aW1lTG9hY3Rpb25sYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBydW50aW1lR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgcnVudGltZVRhYkRlc2NyaXB0aW9uTGFiZWwgPSBuZXcgTGFiZWwocnVudGltZUdyb3VwLCBTV1QuV1JBUCk7Ci0gICAgICAgIHJ1bnRpbWVUYWJEZXNjcmlwdGlvbkxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfREVTQ1JJUFRJT05fTEFCRUwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCi0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotICAgICAgICBydW50aW1lVGFiRGVzY3JpcHRpb25MYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBUYWJsZSBpbnN0YWxsVGFibGUgPSBuZXcgVGFibGUocnVudGltZUdyb3VwLCBTV1QuQ0hFQ0sgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSCi0gICAgICAgICAgICAgICAgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBpbnN0YWxsVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICBpbnN0YWxsVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgICBpbnN0YWxsVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgICAgICBjeGZJbnN0YWxsYXRpb25zID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIoaW5zdGFsbFRhYmxlKTsKLSAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBzZXRDaGVja2VkSW5zdGFsbChldmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldENoZWNrZWRJbnN0YWxsKG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBpbnQgbm9FbGVtZW50cyA9IHNlbGVjdGlvbi5zaXplKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vRWxlbWVudHMgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZWRpdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBUYWJsZVZpZXdlckNvbHVtbiB2ZXJzaW9uVmlld2VyQ29sdW1uID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKGN4Zkluc3RhbGxhdGlvbnMsIFNXVC5MRUZUKTsKLSAgICAgICAgdmVyc2lvblZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2x1bW5MYWJlbFByb3ZpZGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ1hGSW5zdGFsbCkgewotICAgICAgICAgICAgICAgICAgICBDWEZJbnN0YWxsIGluc3RhbGwgPSAoQ1hGSW5zdGFsbCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBpbnN0YWxsLmdldFZlcnNpb24oKS50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ1hGSW5zdGFsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGlicmFyeUltYWdlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIFRhYmxlQ29sdW1uIHZlcnNpb25Db2x1bW4gPSB2ZXJzaW9uVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICB2ZXJzaW9uQ29sdW1uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfVkVSU0lPTl9DT0xVTU5fTkFNRSk7Ci0gICAgICAgIHZlcnNpb25Db2x1bW4ucGFjaygpOwotCi0gICAgICAgIENvbHVtbldlaWdodERhdGEgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCA1MCwgdHJ1ZSk7Ci0gICAgICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uV2VpZ2h0RGF0YSk7Ci0KLSAgICAgICAgVGFibGVWaWV3ZXJDb2x1bW4gbG9jYXRpb25WaWV3ZXJDb2x1bW4gPSBuZXcgVGFibGVWaWV3ZXJDb2x1bW4oY3hmSW5zdGFsbGF0aW9ucywgU1dULkxFRlQpOwotICAgICAgICBsb2NhdGlvblZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2x1bW5MYWJlbFByb3ZpZGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ1hGSW5zdGFsbCkgewotICAgICAgICAgICAgICAgICAgICBDWEZJbnN0YWxsIGluc3RhbGwgPSAoQ1hGSW5zdGFsbCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbGwuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIGxvY2F0aW9uQ29sdW1uID0gbG9jYXRpb25WaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIGxvY2F0aW9uQ29sdW1uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfTE9DQVRJT05fQ09MVU1OX05BTUUpOwotICAgICAgICBsb2NhdGlvbkNvbHVtbi5wYWNrKCk7Ci0KLSAgICAgICAgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCAxNTAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHR5cGVWaWV3ZXJDb2x1bW4gPSBuZXcgVGFibGVWaWV3ZXJDb2x1bW4oY3hmSW5zdGFsbGF0aW9ucywgU1dULkxFRlQpOwotICAgICAgICB0eXBlVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IENvbHVtbkxhYmVsUHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDWEZJbnN0YWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRkluc3RhbGwgaW5zdGFsbCA9IChDWEZJbnN0YWxsKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFsbC5nZXRUeXBlKCkudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBUYWJsZUNvbHVtbiB0eXBlQ29sdW1uID0gdHlwZVZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgdHlwZUNvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1RZUEVfQ09MVU1OX05BTUUpOwotICAgICAgICB0eXBlQ29sdW1uLnBhY2soKTsKLQotICAgICAgICBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNTAsIDEwMCwgdHJ1ZSk7Ci0gICAgICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uV2VpZ2h0RGF0YSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA1OwotICAgICAgICBjeGZJbnN0YWxsYXRpb25zLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uPD8+KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iajEgaW5zdGFuY2VvZiBDWEZJbnN0YWxsICYmIG9iajIgaW5zdGFuY2VvZiBDWEZJbnN0YWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKENYRkluc3RhbGwpIG9iajEpLmdldFZlcnNpb24oKS50b1N0cmluZygpLnRyaW0oKS5jb21wYXJlVG8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDWEZJbnN0YWxsKSBvYmoyKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKS50cmltKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIG9iajEsIG9iajIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjeGZJbnN0YWxsYXRpb25zLnNldElucHV0KGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpLnZhbHVlcygpKTsKLQotICAgICAgICBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKHJ1bnRpbWVHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBhZGRCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9BRERfQlVUVE9OX0xBQkVMKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIENYRkluc3RhbGxXaXphcmQgaW5zdGFsbFdpemFyZCA9IG5ldyBDWEZJbnN0YWxsV2l6YXJkKCk7Ci0gICAgICAgICAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgaW5zdGFsbFdpemFyZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN4Zkluc3RhbGxhdGlvbnMucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24ocnVudGltZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGVkaXRCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FRElUX0JVVFRPTl9MQUJFTCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBlZGl0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBlZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY3hmSW5zdGFsbGF0aW9ucy5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgQ1hGSW5zdGFsbCkgewotICAgICAgICAgICAgICAgICAgICBjeGZJbnN0YWxsYXRpb25zLmdldENoZWNrZWRFbGVtZW50cygpOwotICAgICAgICAgICAgICAgICAgICAvL2ludCBzZWxlY3RlZEluc3RhbGwgPSBjeGZJbnN0YWxsYXRpb25zLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoZWNrZWRWZXJzaW9uID0gZ2V0Q2hlY2tlZFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgQ1hGSW5zdGFsbFdpemFyZCBpbnN0YWxsV2l6YXJkID0gbmV3IENYRkluc3RhbGxXaXphcmQoKENYRkluc3RhbGwpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIGluc3RhbGxXaXphcmQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN4Zkluc3RhbGxhdGlvbnMucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrZWRWZXJzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDaGVja2VkVmVyc2lvbihjaGVja2VkVmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBlZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocnVudGltZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JFTU9WRV9CVVRUT05fTEFCRUwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICByZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjeGZJbnN0YWxsYXRpb25zLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPENYRkluc3RhbGw+IGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiBpbnN0YWxsYXRpb25zID0gY29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRkluc3RhbGwgaW5zdGFsbCA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb25zLnJlbW92ZShpbnN0YWxsLmdldFZlcnNpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW5zdGFsbGF0aW9ucyhpbnN0YWxsYXRpb25zKTsKLSAgICAgICAgICAgICAgICBjeGZJbnN0YWxsYXRpb25zLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICBpZiAoY3hmSW5zdGFsbGF0aW9ucy5nZXRDaGVja2VkRWxlbWVudHMoKS5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBzZXRDaGVja2VkSW5zdGFsbChudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgTGFiZWwgcGFkZGluZ0xhYmVsID0gbmV3IExhYmVsKHJ1bnRpbWVHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgcGFkZGluZ0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbiA9IG5ldyBCdXR0b24ocnVudGltZUdyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0VGV4dCgKLSAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIpOwotICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKSk7Ci0gICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBpZiAoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9KYXZhMldTCi0gICAgICAgIFRhYkl0ZW0gamF2YTJXU1RhYkl0ZW0gPSBuZXcgVGFiSXRlbShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0gICAgICAgIGphdmEyV1NUYWJJdGVtLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1BSRUZFUkVOQ0VTX1RBQl9OQU1FKTsKLSAgICAgICAgamF2YTJXU1RhYkl0ZW0uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQKTsKLQotICAgICAgICBqYXZhMldTUHJlZmVybmNlc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgamF2YTJXU1N0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0gICAgICAgIGphdmEyV1NQcmVmZXJuY2VzR3JvdXAuc2V0TGF5b3V0KGphdmEyV1NTdGFja0xheW91dCk7Ci0KLSAgICAgICAgamF2YTJXU0RMUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGphdmEyV1NQcmVmZXJuY2VzR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBqYXZhMldTR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBqYXZhMldTRExQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXRMYXlvdXQoamF2YTJXU0dyaWRMYXlvdXQpOwotCi0gICAgICAgIGphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBKYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUoCi0gICAgICAgICAgICAgICAgamF2YTJXU0RMUHJlZmVyZW5jZXNDb21wb3NpdGUsIFNXVC5OT05FLCBjeGZQcmVmZXJlbmNlVGFiKTsKLSAgICAgICAgamF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmFkZENvbnRyb2xzKCk7Ci0KLSAgICAgICAgamF2YTJXU1ByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShqYXZhMldTUHJlZmVybmNlc0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgamF2YTJXU0RMR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBqYXZhMldTUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0TGF5b3V0KGphdmEyV1NETEdyaWRMYXlvdXQpOwotCi0gICAgICAgIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSgKLSAgICAgICAgICAgICAgICBqYXZhMldTUHJlZmVyZW5jZXNDb21wb3NpdGUsIFNXVC5OT05FLCBjeGZQcmVmZXJlbmNlVGFiKTsKLSAgICAgICAgamF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5hZGRDb250cm9scygpOwotCi0gICAgICAgIGphdmEyV1NCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKGphdmEyV1NQcmVmZXJuY2VzR3JvdXAsCi0gICAgICAgICAgICAgICAgU1dULk5PTkUpOwotCi0gICAgICAgIGphdmEyV1NUYWJJdGVtLnNldENvbnRyb2woamF2YTJXU1ByZWZlcm5jZXNHcm91cCk7Ci0KLSAgICAgICAgLy9XU0RMMkphdmEKLSAgICAgICAgVGFiSXRlbSB3c2RsMkphdmFUYWJJdGVtID0gbmV3IFRhYkl0ZW0oY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotICAgICAgICB3c2RsMkphdmFUYWJJdGVtLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUFJFRkVSRU5DRVNfVEFCX05BTUUpOwotICAgICAgICB3c2RsMkphdmFUYWJJdGVtLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQKTsKLQotICAgICAgICB3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgd3NkbDJqYXZhU3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKLSAgICAgICAgd3NkbDJKYXZhUHJlZmVyZW5jZXNHcm91cC5zZXRMYXlvdXQod3NkbDJqYXZhU3RhY2tMYXlvdXQpOwotCi0gICAgICAgIHdzZGwySmF2YTIwUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMkphdmEyMEdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgd3NkbDJKYXZhMjBQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXRMYXlvdXQod3NkbDJKYXZhMjBHcmlkTGF5b3V0KTsKLQotICAgICAgICBjeGYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENYRjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUoCi0gICAgICAgICAgICAgICAgd3NkbDJKYXZhMjBQcmVmZXJlbmNlc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBjeGYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLmFkZENvbnRyb2xzKCk7Ci0KLSAgICAgICAgd3NkbDJKYXZhMjFQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUod3NkbDJKYXZhUHJlZmVyZW5jZXNHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGwySmF2YTIxR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB3c2RsMkphdmEyMVByZWZlcmVuY2VzQ29tcG9zaXRlLnNldExheW91dCh3c2RsMkphdmEyMUdyaWRMYXlvdXQpOwotCi0gICAgICAgIGN4ZjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSgKLSAgICAgICAgICAgICAgICB3c2RsMkphdmEyMVByZWZlcmVuY2VzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGN4ZjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuYWRkQ29udHJvbHMoKTsKLQotICAgICAgICB3c2RsMkphdmFCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXAsCi0gICAgICAgICAgICAgICAgU1dULk5PTkUpOwotCi0gICAgICAgIHdzZGwySmF2YVRhYkl0ZW0uc2V0Q29udHJvbCh3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwKTsKLQotICAgICAgICAvL0pBWC1XUwotICAgICAgICBUYWJJdGVtIGFubm90YXRpb25zVGFiSXRlbSA9IG5ldyBUYWJJdGVtKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLSAgICAgICAgYW5ub3RhdGlvbnNUYWJJdGVtLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19QUkVGRVJFTkNFU19UQUJfTkFNRSk7Ci0gICAgICAgIGFubm90YXRpb25zVGFiSXRlbS5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQKTsKLQotICAgICAgICBqYXh3c1ByZWZlcmVuY2VzR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLQotICAgICAgICBqYXh3c1N0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0gICAgICAgIGpheHdzUHJlZmVyZW5jZXNHcm91cC5zZXRMYXlvdXQoamF4d3NTdGFja0xheW91dCk7Ci0KLSAgICAgICAgamF4d3NQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoamF4d3NQcmVmZXJlbmNlc0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgamF4d3NHcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIGpheHdzUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0TGF5b3V0KGpheHdzR3JpZExheW91dCk7Ci0gICAgICAgIGFubm90YXRpb25zQ29tcG9zaXRlID0gbmV3IEFubm90YXRpb25zQ29tcG9zaXRlKGpheHdzUHJlZmVyZW5jZXNDb21wb3NpdGUsICBTV1QuU0hBRE9XX0lOKTsKLQotICAgICAgICBqYXh3c0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUoamF4d3NQcmVmZXJlbmNlc0dyb3VwLAotICAgICAgICAgICAgICAgIFNXVC5OT05FKTsKLQotICAgICAgICBhbm5vdGF0aW9uc1RhYkl0ZW0uc2V0Q29udHJvbChqYXh3c1ByZWZlcmVuY2VzR3JvdXApOwotCi0gICAgICAgIC8vU3ByaW5nIENvbmZpZwotICAgICAgICBUYWJJdGVtIHNwcmluZ0NvbmZpZ1RhYkl0ZW0gPSBuZXcgVGFiSXRlbShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ1RhYkl0ZW0uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLlNQUklOR19DT05GSUdfUFJFRkVSRU5DRVNfVEFCX05BTUUpOwotICAgICAgICBzcHJpbmdDb25maWdUYWJJdGVtLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUCk7Ci0KLSAgICAgICAgc3ByaW5nQ29uZmlnUHJlZmVybmNlc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgc3ByaW5nQ29uZmlnU3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKLSAgICAgICAgc3ByaW5nQ29uZmlnUHJlZmVybmNlc0dyb3VwLnNldExheW91dChzcHJpbmdDb25maWdTdGFja0xheW91dCk7Ci0KLSAgICAgICAgc3ByaW5nUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IHNwcmluZ0dyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgc3ByaW5nUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0TGF5b3V0KHNwcmluZ0dyaWRMYXlvdXQpOwotICAgICAgICBzcHJpbmdDb25maWdDb21wb3NpdGUgPSBuZXcgU3ByaW5nQ29uZmlnQ29tcG9zaXRlKHNwcmluZ1ByZWZlcmVuY2VzQ29tcG9zaXRlLCBTV1QuU0hBRE9XX0lOKTsKLQotICAgICAgICBzcHJpbmdDb25maWdCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cCwKLSAgICAgICAgICAgICAgICBTV1QuTk9ORSk7Ci0KLSAgICAgICAgc3ByaW5nQ29uZmlnVGFiSXRlbS5zZXRDb250cm9sKHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cCk7Ci0KLSAgICAgICAgQ1hGSW5zdGFsbCBkZWZhdWx0SW5zdGFsbCA9IGdldERlZmF1bHRJbnN0YWxsKCk7Ci0gICAgICAgIGlmIChkZWZhdWx0SW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmYXVsdEluc3RhbGwpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGhhbmRsZVByZWZlcmVuY2VDb250cm9scygpOwotCi0gICAgICAgIGNvbXBvc2l0ZS5wYWNrKCk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZJbnN0YWxsIGdldERlZmF1bHRJbnN0YWxsKCkgewotICAgICAgICBDb2xsZWN0aW9uPENYRkluc3RhbGw+IHNldCA9IGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpLnZhbHVlcygpOwotICAgICAgICBJdGVyYXRvcjxDWEZJbnN0YWxsPiBzZXRJdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoc2V0SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBDWEZJbnN0YWxsIGVudHJ5ID0gc2V0SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZlcnNpb24oKS50b1N0cmluZygpLnRyaW0oKS5lcXVhbHMoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2hlY2tlZFZlcnNpb24oKSB7Ci0gICAgICAgIE9iamVjdFtdIGNoZWNrZWRFbGVtZW50cyA9IGN4Zkluc3RhbGxhdGlvbnMuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0gICAgICAgIGlmIChjaGVja2VkRWxlbWVudHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgcmV0dXJuICgoQ1hGSW5zdGFsbCkgY2hlY2tlZEVsZW1lbnRzWzBdKS5nZXRWZXJzaW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldENoZWNrZWRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0gICAgICAgIFRhYmxlSXRlbVtdIHRhYmxlSXRlbXMgPSBjeGZJbnN0YWxsYXRpb25zLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChUYWJsZUl0ZW0gaW5zdGFsbCA6IHRhYmxlSXRlbXMpIHsKLSAgICAgICAgICAgIGlmIChpbnN0YWxsLmdldFRleHQoMCkuZXF1YWxzKHZlcnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgaW5zdGFsbC5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldENoZWNrZWRJbnN0YWxsKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5lcXVhbHMocHJldmlvdXNJbnN0YWxsKSkgewotICAgICAgICAgICAgICAgIHByZXZpb3VzSW5zdGFsbCA9IHNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBpbnN0YWxsID0gKENYRkluc3RhbGwpIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGluc3RhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjeGZJbnN0YWxsYXRpb25zLnNldENoZWNrZWRFbGVtZW50cyhuZXcgT2JqZWN0W117IGluc3RhbGwgfSk7Ci0gICAgICAgICAgICAgICAgICAgIGN4Zkluc3RhbGxhdGlvbnMucmV2ZWFsKGluc3RhbGwpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldERlZmF1bHRSdW50aW1lVmVyc2lvbihpbnN0YWxsLmdldFZlcnNpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbihpbnN0YWxsLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldERlZmF1bHRSdW50aW1lVHlwZShpbnN0YWxsLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldERlZmF1bHRSdW50aW1lTG9jYXRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZVByZWZlcmVuY2VDb250cm9scygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVByZWZlcmVuY2VDb250cm9scygpIHsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpLmVxdWFscygiIikgfHwgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgamF2YTJXU1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBqYXZhMldTQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIHdzZGwyamF2YVN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSB3c2RsMkphdmFCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgamF4d3NTdGFja0xheW91dC50b3BDb250cm9sID0gamF4d3NCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgc3ByaW5nQ29uZmlnU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IHNwcmluZ0NvbmZpZ0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIGphdmEyV1NTdGFja0xheW91dC50b3BDb250cm9sID0gamF2YTJXU1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgd3NkbDJqYXZhU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IHdzZGwySmF2YTIxUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICBqYXh3c1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBqYXh3c1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgc3ByaW5nQ29uZmlnU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IHNwcmluZ1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamF2YTJXU1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBqYXZhMldTRExQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIHdzZGwyamF2YVN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSB3c2RsMkphdmEyMFByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgamF4d3NTdGFja0xheW91dC50b3BDb250cm9sID0gamF4d3NQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIHNwcmluZ0NvbmZpZ1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBzcHJpbmdQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgfQotICAgICAgICBqYXZhMldTUHJlZmVybmNlc0dyb3VwLmxheW91dCgpOwotICAgICAgICB3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwLmxheW91dCgpOwotICAgICAgICBqYXh3c1ByZWZlcmVuY2VzR3JvdXAubGF5b3V0KCk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cC5sYXlvdXQoKTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgIH0KLQotICAgIC8vICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXMoKSB7Ci0gICAgLy8gICAgICAgIC8vICAgIENYRl9MT0NBVElPTl9TVEFUVVMgPSBjaGVja1J1bnRpbWVFeGlzdChjeGZIb21lRGlyVGV4dC5nZXRUZXh0KCkpOwotICAgIC8vICAgICAgICBhcHBseVN0YXR1c1RvUGFnZShmaW5kTW9zdFNldmVyZSgpKTsKLSAgICAvLyAgICB9Ci0KLSAgICAvLyAgICBwcml2YXRlIHZvaWQgYXBwbHlTdGF0dXNUb1BhZ2UoSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAvLyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotICAgIC8vICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPiBJU3RhdHVzLk9LKSB7Ci0gICAgLy8gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgLy8gICAgICAgIH0gZWxzZSB7Ci0gICAgLy8gICAgICAgICAgICBzZXRNZXNzYWdlKGdldFRpdGxlKCkpOwotICAgIC8vICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIC8vICAgICAgICB9Ci0gICAgLy8KLSAgICAvLyAgICB9Ci0gICAgLy8KLSAgICAvLyAgICBwcml2YXRlIElTdGF0dXMgZmluZE1vc3RTZXZlcmUoKSB7Ci0gICAgLy8gICAgICAgIHJldHVybiBDWEZfTE9DQVRJT05fU1RBVFVTOwotICAgIC8vICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0cygpIHsKLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSKSk7Ci0KLSAgICAgICAgamF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLnNldERlZmF1bHRzKCk7Ci0gICAgICAgIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0RGVmYXVsdHMoKTsKLSAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXREZWZhdWx0cygpOwotICAgICAgICBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLnNldERlZmF1bHRzKCk7Ci0gICAgICAgIGFubm90YXRpb25zQ29tcG9zaXRlLnNldERlZmF1bHRzKCk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ0NvbXBvc2l0ZS5zZXREZWZhdWx0cygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWZyZXNoKCkgewotICAgICAgICBpZiAoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUucmVmcmVzaCgpOwotICAgICAgICAgICAgY3hmMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5yZWZyZXNoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUucmVmcmVzaCgpOwotICAgICAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGNvbnRleHQuc2V0RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkuY29tcGFyZVRvKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKSA+PSAwKSB7Ci0gICAgICAgICAgICBqYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLnN0b3JlVmFsdWVzKCk7Ci0gICAgICAgICAgICBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLnN0b3JlVmFsdWVzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuc3RvcmVWYWx1ZXMoKTsKLSAgICAgICAgICAgIGN4ZjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuc3RvcmVWYWx1ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBhbm5vdGF0aW9uc0NvbXBvc2l0ZS5zdG9yZVZhbHVlcygpOwotICAgICAgICBzcHJpbmdDb25maWdDb21wb3NpdGUuc3RvcmVWYWx1ZXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0gICAgICAgIHN1cGVyLnBlcmZvcm1BcHBseSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5wZXJmb3JtQ2FuY2VsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotICAgICAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICAgICAgc2V0RGVmYXVsdHMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gICAgICAgIHN0b3JlVmFsdWVzKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgaWYgKGxpYnJhcnlJbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaWJyYXJ5SW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICAgICAgbGlicmFyeUltYWdlID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9wcm9wZXJ0aWVzL0NYRlByb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3Byb3BlcnRpZXMvQ1hGUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNDlkYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3Byb3BlcnRpZXMvQ1hGUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLQotcHVibGljIGNsYXNzIENYRlByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0KLSAgICBwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBDb21ib1ZpZXdlciBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXI7Ci0gICAgcHJpdmF0ZSBMaW5rIGxpbms7Ci0gICAgcHJpdmF0ZSBDWEZJbnN0YWxsIGRlZmF1bHRJbnN0YWxsOwotICAgIHByaXZhdGUgQ1hGQ29udGV4dCBjb250ZXh0OwotCi0gICAgcHVibGljIENYRlByb3BlcnR5UGFnZSgpIHsKLSAgICAgICAgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBJQWRhcHRhYmxlIGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBlbGVtZW50OwotICAgICAgICB0aGlzLnByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIGxpbmsgPSBuZXcgTGluayhjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbGluay5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX0NPTkZJR1VSRV9JTlNUQUxMRURfUlVOVElNRVNfTEFCRUwpOwotICAgICAgICBsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNlbGVjdGVkSW5kZXggPSBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS5DWEZSdW50aW1lUHJlZmVyZW5jZXNQYWdlIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS5DWEZSdW50aW1lUHJlZmVyZW5jZXNQYWdlIn0sIG51bGwpLm9wZW4oKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRDb21ibygpLnNlbGVjdChzZWxlY3RlZEluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgbGluay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9QUk9QRVJUWV9QQUdFX1JVTlRJTUVfTEFCRUwpOwotCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbjw/PikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChDb2xsZWN0aW9uPD8+KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDWEZJbnN0YWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRkluc3RhbGwgY3hmSW5zdGFsbCA9IChDWEZJbnN0YWxsKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3hmSW5zdGFsbC5nZXRUeXBlKCkgKyAiICIgKyBjeGZJbnN0YWxsLmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxDWEZJbnN0YWxsPiBpbnN0YWxsYXRpb25zID0gY29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkudmFsdWVzKCk7Ci0KLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnNldElucHV0KGluc3RhbGxhdGlvbnMpOwotCi0gICAgICAgIFN0cmluZyBpbnRhbGxlZFZlcnNpb24gPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDWEZSdW50aW1lVmVyc2lvbihwcm9qZWN0KTsKLSAgICAgICAgZGVmYXVsdEluc3RhbGwgPSBjb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKS5nZXQoaW50YWxsZWRWZXJzaW9uKTsKLSAgICAgICAgaWYgKGRlZmF1bHRJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmYXVsdEluc3RhbGwpLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLSAgICAgICAgQ1hGSW5zdGFsbCBzZWxlY3RlZEluc3RhbGwgPSBnZXRTZWxlY3RlZEluc3RhbGwoKTsKLSAgICAgICAgLy9pZiAoaXNVcGRhdGVSZXF1aXJlZChwcm9qZWN0LCBzZWxlY3RlZEluc3RhbGwpKSB7Ci0gICAgICAgIC8vaWYgKCFkZWZhdWx0SW5zdGFsbC5nZXRWZXJzaW9uKCkuZXF1YWxzKHNlbGVjdGVkSW5zdGFsbC5nZXRWZXJzaW9uKCkpKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZEluc3RhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q1hGUnVudGltZVZlcnNpb24ocHJvamVjdCwgc2VsZWN0ZWRJbnN0YWxsLmdldFZlcnNpb24oKSk7Ci0KLSAgICAgICAgICAgIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoCi0gICAgICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4uQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfSUQpOwotICAgICAgICAgICAgaWYgKGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJUGF0aCBjb250YWluZXJQYXRoID0gbmV3IFBhdGgoQ1hGQ29yZVBsdWdpbi5DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9JRCk7Ci0gICAgICAgICAgICAgICAgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyIGN4ZkNsYXNzcGF0aENvbnRhaW5lciA9IG5ldyBDWEZDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3QpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLnJlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3hmQ2xhc3NwYXRoQ29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZJbnN0YWxsIGdldFNlbGVjdGVkSW5zdGFsbCgpIHsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKCFzdHJ1Y3R1cmVkU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQ1hGSW5zdGFsbCBzZWxlY3RlZEluc3RhbGwgPSAoQ1hGSW5zdGFsbCkgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEluc3RhbGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotICAgICAgICBDWEZJbnN0YWxsIGRlZmF1bHRJbnN0YWxsID0gY29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkuZ2V0KGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkpOwotICAgICAgICBpZiAoZGVmYXVsdEluc3RhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihkZWZhdWx0SW5zdGFsbCksIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9KYXZhVmlld2VyRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9KYXZhVmlld2VyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NDAwMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvSmF2YVZpZXdlckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luOwotCi0vKioKLSAqIDxjb2RlPlZpZXdlckZpbHRlcjwvY29kZT4gdGhhdCBmaWx0ZXJzIG9uIGNsYXNzZXMgb3IgaW50ZXJmYWNlcyB3aXRoaW4gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0KLSAgICBwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLSAgICBwcml2YXRlIGludCBlbGVtZW50S2luZHM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5KYXZhVmlld2VyRmlsdGVyPC9jb2RlPiBnaXZlbiBhIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4gYW5kIGFuCi0gICAgICogPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHM8L2NvZGU+IGVsZW1lbnQga2luZCB0byBzZWFyY2ggZm9yLiBBbGwgb3RoZXIgZWxlbWVudHMgYXJlIGZpbHRlcmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCB0aGUgamF2YSBwcm9qZWN0IHRvIGZpbHRlcgotICAgICAqIEBwYXJhbSBlbGVtZW50S2luZHMgYSBmbGFnIGRlZmluaW5nIG5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50czsgdGhlIG9ubHkgdmFsaWQgdmFsdWVzIGFyZTogCi0gICAgICogIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTPC9jb2RlPgotICAgICAqICA8Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5JTlRFUkZBQ0U8L2NvZGU+Ci0gICAgICogIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTX0FORF9JTlRFUkZBQ0U8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIEphdmFWaWV3ZXJGaWx0ZXIoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBpbnQgZWxlbWVudEtpbmRzKSB7Ci0gICAgICAgIHRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLSAgICAgICAgdGhpcy5lbGVtZW50S2luZHMgPSBlbGVtZW50S2luZHM7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBqYXZhUHJvamVjdC5lcXVhbHMoKElKYXZhUHJvamVjdCkgZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0gICAgICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLSAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotICAgICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlRnJhZ21lbnQuaGFzQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgSVR5cGUgdHlwZSA9IGNvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnRLaW5kcykgewotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1M6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICBjYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLklOVEVSRkFDRToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNJbnRlcmZhY2UoKSAmJiAhdHlwZS5pc0Fubm90YXRpb24oKTsKLSAgICAgICAgICAgICAgICBjYXNlIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTX0FORF9JTlRFUkZBQ0U6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQ2xhc3MoKSB8fCAodHlwZS5pc0ludGVyZmFjZSgpICYmICF0eXBlLmlzQW5ub3RhdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvUGFja2FnZU5hbWVDb2x1bW5MYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZUNvbHVtbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYwNjc0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZUNvbHVtbkxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBQYWNrYWdlTmFtZUNvbHVtbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBDb2x1bW5MYWJlbFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5jbHVkZWROYW1lc3BhY2VzOwotCi0gICAgcHVibGljIFBhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlcihXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgaW5jbHVkZWROYW1lc3BhY2VzID0gbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChpbmNsdWRlZE5hbWVzcGFjZXMuY29udGFpbnNLZXkoZWxlbWVudC50b1N0cmluZygpKSkgewotICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVkTmFtZXNwYWNlcy5nZXQoZWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV1NETFV0aWxzLmdldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZShlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY1N2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5FZGl0aW5nU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotcHVibGljIGNsYXNzIFBhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQgZXh0ZW5kcyBFZGl0aW5nU3VwcG9ydCBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLSAgICBwcml2YXRlIENlbGxFZGl0b3IgcGFja2FnZU5hbWVDZWxsRWRpdG9yOwotICAgIHByaXZhdGUgVGFibGUgdGFibGU7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVkTmFtZXNwYWNlczsKLQotICAgIHB1YmxpYyBQYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0KFRhYmxlVmlld2VyIHRhYmxlVmlld2VyLCBDZWxsRWRpdG9yIHBhY2thZ2VOYW1lQ2VsbEVkaXRvciwKLSAgICAgICAgICAgIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcih0YWJsZVZpZXdlcik7Ci0gICAgICAgIHRoaXMudGFibGUgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICB0aGlzLnBhY2thZ2VOYW1lQ2VsbEVkaXRvciA9IHBhY2thZ2VOYW1lQ2VsbEVkaXRvcjsKLSAgICAgICAgaW5jbHVkZWROYW1lc3BhY2VzID0gbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCk7Ci0gICAgICAgIHRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkVkaXQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbigpWzBdLmdldENoZWNrZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZUNlbGxFZGl0b3I7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoaW5jbHVkZWROYW1lc3BhY2VzLmNvbnRhaW5zS2V5KGVsZW1lbnQudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpbmNsdWRlZE5hbWVzcGFjZXMuZ2V0KGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdTRExVdGlscy5nZXRQYWNrYWdlTmFtZUZyb21OYW1lc3BhY2UoZWxlbWVudC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShPYmplY3QgbmFtZXNwYWNlLCBPYmplY3QgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsICYmIHBhY2thZ2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluY2x1ZGVkTmFtZXNwYWNlcy5wdXQobmFtZXNwYWNlLnRvU3RyaW5nKCksIHBhY2thZ2VOYW1lLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgZ2V0Vmlld2VyKCkudXBkYXRlKG5hbWVzcGFjZSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5DSEVDSykgewotICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZUtleSA9IGl0ZW0uZ2V0VGV4dCgwKTsKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGl0ZW0uZ2V0VGV4dCgxKTsKLSAgICAgICAgICAgIGlmIChpdGVtLmdldENoZWNrZWQoKSkgewotICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZWROYW1lc3BhY2VzLmNvbnRhaW5zS2V5KG5hbWVzcGFjZUtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWROYW1lc3BhY2VzLnB1dChuYW1lc3BhY2VLZXksIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlZE5hbWVzcGFjZXMuY29udGFpbnNLZXkobmFtZXNwYWNlS2V5KSkgewotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZE5hbWVzcGFjZXMucmVtb3ZlKG5hbWVzcGFjZUtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZVRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZVRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Y2I2ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotcHVibGljIGNsYXNzIFBhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICBMaXN0PE9iamVjdD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIERlZmluaXRpb24pIHsKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpbnB1dEVsZW1lbnQ7Ci0gICAgICAgICAgICBNYXAgbmFtZXNwYWNlcyA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICAgICAgQ29sbGVjdGlvbiB2YWx1ZXMgPSBuYW1lc3BhY2VzLnZhbHVlcygpOwotICAgICAgICAgICAgZm9yIChPYmplY3QgbmFtZXNwYWNlVmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gbmFtZXNwYWNlVmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW5hbWVzcGFjZS5lcXVhbHMoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSkgJiYgIWVsZW1lbnRzLmNvbnRhaW5zKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50cy50b0FycmF5KG5ldyBPYmplY3RbZWxlbWVudHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0Fubm90YXRpb25zQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9Bbm5vdGF0aW9uc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2IwOTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0Fubm90YXRpb25zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0gICAgcHJpdmF0ZSBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVdlYlBhcmFtQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBlbmFibGVBUFRCdXR0b247Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGlvbnNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBhZGRDb250cm9scygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgR3JpZExheW91dCBwcmVmbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KHByZWZsYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIGpheHdzQW5ub3RhdGlvbnNHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgamF4d3NBbm5vdGF0aW9uc0dyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVhXU19BTk5PVEFUSU9OU19HUk9VUF9MQUJFTCk7Ci0gICAgICAgIGpheHdzQW5ub3RhdGlvbnNHcm91cC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0FOTk9UQVRJT05TX0dST1VQX1RPT0xUSVApOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgamF4d3NBbm5vdGF0aW9uc0dyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGpheHdzQW5ub3RhdGlvbnNHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbiA9IG5ldyBCdXR0b24oamF4d3NBbm5vdGF0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfR0VORVJBVEVfV0VCX01FVEhPRCk7Ci0gICAgICAgIGdlbmVyYXRlV2ViTWV0aG9kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9ICgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oc2VsZWN0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuZXJhdGVXZWJNZXRob2RCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVXZWJQYXJhbUJ1dHRvbiA9IG5ldyBCdXR0b24oamF4d3NBbm5vdGF0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5lcmF0ZVdlYlBhcmFtQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVhXU19HRU5FUkFURV9XRUJfUEFSQU0pOwotICAgICAgICBnZW5lcmF0ZVdlYlBhcmFtQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9ICgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbihzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5lcmF0ZVdlYlBhcmFtQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckJ1dHRvbiA9IG5ldyBCdXR0b24oamF4d3NBbm5vdGF0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVhXU19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVIpOwotICAgICAgICBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9ICgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbihzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b24gPSBuZXcgQnV0dG9uKGpheHdzQW5ub3RhdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVIpOwotICAgICAgICBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQgPSAoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKHNlbGVjdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkpOwotCi0gICAgICAgIEdyb3VwIGFubm90YXRpb25Qcm9jZXNzaW5nR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIGFubm90YXRpb25Qcm9jZXNzaW5nR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0FOTk9UQVRJT05TX1BST0NFU1NJTkdfR1JPVVBfTEFCRUwpOwotICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc2luZ0dyb3VwLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLkpBWFdTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkdfVE9PTFRJUCwKLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpKSk7Ci0gICAgICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NpbmdHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc2luZ0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGVuYWJsZUFQVEJ1dHRvbiA9IG5ldyBCdXR0b24oYW5ub3RhdGlvblByb2Nlc3NpbmdHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZW5hYmxlQVBUQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVhXU19FTkFCTEVfQU5OT1RBVElPTl9QUk9DRVNTSU5HKTsKLSAgICAgICAgZW5hYmxlQVBUQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9ICgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoc2VsZWN0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZW5hYmxlQVBUQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotICAgICAgICBnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTikpOwotCi0gICAgICAgIGdlbmVyYXRlV2ViUGFyYW1CdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTikpOwotCi0gICAgICAgIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTikpOwotCi0gICAgICAgIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OKSk7Ci0KLSAgICAgICAgZW5hYmxlQVBUQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9yZVZhbHVlcygpIHsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oZ2VuZXJhdGVXZWJNZXRob2RCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKGdlbmVyYXRlV2ViUGFyYW1CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbihnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKGVuYWJsZUFQVEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0JsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZTQxZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLSAgICBwdWJsaWMgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotCi0gICAgICAgIGFkZENvbnRyb2xzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENvbnRyb2xzKCkgewotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgICAgQ0xhYmVsIHNldEludGFsbERpckxhYmVsID0gbmV3IENMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIHRydWUsIHRydWUpOwotICAgICAgICBzZXRJbnRhbGxEaXJMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgc2V0SW50YWxsRGlyTGFiZWwuc2V0SW1hZ2UoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZSgKLSAgICAgICAgICAgICAgICBJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSykpOwotICAgICAgICBzZXRJbnRhbGxEaXJMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfTk9UX1NFVCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9DWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9DWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWQ5YzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi1wdWJsaWMgY2xhc3MgQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0gICAgV1NETDJKYXZhQ29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V1NETDJKYXZhQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVTZXJ2ZXJCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gdXNlRGVmYXVsdFZhbHVlc0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBhdXRvTmFtZVJlc29sdXRpb25CdXR0b247Ci0KLSAgICBwcml2YXRlIFRhYmxlIHhqY0FyZ3NUYWJsZTsKLQotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjVG9TdHJpbmdUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjTG9jYXRvclRhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtOwotCi0gICAgcHVibGljIENYRjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbnRyb2xzKCkgewotICAgICAgICBHcmlkTGF5b3V0IHByZWZsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQocHJlZmxheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JvdXAgd3NkbDJqYXZhR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGwyamF2YWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXQod3NkbDJqYXZhbGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZVNlcnZlckJ1dHRvbih3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24oCi0gICAgICAgICAgICAgICAgd3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRGVmYXVsdFZhbHVlc0J1dHRvbih3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0KLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQcm9jZXNzU09BUEhlYWRlcnNCdXR0b24od3NkbDJqYXZhR3JvdXAsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0KLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uKAotICAgICAgICAgICAgICAgIHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLQotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbigKLSAgICAgICAgICAgICAgICB3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoQ1hGTW9kZWxVdGlscy5pc0F1dG9OYW1lUmVzb2x1dGlvblBlcm1pdHRlZCgpKSB7Ci0gICAgICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbih3c2RsMmphdmFHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBHcm91cCB4amNBcmdHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfQVJHX0dST1VQX1RJVExFKTsKLSAgICAgICAgR3JpZExheW91dCB4amNBcmdMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0KHhqY0FyZ0xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICB4amNBcmdzVGFibGUgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0FyZ1RhYmxlKHhqY0FyZ0dyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA2OwotICAgICAgICB4amNBcmdzVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDRGVmYXVsdFZhbHVlc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgIHhqY1RvU3RyaW5nVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIGNvbnRleHQpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0oCi0gICAgICAgICAgICAgICAgeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwKLSAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICAgICAgeGpjTG9jYXRvclRhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDTG9jYXRvclRhYmxlSXRlbSh4amNBcmdzVGFibGUsIGNvbnRleHQpOwotICAgICAgICB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDU3luY01ldGhvZHNUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDTWFya0dlbmVyYXRlZFRhYmxlSXRlbSh4amNBcmdzVGFibGUsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUykpOwotCi0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVIpKTsKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT04pKTsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUykpOwotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HKSk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkcpKTsKLQotICAgICAgICBpZiAoY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkpIHsKLSAgICAgICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT04pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19TSU1QTEUpKTsKLSAgICAgICAgeGpjTG9jYXRvclRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX0xPQ0FUT1IpKTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfU1lOQ19NRVRIT0RTKSk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTUFSS19HRU5FUkFURUQpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkpOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNQcm9jZXNzU09BUEhlYWRlcnMoKSk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNhblVwZGF0ZUF1dG9OYW1lUmVzb2x1dGlvbigpKSB7Ci0gICAgICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNBdXRvTmFtZVJlc29sdXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVG9TdHJpbmcoKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNUb1N0cmluZ1NpbXBsZSgpKTsKLSAgICAgICAgeGpjTG9jYXRvclRhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNMb2NhdG9yKCkpOwotICAgICAgICB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNTeW5jTWV0aG9kcygpKTsKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNNYXJrR2VuZXJhdGVkKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdG9yZVZhbHVlcygpIHsKLSAgICAgICAgY29udGV4dC5zZXRVc2VEZWZhdWx0VmFsdWVzKHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlU2VydmVyKGdlbmVyYXRlU2VydmVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldFByb2Nlc3NTT0FQSGVhZGVycyhwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNhblVwZGF0ZUF1dG9OYW1lUmVzb2x1dGlvbigpKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldEF1dG9OYW1lUmVzb2x1dGlvbihhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjb250ZXh0LnNldFhqY1VzZURlZmF1bHRWYWx1ZXMoeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1RvU3RyaW5nKHhqY1RvU3RyaW5nVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNUb1N0cmluZ1NpbXBsZSh4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY0xvY2F0b3IoeGpjTG9jYXRvclRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1N5bmNNZXRob2RzKHhqY1N5bmNNZXRob2RzVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjTWFya0dlbmVyYXRlZCh4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24gIT0gbnVsbCAmJiBDWEZNb2RlbFV0aWxzLmlzQXV0b05hbWVSZXNvbHV0aW9uUGVybWl0dGVkKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9DWEYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9DWEYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MmNiMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi1wdWJsaWMgY2xhc3MgQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0gICAgV1NETDJKYXZhQ29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V1NETDJKYXZhQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVTZXJ2ZXJCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBUYWJsZSB4amNBcmdzVGFibGU7Ci0KLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1RvU3RyaW5nVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY0xvY2F0b3JUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjU3luY01ldGhvZHNUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbTsKLQotICAgIHByaXZhdGUgQnV0dG9uIHVzZURlZmF1bHRWYWx1ZXNCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbm9BZGRyZXNzQmluZGluZ0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBhdXRvTmFtZVJlc29sdXRpb25CdXR0b247Ci0KLSAgICBwdWJsaWMgQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIEdyaWRMYXlvdXQgcHJlZmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB0aGlzLnNldExheW91dChwcmVmbGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCB3c2RsMmphdmFHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9HUk9VUF9MQUJFTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgd3NkbDJqYXZhbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXQod3NkbDJqYXZhbGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIEZyb250ZW5kCi0gICAgICAgIC8vIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRnJvbnRlbmRMYWJlbCh3c2RsMmphdmFHcm91cCk7Ci0gICAgICAgIC8vIENvbWJvIGZyb250ZW5kQ29tYm8gPQotICAgICAgICAvLyBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUZyb250ZW5kQ29tYm8od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICAvLyBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgLy8gZnJvbnRlbmRDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBEYXRhYmluZGluZwotICAgICAgICAvLyBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZURhdGFiaW5kaW5nTGFiZWwod3NkbDJqYXZhR3JvdXApOwotICAgICAgICAvLyBDb21ibyBkYXRhYmluZGluZ0NvbWJvID0KLSAgICAgICAgLy8gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVEYXRhYmluZGluZ0NvbWJvKHdzZGwyamF2YUdyb3VwLAotICAgICAgICAvLyBjb250ZXh0KTsKLSAgICAgICAgLy8gZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIC8vIGRhdGFiaW5kaW5nQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gV1NETCBWZXJzaW9uCi0gICAgICAgIC8vIFdTREwySmF2YVdpZGdldEZhY3RvcnkuIGNyZWF0ZVdTRExWZXJzaW9uTGFiZWwod3NkbDJqYXZhR3JvdXApOwotICAgICAgICAvLyBDb21ibyB3c2RsVmVyc2lvbkNvbWJvID0KLSAgICAgICAgLy8gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVXU0RMVmVyc2lvbkNvbWJvKHdzZGwyamF2YUdyb3VwLAotICAgICAgICAvLyBjb250ZXh0KTsKLSAgICAgICAgLy8gZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIC8vIHdzZGxWZXJzaW9uQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbigKLSAgICAgICAgICAgICAgICB3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRGVmYXVsdFZhbHVlc0J1dHRvbih3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbih3c2RsMmphdmFHcm91cCwKLSAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbigKLSAgICAgICAgICAgICAgICB3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uKAotICAgICAgICAgICAgICAgIHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGlmIChDWEZNb2RlbFV0aWxzLmlzQXV0b05hbWVSZXNvbHV0aW9uUGVybWl0dGVkKCkpIHsKLSAgICAgICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBub0FkZHJlc3NCaW5kaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOb0FkZHJlc3NCaW5kaW5nQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIEdyb3VwIHhqY0FyZ0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB4amNBcmdHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19BUkdfR1JPVVBfVElUTEUpOwotICAgICAgICBHcmlkTGF5b3V0IHhqY0FyZ0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXQoeGpjQXJnTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHhqY0FyZ3NUYWJsZSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDQXJnVGFibGUoeGpjQXJnR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDY7Ci0gICAgICAgIHhqY0FyZ3NUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICB4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNEZWZhdWx0VmFsdWVzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwKLSAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICAgICAgeGpjVG9TdHJpbmdUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbSgKLSAgICAgICAgICAgICAgICB4amNBcmdzVGFibGUsIGNvbnRleHQpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICB4amNMb2NhdG9yVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNMb2NhdG9yVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNTeW5jTWV0aG9kc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIGNvbnRleHQpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNNYXJrR2VuZXJhdGVkVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwKLSAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTKSk7Ci0gICAgICAgIAotICAgICAgICBub0FkZHJlc3NCaW5kaW5nQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19OT19BRERSRVNTX0JJTkRJTkcpKTsKLQotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSKSk7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTikpOwotICAgICAgICAKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUykpOwotICAgICAgICAKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORykpOwotICAgICAgICAKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORykpOwotCi0gICAgICAgIGlmIChjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSkgewotICAgICAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19BVVRPX05BTUVfUkVTT0xVVElPTikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUykpOwotICAgICAgICAKLSAgICAgICAgeGpjVG9TdHJpbmdUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkcpKTsKLSAgICAgICAgCi0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FKSk7Ci0gICAgICAgIAotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfU0lNUExFKSk7Ci0gICAgICAgIAotICAgICAgICB4amNMb2NhdG9yVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUikpOwotICAgICAgICAKLSAgICAgICAgeGpjU3luY01ldGhvZHNUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfU1lOQ19NRVRIT0RTKSk7Ci0gICAgICAgIAotICAgICAgICB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICBub0FkZHJlc3NCaW5kaW5nQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzTm9BZGRyZXNzQmluZGluZygpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSkgewotICAgICAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzQXV0b05hbWVSZXNvbHV0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlU2VydmVyKCkpOwotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpKTsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzUHJvY2Vzc1NPQVBIZWFkZXJzKCkpOwotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkpOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpKTsKLQotICAgICAgICB4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1RvU3RyaW5nKCkpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNUb1N0cmluZ011bHRpTGluZSgpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVG9TdHJpbmdTaW1wbGUoKSk7Ci0gICAgICAgIHhqY0xvY2F0b3JUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjTG9jYXRvcigpKTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjU3luY01ldGhvZHMoKSk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjTWFya0dlbmVyYXRlZCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGNvbnRleHQuc2V0VXNlRGVmYXVsdFZhbHVlcyh1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXROb0FkZHJlc3NCaW5kaW5nKG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNhblVwZGF0ZUF1dG9OYW1lUmVzb2x1dGlvbigpKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldEF1dG9OYW1lUmVzb2x1dGlvbihhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlU2VydmVyKGdlbmVyYXRlU2VydmVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldFByb2Nlc3NTT0FQSGVhZGVycyhwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0gICAgICAgIGNvbnRleHQuc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyh4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjVG9TdHJpbmcoeGpjVG9TdHJpbmdUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNUb1N0cmluZ011bHRpTGluZSh4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1RvU3RyaW5nU2ltcGxlKHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjTG9jYXRvcih4amNMb2NhdG9yVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjU3luY01ldGhvZHMoeGpjU3luY01ldGhvZHNUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNNYXJrR2VuZXJhdGVkKHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblVwZGF0ZUF1dG9OYW1lUmVzb2x1dGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbiAhPSBudWxsICYmIENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYjVlYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotICAgIHByaXZhdGUgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBDb21ibyBzb2FwQmluZGluZ0NvbWJvOwotICAgIHByaXZhdGUgQnV0dG9uIGNyZWF0ZVhTREltcG9ydHNCdXR0b247ICAgIAotICAgIHByaXZhdGUgVGFiRm9sZGVyIHRhYkZvbGRlcjsKLSAgICAKLSAgICBwdWJsaWMgSmF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgVGFiRm9sZGVyIHRhYkZvbGRlcikgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgdGhpcy50YWJGb2xkZXIgPSB0YWJGb2xkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIEdyaWRMYXlvdXQgcHJlZmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB0aGlzLnNldExheW91dChwcmVmbGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCBqYXZhMndzZGxHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgamF2YTJ3c2RsR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NETF9HUk9VUF9MQUJFTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgamF2YTJ3c2xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGphdmEyd3NsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGphdmEyd3NkbEdyb3VwLnNldExheW91dChqYXZhMndzbGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGphdmEyd3NkbEdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNPQVBCaW5kaW5nTGFiZWwoamF2YTJ3c2RsR3JvdXApOwotCi0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTT0FQQmluZ0NvbWJvKGphdmEyd3NkbEdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlWFNESW1wb3J0c0J1dHRvbihqYXZhMndzZGxHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIExpbmsgbGluayA9IG5ldyBMaW5rKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgICAgbGluay5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfTElOSyk7Ci0gICAgICAgIGxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbigzKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19TT0FQMTJfQklORElORykpIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfWFNEX0lNUE9SVFMpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgaWYgKGNvbnRleHQuaXNTb2FwMTJCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjIiKTsgLy8kTk9OLU5MUy0xJCAgICAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjEiKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVhTREltcG9ydHMoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBpZiAoc29hcEJpbmRpbmdDb21iby5nZXRUZXh0KCkuZXF1YWxzKCJTT0FQIDEuMiIpKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFNvYXAxMkJpbmRpbmcodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFNvYXAxMkJpbmRpbmcoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVhTREltcG9ydHMoY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDYyZmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5KYXZhMldTUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLQotcHVibGljIGNsYXNzIEphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotICAgIHByaXZhdGUgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgIAotICAgIHByaXZhdGUgQ29tYm8gc29hcEJpbmRpbmdDb21ibzsKLSAgICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVDbGllbnRCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVTZXJ2ZXJCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlV1NETEJ1dHRvbjsKLSAgICAKLSAgICBwcml2YXRlIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0gICAgCi0gICAgcHVibGljIEphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICB0aGlzLnRhYkZvbGRlciA9IHRhYkZvbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgR3JpZExheW91dCBwcmVmbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQotICAgICAgICBwcmVmbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgICAgICBwcmVmbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotICAgICAgICB0aGlzLnNldExheW91dChwcmVmbGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gSmF2YTJXUyBHcm91cAotICAgICAgICBHcm91cCBqYXZhMndzR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIGphdmEyd3NHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HUk9VUF9MQUJFTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgamF2YTJ3c2xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0KLSAgICAgICAgamF2YTJ3c2xheW91dC5udW1Db2x1bW5zID0gMzsKLQotICAgICAgICBqYXZhMndzbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotICAgICAgICBqYXZhMndzR3JvdXAuc2V0TGF5b3V0KGphdmEyd3NsYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGphdmEyd3NHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBGcm9udGVuZAotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVGcm9udGVuZExhYmVsKGphdmEyd3NHcm91cCk7Ci0gICAgICAgIENvbWJvIGZyb250ZW5kQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVGcm9udGVuZENvbWJvKGphdmEyd3NHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGZyb250ZW5kQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gRGF0YWJpbmRpbmcKLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRGF0YWJpbmRpbmdMYWJlbChqYXZhMndzR3JvdXApOwotICAgICAgICBDb21ibyBkYXRhYmluZGluZ0NvbWJvID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRGF0YWJpbmRpbmdDb21ibyhqYXZhMndzR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBkYXRhYmluZGluZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIEdlbiBDbGllbnQKLSAgICAgICAgZ2VuZXJhdGVDbGllbnRCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZUNsaWVudEJ1dHRvbihqYXZhMndzR3JvdXAsIGNvbnRleHQpOwotCi0gICAgICAgIC8vIEdlbiBTZXJ2ZXIKLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZVNlcnZlckJ1dHRvbihqYXZhMndzR3JvdXAsIGNvbnRleHQpOwotCi0gICAgICAgIC8vIEdlbiBXcmFwcGVyIGFuZCBGYXVsdCBCZWFuCi0gICAgICAgIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbigKLSAgICAgICAgICAgICAgICBqYXZhMndzR3JvdXAsIGNvbnRleHQpOwotCi0gICAgICAgIC8vIEdlbiBXU0RMCi0gICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlV1NETEJ1dHRvbihqYXZhMndzR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBnZW5lcmF0ZVdTRExCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZW5hYmxlV1NETEdyb3VwKGdlbmVyYXRlV1NETEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIHdzZGxHcm91cCA9IG5ldyBHcm91cChqYXZhMndzR3JvdXAsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsR3JvdXBMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIHdzZGxHcm91cC5zZXRMYXlvdXQod3NkbEdyb3VwTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICB3c2RsR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU09BUEJpbmRpbmdMYWJlbCh3c2RsR3JvdXApOwotCi0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTT0FQQmluZ0NvbWJvKHdzZGxHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVhTREltcG9ydHNCdXR0b24od3NkbEdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgTGluayBsaW5rID0gbmV3IExpbmsodGhpcywgU1dULk5PTkUpOwotICAgICAgICBsaW5rLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19QUkVGRVJFTkNFU19MSU5LKTsKLSAgICAgICAgbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDMpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGVuYWJsZVdTRExHcm91cChjb250ZXh0LmlzR2VuZXJhdGVXU0RMKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGVuYWJsZVdTRExHcm91cChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotICAgICAgICBpZiAoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX1NPQVAxMl9CSU5ESU5HKSkgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4xIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVDbGllbnRCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkNYRl9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVCkpOwotICAgICAgICAKLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkNYRl9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUikpOwotICAgICAgICAKLSAgICAgICAgZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMpKTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dTREwpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgaWYgKGNvbnRleHQuaXNTb2FwMTJCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjIiKTsgLy8kTk9OLU5MUy0xJCAgICAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjEiKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlWFNESW1wb3J0cygpKTsKLSAgICAgICAgZ2VuZXJhdGVDbGllbnRCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZUNsaWVudCgpKTsKLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpKTsKLSAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVXU0RMKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdG9yZVZhbHVlcygpIHsKLSAgICAgICAgaWYgKHNvYXBCaW5kaW5nQ29tYm8uZ2V0VGV4dCgpLmVxdWFscygiU09BUCAxLjIiKSkgewotICAgICAgICAgICAgY29udGV4dC5zZXRTb2FwMTJCaW5kaW5nKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udGV4dC5zZXRTb2FwMTJCaW5kaW5nKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGNyZWF0ZVhTREltcG9ydHNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlQ2xpZW50KGdlbmVyYXRlQ2xpZW50QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVNlcnZlcihnZW5lcmF0ZVNlcnZlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV1NETChnZW5lcmF0ZVdTRExCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRjY2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5Gcm9udGVuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzLkphdmFWaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotCi0vKioKLSAqIFByb3ZpZGVzIHdpZGdldHMgZm9yIEphdmEyV1MgcHJlZmVyZW5jZXMsIHdpemFyZHMsIGRpYWxvZ3MuIEVuYWJsZXMgdGhlIHJldXNlCi0gKiBvZiB3aWRnZXRzIGluIG11bHRpcGxlIGxvY2F0aW9ucy4gV2lkZ2V0cyBoYXZlIHRoZXJlIGxhYmVsaW5nIGFuZCB0b29sdGlwcwotICogc2V0IGhlcmUgYW5kIHdoZXJlIHBvc3NpYmxlIGxpc3RlbmVycyBhcmUgc2V0IHdoaWNoIHVwZGF0ZSBpbnN0YW5jZXMgb2YKLSAqIDxjb2RlPkphdmEyV1NDb250ZXh0PC9jb2RlPiBhbmQgPGNvZGU+SmF2YTJXU0RhdGFNb2RlbDwvY29kZT4uCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEphdmEyV1NXaWRnZXRGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgSmF2YTJXU1dpZGdldEZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVTT0FQQmluZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgZGVmYXVsdFNvYXBCaW5kaW5nID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBkZWZhdWx0U29hcEJpbmRpbmcuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfREVGQVVMVF9TT0FQQklORElOR19MQUJFTCk7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0U29hcEJpbmRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVTT0FQQmluZ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgQ29tYm8gc29hcEJpbmRpbmdDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TT0FQMTJfQklORElOR19UT09MVElQKTsKLSAgICAgICAgc29hcEJpbmRpbmdDb21iby5hZGQoIlNPQVAgMS4xIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc29hcEJpbmRpbmdDb21iby5hZGQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc29hcEJpbmRpbmdDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQmluZGluZyA9ICgoQ29tYm8pIGUud2lkZ2V0KS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvYXBCaW5kaW5nLmVxdWFscygiU09BUCAxLjIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0U29hcDEyQmluZGluZyh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFNvYXAxMkJpbmRpbmcoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGlmIChjb250ZXh0LmlzU29hcDEyQmluZGluZygpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNvYXBCaW5kaW5nQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlWFNESW1wb3J0c0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIEJ1dHRvbiBjcmVhdGVYU0RJbXBvcnRzID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VOX1hTRF9JTVBPUlRTKTsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0cy5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfQ1JFQVRFX1hTRF9JTVBPUlRTX1RPT0xUSVApOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVhTREltcG9ydHMoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpOwotICAgICAgICByZXR1cm4gY3JlYXRlWFNESW1wb3J0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUZyb250ZW5kTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBmcm9udGVuZExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBmcm9udGVuZExhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfREVGQVVMVF9GUk9OVEVORF9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBmcm9udGVuZExhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlRnJvbnRlbmRDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIGZyb250ZW5kQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfRlJPTlRFTkRfVE9PTFRJUCk7Ci0gICAgICAgIGZyb250ZW5kQ29tYm8uYWRkKEZyb250ZW5kLkpBWFdTLmdldExpdGVyYWwoKSk7Ci0gICAgICAgIGZyb250ZW5kQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnJvbnRlbmQgPSBmcm9udGVuZENvbWJvLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEZyb250ZW5kKEZyb250ZW5kLmdldChmcm9udGVuZCkpOwotICAgICAgICAgICAgICAgIGlmIChmcm9udGVuZC5lcXVhbHMoRnJvbnRlbmQuSkFYV1MuZ2V0TGl0ZXJhbCgpKSkgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldERhdGFiaW5kaW5nKERhdGFCaW5kaW5nLmdldChEYXRhQmluZGluZy5KQVhCLmdldExpdGVyYWwoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBpZiAoZnJvbnRlbmQuZXF1YWxzKCJzaW1wbGUiKSkgewotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldERhdGFiaW5kaW5nKCJhZWdpcyIpOwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZyb250ZW5kQ29tYm8uc2V0VGV4dChjb250ZXh0LmdldEZyb250ZW5kKCkuZ2V0TGl0ZXJhbCgpKTsKLQotICAgICAgICByZXR1cm4gZnJvbnRlbmRDb21ibzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZURhdGFiaW5kaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBkYXRhYmluZGluZ0xhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBkYXRhYmluZGluZ0xhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfREVGQVVMVF9EQVRBQklORElOR19MQUJFTCk7Ci0gICAgICAgIHJldHVybiBkYXRhYmluZGluZ0xhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlRGF0YWJpbmRpbmdDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIGRhdGFiaW5kaW5nQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfREFUQUJJTkRJTkdfVE9PTFRJUCk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uYWRkKERhdGFCaW5kaW5nLkpBWEIuZ2V0TGl0ZXJhbCgpKTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGF0YWJpbmRpbmcoRGF0YUJpbmRpbmcuZ2V0KGRhdGFiaW5kaW5nQ29tYm8uZ2V0VGV4dCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBkYXRhYmluZGluZ0NvbWJvLnNldFRleHQoY29udGV4dC5nZXREYXRhYmluZGluZygpLmdldExpdGVyYWwoKSk7Ci0gICAgICAgIHJldHVybiBkYXRhYmluZGluZ0NvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUdlbmVyYXRlQ2xpZW50QnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGdlbkNsaWVudEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VOX0NMSUVOVF9MQUJFTCk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VORVJBVEVfQ0xJRU5UX1RPT0xUSVApOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlQ2xpZW50KGdlbkNsaWVudEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZUNsaWVudCgpKTsKLSAgICAgICAgcmV0dXJuIGdlbkNsaWVudEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZVNlcnZlckJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBnZW5TZXJ2ZXJCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9TRVJWRVJfTEFCRUwpOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQKTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVNlcnZlcihnZW5TZXJ2ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgIHJldHVybiBnZW5TZXJ2ZXJCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGdlbldyYXBwZXJGYXVsdEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5XcmFwcGVyRmF1bHRCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VOX1dSQVBQRVJfRkFVTFRfTEFCRUwpOwotICAgICAgICBnZW5XcmFwcGVyRmF1bHRCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTkVSQVRFX1dSQVBQRVJCRUFOX1RPT0xUSVApOwotICAgICAgICBnZW5XcmFwcGVyRmF1bHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoZ2VuV3JhcHBlckZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbldyYXBwZXJGYXVsdEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSk7Ci0gICAgICAgIHJldHVybiBnZW5XcmFwcGVyRmF1bHRCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlR2VuZXJhdGVXU0RMQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGdlbldTRExCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuV1NETEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fV1NETF9MQUJFTCk7Ci0gICAgICAgIGdlbldTRExCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTkVSQVRFX1dTRExfVE9PTFRJUCk7Ci0gICAgICAgIGdlbldTRExCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV1NETChnZW5XU0RMQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbldTRExCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgIHJldHVybiBnZW5XU0RMQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlV1NETEZpbGVOYW1lTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCB3c2RsRmlsZU5hbWVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgd3NkbEZpbGVOYW1lTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfV1NETF9GSUxFX05BTUUpOwotICAgICAgICByZXR1cm4gd3NkbEZpbGVOYW1lTGFiZWw7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlV1NETEZpbGVOYW1lVGV4dChDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIFRleHQgd3NkbEZpbGVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgd3NkbEZpbGVUZXh0LnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19PVVRQVVRfRklMRV9UT09MVElQKTsKLSAgICAgICAgd3NkbEZpbGVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldFdzZGxGaWxlTmFtZSh3c2RsRmlsZVRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHdzZGxGaWxlVGV4dC5zZXRUZXh0KG1vZGVsLmdldFdzZGxGaWxlTmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIHdzZGxGaWxlVGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVVc2VTRUlCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gdXNlU0VJQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHVzZVNFSUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19VU0VfU0VJX0JVVFRPTik7Ci0gICAgICAgIHJldHVybiB1c2VTRUlCdXR0b247Ci0gICAgfQotCi0gICAgLy8gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVJbmZvcm1hdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlKSB7Ci0gICAgLy8gICAgICAgIExhYmVsIGluZm9MYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLSAgICAvLyAgICAgICAgaW5mb0xhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5iaW5kKENYRlVJTWVzc2FnZXMuSkFWQTJXU19VU0VfU0VJX0lORk9fTEFCRUwsIHN0YXJ0aW5nUG9pbnRUeXBlCi0gICAgLy8gICAgICAgICAgICAgICAgLmdldEVsZW1lbnROYW1lKCkpKTsKLSAgICAvLyAgICAgICAgcmV0dXJuIGluZm9MYWJlbDsKLSAgICAvLyAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVBhZGRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlU2VsZWN0U0VJQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIHNlbGVjdFNFSUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBzZWxlY3RTRUlCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVTZWxlY3RTRUlMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHNlbGVjdFNFSUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzZWxlY3RTRUlMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdFNFSUxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlU2VsZWN0U0VJQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCwKLSAgICAgICAgICAgIElUeXBlIGphdmFTdGFydGluZ1BvaW50VHlwZSkgewotICAgICAgICBmaW5hbCBDb21ibyBzZWlDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICBzZWlDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9UT09MVElQKTsKLQotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkgPSBqYXZhU3RhcnRpbmdQb2ludFR5cGUubmV3VHlwZUhpZXJhcmNoeShqYXZhUHJvamVjdCwgbnVsbCk7Ci0gICAgICAgICAgICBJVHlwZVtdIGFsbEludGVyZmFjZXMgPSB0eXBlSGllcmFyY2h5LmdldEFsbEludGVyZmFjZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsSW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElUeXBlIGl0eXBlID0gYWxsSW50ZXJmYWNlc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoIWl0eXBlLmlzQmluYXJ5KCkgJiYgaXR5cGUuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VpQ29tYm8uYWRkKGl0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRlVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VpQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlaUludGVyZmFjZU5hbWUgPSBzZWlDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZShzZWlJbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2VpQ29tYm8uZGVzZWxlY3RBbGwoKTsKLSAgICAgICAgcmV0dXJuIHNlaUNvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJyb3dzZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBicm93c2VCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfQlJPV1NFX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGJyb3dzZUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVFeHRyYWN0U0VJQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIGV4dHJhY3RTRUlCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICAgICAgZXh0cmFjdFNFSUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19FWFRSQUNUX1NFSV9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBleHRyYWN0U0VJQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlRXh0cmFjdFNFSUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgZXh0cmFjdFNFSUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBleHRyYWN0U0VJTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfRVhUUkFDVF9TRUlfTEFCRUwpOwotICAgICAgICByZXR1cm4gZXh0cmFjdFNFSUxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVTRUlJbnRlcmZhY2VOYW1lVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIFRleHQgc2VpSW50ZXJmYWNlTmFtZVRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICBzZWlJbnRlcmZhY2VOYW1lVGV4dC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfRVhUUkFDVF9TRUlfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBzZWlJbnRlcmZhY2VOYW1lVGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZU1lbWViZXJzVG9FeHRyYWN0TGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBzZWlNZW1iZXJzVG9FeHRyYWN0TGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19FWFRSQUNUX01FTUJFUlNfTEFCRUwpOwotICAgICAgICByZXR1cm4gc2VpTWVtYmVyc1RvRXh0cmFjdExhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2hlY2tib3hUYWJsZVZpZXdlciBjcmVhdGVTRUlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDaGVja2JveFRhYmxlVmlld2VyIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KHBhcmVudCwKLSAgICAgICAgICAgICAgICBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHJldHVybiBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlU2VsZWN0QWxsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfQUxMX0JVVFRPTik7Ci0gICAgICAgIHJldHVybiBzZWxlY3RBbGxCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlRGVzZWxlY3RBbGxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19ERVNFTEVDVF9BTExfQlVUVE9OKTsKLSAgICAgICAgcmV0dXJuIGRlc2VsZWN0QWxsQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlU2VsZWN0SW1wbGVtZW50YXRpb25MYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHNlbGVjdEltcGxlbWVudGF0aW9uTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX0lNUExFTUVOVEFUSU9OKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdEltcGxlbWVudGF0aW9uTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVTZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgICAgICBmaW5hbCBKYXZhMldTRGF0YU1vZGVsIG1vZGVsLCBJVHlwZSBqYXZhU3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gc2VsZWN0SW1wbGVtZW50YXRpb25Db21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT05fVE9PTFRJUCk7Ci0KLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5ID0gamF2YVN0YXJ0aW5nUG9pbnRUeXBlLm5ld1R5cGVIaWVyYXJjaHkoamF2YVByb2plY3QsIG51bGwpOwotICAgICAgICAgICAgSVR5cGVbXSBhbGxJbXBsZW1lbnRhdGlvbnMgPSB0eXBlSGllcmFyY2h5LmdldEFsbFN1YnR5cGVzKGphdmFTdGFydGluZ1BvaW50VHlwZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbEltcGxlbWVudGF0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElUeXBlIGl0eXBlID0gYWxsSW1wbGVtZW50YXRpb25zW2ldOwotICAgICAgICAgICAgICAgIGlmICghaXR5cGUuaXNCaW5hcnkoKSAmJiBpdHlwZS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKS5lcXVhbHMoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBpdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKz0gIi4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBwYWNrYWdlTmFtZSArIGl0eXBlLmdldFByaW1hcnlFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5hZGQocXVhbGlmaWVkTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGltcGxlbWVudGF0aW9uTmFtZSA9IHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZShpbXBsZW1lbnRhdGlvbk5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0gICAgICAgIHJldHVybiBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gPGNvZGU+RWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c8L2NvZGU+IHRoYXQgZGlzcGxheXMgYWxsIHRoZSBjbGFzc2VzIG9yIGFsbCB0aGUgaW50ZXJmYWNlcwotICAgICAqIHdpdGhpbiBhIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4gYWxsb3dpbmcgb25lIGNsYXNzIG9yIGludGVyZmFjZSB0byBiZSBzZWxlY3RlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgc2hlbGwKLSAgICAgKiBAcGFyYW0gdGl0bGUgdGhlIGRpYWxvZyB0aXRsZQotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBkaWFsb2cgbWVzc2FnZQotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCB0aGUgamF2YSBwcm9qZWN0IHRoYXQgaXMgZmlsdGVyZWQKLSAgICAgKiBAcGFyYW0gZWxlbWVudEtpbmRzIGEgZmxhZyBkZWZpbmluZyBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudHM7IHRoZSBvbmx5IHZhbGlkIHZhbHVlcyBhcmU6Ci0gICAgICogIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTPC9jb2RlPgotICAgICAqICA8Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50cy5JTlRFUkZBQ0U8L2NvZGU+Ci0gICAgICogIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTX0FORF9JTlRFUkZBQ0U8L2NvZGU+Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCB0cmVlIHNlbGVjdGlvbiBkaWFsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGNyZWF0ZUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLAotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgaW50IGVsZW1lbnRLaW5kcykgewotICAgICAgICBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBzZWxlY3Rpb25EaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cocGFyZW50LAotICAgICAgICAgICAgICAgIG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKSwgbmV3IFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZSh0aXRsZSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0QWxsb3dNdWx0aXBsZShmYWxzZSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRJbnB1dChKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSkpOwotCi0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5hZGRGaWx0ZXIobmV3IEphdmFWaWV3ZXJGaWx0ZXIoamF2YVByb2plY3QsIGVsZW1lbnRLaW5kcykpOwotCi0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRWYWxpZGF0b3IobmV3IElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvblswXSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIHNlbGVjdGlvbkRpYWxvZzsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvU3ByaW5nQ29uZmlnQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9TcHJpbmdDb25maWdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0MzU4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9TcHJpbmdDb25maWdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBTcHJpbmdDb25maWdDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotICAgIHByaXZhdGUgQ1hGQ29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLQotICAgIHByaXZhdGUgQnV0dG9uIHVzZUNYRlNlcnZsZXRCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbjsKLSAgICAKLSAgICBwdWJsaWMgU3ByaW5nQ29uZmlnQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgYWRkQ29udHJvbHMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIEdyaWRMYXlvdXQgcHJlZmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB0aGlzLnNldExheW91dChwcmVmbGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCBzcHJpbmdDb25maWdHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgc3ByaW5nQ29uZmlnR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLlNQUklOR19DT05GSUdfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IHNwcmluZ0NvbmZpZ0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpOwotICAgICAgICBzcHJpbmdDb25maWdHcm91cC5zZXRMYXlvdXQoc3ByaW5nQ29uZmlnTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgc3ByaW5nQ29uZmlnR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgdXNlQ1hGU2VydmxldEJ1dHRvbiA9IG5ldyBCdXR0b24oc3ByaW5nQ29uZmlnR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgIHVzZUNYRlNlcnZsZXRCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLlNQUklOR19DT05GSUdfVVNFX0NYRl9TRVJWTEVUKTsKLSAgICAgICAgdXNlQ1hGU2VydmxldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCghc2VsZWN0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uID0gbmV3IEJ1dHRvbihzcHJpbmdDb25maWdHcm91cCwgU1dULlJBRElPKTsKLSAgICAgICAgdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbgotICAgICAgICAgICAgICAgIC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuU1BSSU5HX0NPTkZJR19VU0VfQ1hGX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUKTsKLSAgICAgICAgdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dChzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmIChjb250ZXh0LmlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkpIHsKLSAgICAgICAgICAgIHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXNlQ1hGU2VydmxldEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIGJvb2xlYW4gdXNlU3ByaW5nQXBwY29udGV4dCA9IENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkNYRl9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCk7Ci0gICAgICAgIHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b24uc2V0U2VsZWN0aW9uKHVzZVNwcmluZ0FwcGNvbnRleHQpOwotICAgICAgICB1c2VDWEZTZXJ2bGV0QnV0dG9uLnNldFNlbGVjdGlvbighdXNlU3ByaW5nQXBwY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBjb250ZXh0LnNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCh1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9XU0RMMkphdmFXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9XU0RMMkphdmFXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNGNhYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuZGlhbG9ncy5SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnMuUGFja2FnZU5hbWVDb2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIFByb3ZpZGVzIHdpZGdldHMgZm9yIFdTREwySmF2YSBwcmVmZXJlbmNlcywgd2l6YXJkcywgZGlhbG9ncy4gRW5hYmxlcyB0aGUKLSAqIHJldXNlIG9mIHdpZGdldHMgaW4gbXVsdGlwbGUgbG9jYXRpb25zLiBXaWRnZXRzIGhhdmUgdGhlcmUgbGFiZWxpbmcgYW5kCi0gKiB0b29sdGlwcyBzZXQgaGVyZSBhbmQgd2hlcmUgcG9zc2libGUgbGlzdGVuZXJzIGFyZSBzZXQgd2hpY2ggdXBkYXRlIGluc3RhbmNlcwotICogb2YgPGNvZGU+V1NETDJKYXZhQ29udGV4dDwvY29kZT4gYW5kIDxjb2RlPldTREwySmF2YURhdGFNb2RlbDwvY29kZT4uCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdTREwySmF2YVdpZGdldEZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfRFZfQVJHID0gIi1YZHYiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19UU19BUkcgPSAiLVh0cyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RTX01VTFRJX0FSRyA9ICItWHRzOnN0eWxlOm11bHRpbGluZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RTX1NJTVBMRSA9ICItWHRzOnN0eWxlOnNpbXBsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX0xPQ0FUT1JfQVJHID0gIi1YbG9jYXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1NZTkNfTUVUSE9EU19BUkcgPSAiLVhzeW5jLW1ldGhvZHMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19NQVJLX0dFTkVSQVRFRF9BUkcgPSAiLW1hcmstZ2VuZXJhdGVkIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfRVBJU09ERV9GSUxFX0FSRyA9ICItZXBpc29kZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZUNsaWVudEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBnZW5DbGllbnRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuQ2xpZW50QnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9DTElFTlRfTEFCRUwpOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfR0VORVJBVEVfQ0xJRU5UX1RPT0xUSVApOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZUNsaWVudChnZW5DbGllbnRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuQ2xpZW50QnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0dlbmVyYXRlQ2xpZW50KCkpOwotICAgICAgICByZXR1cm4gZ2VuQ2xpZW50QnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGdlblNlcnZlckJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VOX1NFUlZFUl9MQUJFTCk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9HRU5FUkFURV9TRVJWRVJfVE9PTFRJUCk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGdlblNlcnZlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgIHJldHVybiBnZW5TZXJ2ZXJCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlR2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBnZW5JbXBsZW1lbnRhdGluQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbkltcGxlbWVudGF0aW5CdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VOX0lNUExFTUVOVEFUSU9OX0xBQkVMKTsKLSAgICAgICAgZ2VuSW1wbGVtZW50YXRpbkJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9HRU5FUkFURV9JTVBMRU1FTlRBVElPTl9UT09MVElQKTsKLSAgICAgICAgZ2VuSW1wbGVtZW50YXRpbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oZ2VuSW1wbGVtZW50YXRpbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5JbXBsZW1lbnRhdGluQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSk7Ci0gICAgICAgIHJldHVybiBnZW5JbXBsZW1lbnRhdGluQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUFJPQ0VTU19TT0FQX0hFQURFUlMpOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUFJPQ0VTU19TT0FQX0hFQURFUlNfVE9PTFRJUCk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldFByb2Nlc3NTT0FQSGVhZGVycyhwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc1Byb2Nlc3NTT0FQSGVhZGVycygpKTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbgotICAgICAgICAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTUFQUElORyk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uCi0gICAgICAgIC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9ERUZBVUxUX05BTUVTUEFDRV9MT0FESU5HX1RPT0xUSVApOwotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkpOwotICAgICAgICByZXR1cm4gbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlRXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24KLSAgICAgICAgLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfVVNFX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkcpOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24KLSAgICAgICAgLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0VYQ0xVREVfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUCk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSk7Ci0gICAgICAgIHJldHVybiBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlTm9BZGRyZXNzQmluZGluZ0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBub0FkZHJlc3NCaW5kaW5nQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLmJpbmQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfTk9fQUREUkVTU19CSU5ESU5HLAotICAgICAgICAgICAgICAgIG1vZGVsLmdldERlZmF1bHRSdW50aW1lVHlwZSgpKSk7Ci0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uc2V0VG9vbFRpcFRleHQoCi0gICAgICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5iaW5kKENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX05PX0FERFJFU1NfQklORElOR19UT09MVElQLAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkpKTsKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldE5vQWRkcmVzc0JpbmRpbmcobm9BZGRyZXNzQmluZGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBub0FkZHJlc3NCaW5kaW5nQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc05vQWRkcmVzc0JpbmRpbmcoKSk7Ci0gICAgICAgIHJldHVybiBub0FkZHJlc3NCaW5kaW5nQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQVVUT19OQU1FX1JFU09MVVRJT04pOwotICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQVVUT19OQU1FX1JFU09MVVRJT05fVE9PTFRJUCk7Ci0gICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldEF1dG9OYW1lUmVzb2x1dGlvbihhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0F1dG9OYW1lUmVzb2x1dGlvbigpKTsKLSAgICAgICAgcmV0dXJuIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNEZWZhdWx0VmFsdWVzVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjRGVmYXVsdFZhbHVlc0l0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNEZWZhdWx0VmFsdWVzSXRlbS5zZXRUZXh0KDAsIFhKQ19EVl9BUkcpOwotICAgICAgICB4amNEZWZhdWx0VmFsdWVzSXRlbS5zZXRUZXh0KDEsIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19ERUZBVUxUX1ZBTFVFUyk7Ci0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICByZXR1cm4geGpjRGVmYXVsdFZhbHVlc0l0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZUl0ZW0gY3JlYXRlWEpDVG9TdHJpbmdUYWJsZUl0ZW0oVGFibGUgeGpjQXJnc1RhYmxlLCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlSXRlbSB4amNUb1N0cmluZ0l0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNUb1N0cmluZ0l0ZW0uc2V0VGV4dCgwLCBYSkNfVFNfQVJHKTsKLSAgICAgICAgeGpjVG9TdHJpbmdJdGVtLnNldFRleHQoMSwgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX1RPU1RSSU5HKTsKLSAgICAgICAgeGpjVG9TdHJpbmdJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNUb1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbShUYWJsZSB4amNBcmdzVGFibGUsCi0gICAgICAgICAgICBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlSXRlbSB4amNUb1N0cmluZ011bHRpTGluZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZUl0ZW0uc2V0VGV4dCgwLCBYSkNfVFNfTVVMVElfQVJHKTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVJdGVtLnNldFRleHQoMSwgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX1RPU1RSSU5HX01VTFRJTElORSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lSXRlbS5zZXRDaGVja2VkKG1vZGVsLmlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSk7Ci0gICAgICAgIHJldHVybiB4amNUb1N0cmluZ011bHRpTGluZUl0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZUl0ZW0gY3JlYXRlWEpDVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0oVGFibGUgeGpjQXJnc1RhYmxlLCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlSXRlbSB4amNUb1N0cmluZ1NpbXBsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZUl0ZW0uc2V0VGV4dCgwLCBYSkNfVFNfU0lNUExFKTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVJdGVtLnNldFRleHQoMSwgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX1RPU1RSSU5HX1NJTVBMRSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlSXRlbS5zZXRDaGVja2VkKG1vZGVsLmlzWGpjVG9TdHJpbmdTaW1wbGUoKSk7Ci0gICAgICAgIHJldHVybiB4amNUb1N0cmluZ1NpbXBsZUl0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZUl0ZW0gY3JlYXRlWEpDTG9jYXRvclRhYmxlSXRlbShUYWJsZSB4amNBcmdzVGFibGUsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY0xvY2F0b3JJdGVtID0gbmV3IFRhYmxlSXRlbSh4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgeGpjTG9jYXRvckl0ZW0uc2V0VGV4dCgwLCBYSkNfTE9DQVRPUl9BUkcpOwotICAgICAgICB4amNMb2NhdG9ySXRlbS5zZXRUZXh0KDEsIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19MT0NBVE9SKTsKLSAgICAgICAgeGpjTG9jYXRvckl0ZW0uc2V0Q2hlY2tlZChtb2RlbC5pc1hqY0xvY2F0b3IoKSk7Ci0gICAgICAgIHJldHVybiB4amNMb2NhdG9ySXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNTeW5jTWV0aG9kc1RhYmxlSXRlbShUYWJsZSB4amNBcmdzVGFibGUsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY1N5bmNNZXRob2RzSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzSXRlbS5zZXRUZXh0KDAsIFhKQ19TWU5DX01FVEhPRFNfQVJHKTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNJdGVtLnNldFRleHQoMSwgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX1NZTkNfTUVUSE9EUyk7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzSXRlbS5zZXRDaGVja2VkKG1vZGVsLmlzWGpjU3luY01ldGhvZHMoKSk7Ci0gICAgICAgIHJldHVybiB4amNTeW5jTWV0aG9kc0l0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZUl0ZW0gY3JlYXRlWEpDTWFya0dlbmVyYXRlZFRhYmxlSXRlbShUYWJsZSB4amNBcmdzVGFibGUsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY01hcmtHZW5lcmF0ZWRJdGVtID0gbmV3IFRhYmxlSXRlbSh4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZEl0ZW0uc2V0VGV4dCgwLCBYSkNfTUFSS19HRU5FUkFURURfQVJHKTsKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZEl0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfTUFSS19HRU5FUkFURUQpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkSXRlbS5zZXRDaGVja2VkKG1vZGVsLmlzWGpjTWFya0dlbmVyYXRlZCgpKTsKLSAgICAgICAgcmV0dXJuIHhqY01hcmtHZW5lcmF0ZWRJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ0VwaXNvZGVGaWxlVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjRXBpc29kZUZpbGVJdGVtID0gbmV3IFRhYmxlSXRlbSh4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgeGpjRXBpc29kZUZpbGVJdGVtLnNldFRleHQoMCwgWEpDX0VQSVNPREVfRklMRV9BUkcpOwotICAgICAgICB4amNFcGlzb2RlRmlsZUl0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfRVBJU09ERV9GSUxFKTsKLSAgICAgICAgcmV0dXJuIHhqY0VwaXNvZGVGaWxlSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlIGNyZWF0ZVhKQ0FyZ1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGUgeGpjQXJnc1RhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkNIRUNLIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgICAgIHhqY0FyZ3NUYWJsZS5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfQVJHU19UT09MVElQKTsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLSAgICAgICAgVGFibGVDb2x1bW4geGpjQXJnQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNBcmdDb2x1bW4uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfQVJHX0NPTFVNTl9OQU1FKTsKLQotICAgICAgICBDb2x1bW5XZWlnaHREYXRhIGNvbHVtbldlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDAsIDEwMCwgdHJ1ZSk7Ci0gICAgICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uV2VpZ2h0RGF0YSk7Ci0KLSAgICAgICAgVGFibGVDb2x1bW4gZGVzY3JpcHRpb25Db2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGRlc2NyaXB0aW9uQ29sdW1uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0RFU0NSSVBUSU9OX0NPTFVNTl9OQU1FKTsKLSAgICAgICAgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDIwMCwgMjAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICB4amNBcmdzVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsID09IFNXVC5DSEVDSykgewotICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHhqY0FyZyA9IHRhYmxlSXRlbS5nZXRUZXh0KDApOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrZWQgPSB0YWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoeGpjQXJnLmVxdWFscyhYSkNfRFZfQVJHKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyhjaGVja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh4amNBcmcuZXF1YWxzKFhKQ19UU19BUkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZyhjaGVja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh4amNBcmcuZXF1YWxzKFhKQ19UU19NVUxUSV9BUkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ011bHRpTGluZShjaGVja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh4amNBcmcuZXF1YWxzKFhKQ19UU19TSU1QTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ1NpbXBsZShjaGVja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh4amNBcmcuZXF1YWxzKFhKQ19MT0NBVE9SX0FSRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY0xvY2F0b3IoY2hlY2tlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoeGpjQXJnLmVxdWFscyhYSkNfU1lOQ19NRVRIT0RTX0FSRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY1N5bmNNZXRob2RzKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX01BUktfR0VORVJBVEVEX0FSRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY01hcmtHZW5lcmF0ZWQoY2hlY2tlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgeGpjQXJnQ29sdW1uLnBhY2soKTsKLSAgICAgICAgZGVzY3JpcHRpb25Db2x1bW4ucGFjaygpOwotCi0gICAgICAgIHJldHVybiB4amNBcmdzVGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVGcm9udGVuZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgZnJvbnRlbmRMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZnJvbnRlbmRMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX0RFRkFVTFRfRlJPTlRFTkRfTEFCRUwpOwotICAgICAgICByZXR1cm4gZnJvbnRlbmRMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZUZyb250ZW5kQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBDb21ibyBmcm9udGVuZENvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGZyb250ZW5kQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfRlJPTlRFTkRfVE9PTFRJUCk7Ci0gICAgICAgIGZyb250ZW5kQ29tYm8uYWRkKG1vZGVsLmdldEZyb250ZW5kKCkuZ2V0TGl0ZXJhbCgpKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgIHJldHVybiBmcm9udGVuZENvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlRGF0YWJpbmRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIGRhdGFiaW5kaW5nTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9ERUZBVUxUX0RBVEFCSU5ESU5HX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVEYXRhYmluZGluZ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gZGF0YWJpbmRpbmdDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBkYXRhYmluZGluZ0NvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0RBVEFCSU5ESU5HX1RPT0xUSVApOwotICAgICAgICBkYXRhYmluZGluZ0NvbWJvLmFkZChtb2RlbC5nZXREYXRhYmluZGluZygpLmdldExpdGVyYWwoKSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uc2VsZWN0KDApOwotICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmdDb21ibzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVdTRExWZXJzaW9uTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCB3c2RsVmVyc2lvbkxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICB3c2RsVmVyc2lvbkxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfV1NETF9WRVJTSU9OX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIHdzZGxWZXJzaW9uTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVXU0RMVmVyc2lvbkNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gd3NkbFZlcnNpb25Db21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICB3c2RsVmVyc2lvbkNvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1dTRExfVkVSU0lPTl9UT09MVElQKTsKLSAgICAgICAgd3NkbFZlcnNpb25Db21iby5hZGQobW9kZWwuZ2V0V3NkbFZlcnNpb24oKSk7Ci0gICAgICAgIHdzZGxWZXJzaW9uQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHdzZGxWZXJzaW9uQ29tYm8uc2VsZWN0KDApOwotICAgICAgICByZXR1cm4gd3NkbFZlcnNpb25Db21ibzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVEZWZhdWx0VmFsdWVzQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1VTRV9ERUZBVUxUX1ZBTFVFUyk7Ci0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfREVGQVVMVF9WQUxVRVNfVE9PTFRJUCk7Ci0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRVc2VEZWZhdWx0VmFsdWVzKHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICByZXR1cm4gdXNlRGVmYXVsdFZhbHVlc0J1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZU91dHB1dERpcmVjdG9yeUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgc3JjRGlyTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHNyY0RpckxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfT1VUUFVUX0RJUkVDVE9SWSk7Ci0gICAgICAgIHNyY0RpckxhYmVsLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUllfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBzcmNEaXJMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBmaW5hbCBDb21ibyBvdXRwdXREaXJDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBvdXRwdXREaXJDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9PVVRQVVRfRElSRUNUT1JZX1RPT0xUSVApOwotICAgICAgICBvdXRwdXREaXJDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhU291cmNlRm9sZGVyID0gb3V0cHV0RGlyQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEphdmFTb3VyY2VGb2xkZXIoamF2YVNvdXJjZUZvbGRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBvcHVsYXRlT3V0cHV0RGlyZWN0b3J5Q29tYm8ob3V0cHV0RGlyQ29tYm8sIG1vZGVsLmdldFByb2plY3ROYW1lKCkpOwotCi0gICAgICAgIHJldHVybiBvdXRwdXREaXJDb21ibzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcG9wdWxhdGVPdXRwdXREaXJlY3RvcnlDb21ibyhDb21ibyBvdXRwdXREaXJDb21ibywgU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIG91dHB1dERpckNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwYWNrYWdlRnJhZ21lbnRSb290cyA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKQotICAgICAgICAgICAgLmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VGcmFnbWVudFJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IHBhY2thZ2VGcmFnbWVudFJvb3RzW2ldOwotICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlRnJhZ21lbnRSb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXJDb21iby5hZGQocGFja2FnZUZyYWdtZW50Um9vdC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXRwdXREaXJDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRlVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVQYWNrYWdlTmFtZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgcGFja2FnZU5hbWVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgcGFja2FnZU5hbWVMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lTGFiZWwuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX1RPT0xUSVApOwotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWVMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlUGFja2FnZU5hbWVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBmaW5hbCBUZXh0IHBhY2thZ2VOYW1lVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGV4dC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QQUNLQUdFX05BTUVfVE9PTFRJUCk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkucHV0KG1vZGVsLmdldFRhcmdldE5hbWVzcGFjZSgpLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBhY2thZ2VOYW1lVGV4dC5zZXRUZXh0KG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLmdldChtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKSkpOwotCi0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZVRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlTmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBmaW5hbCBCdXR0b24gbmFtZXNwYWNlTWFwcGluZ0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX09QVElPTkFMKTsKLSAgICAgICAgbmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QQUNLQUdFX05BTUVfT1BUSU9OQUxfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVWaWV3ZXJDb2x1bW4gY3JlYXRlV1NETE5hbWVzcGFjZVZpZXdlckNvbHVtbihUYWJsZVZpZXdlciB0YWJsZVZpZXdlcikgewotICAgICAgICBUYWJsZVZpZXdlckNvbHVtbiB3c2RsTmFtZXNwYWNlVmlld2VyQ29sdW1uID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKHRhYmxlVmlld2VyLCBTV1QuTEVGVCk7Ci0gICAgICAgIHdzZGxOYW1lc3BhY2VWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgVGFibGVDb2x1bW4gd3NkbE5hbWVzcGFjZUNvbHVtbiA9IHdzZGxOYW1lc3BhY2VWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHdzZGxOYW1lc3BhY2VDb2x1bW4uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9XU0RMX05BTUVTUEFDRV9DT0xVTU5fSEVBREVSKTsKLSAgICAgICAgd3NkbE5hbWVzcGFjZUNvbHVtbi5wYWNrKCk7Ci0gICAgICAgIHJldHVybiB3c2RsTmFtZXNwYWNlVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVWaWV3ZXJDb2x1bW4gY3JlYXRlUGFja2FnZU5hbWVDb2x1bW4oVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIsIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBUYWJsZVZpZXdlckNvbHVtbiBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbiA9IG5ldyBUYWJsZVZpZXdlckNvbHVtbih0YWJsZVZpZXdlciwgU1dULkxFRlQpOwotICAgICAgICBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQYWNrYWdlTmFtZUNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwpKTsKLQotICAgICAgICBUYWJsZUNvbHVtbiBwYWNrYWdlTmFtZUNvbHVtbiA9IHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICBwYWNrYWdlTmFtZUNvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9DT0xVTU5fSEVBREVSKTsKLSAgICAgICAgcGFja2FnZU5hbWVDb2x1bW4ucGFjaygpOwotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWVWaWV3ZXJDb2x1bW47Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVTZXJ2aWNlTmFtZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgc2VydmljZU5hbWVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgc2VydmljZU5hbWVMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIHNlcnZpY2VOYW1lTGFiZWwuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfU0VSVklDRV9OQU1FX1RPT0xUSVApOwotICAgICAgICByZXR1cm4gc2VydmljZU5hbWVMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZVNlcnZpY2VOYW1lQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIHNlcnZpY2VOYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIHNlcnZpY2VOYW1lQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfU0VSVklDRV9OQU1FX1RPT0xUSVApOwotCi0gICAgICAgIHNlcnZpY2VOYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0U2VydmljZU5hbWUoc2VydmljZU5hbWVDb21iby5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBwb3B1bGF0ZVNlcnZpY2VOYW1lQ29tYm8oc2VydmljZU5hbWVDb21ibywgbW9kZWwpOwotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZUNvbWJvOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwb3B1bGF0ZVNlcnZpY2VOYW1lQ29tYm8oQ29tYm8gc2VydmljZU5hbWVDb21ibywgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHNlcnZpY2VOYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG1vZGVsLmdldFdzZGxEZWZpbml0aW9uKCk7Ci0gICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlc01hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU2V0IHNlcnZpY2VzRW50cnlTZXQgPSBzZXJ2aWNlc01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VzSXRlcmF0b3IgPSBzZXJ2aWNlc0VudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNlcnZpY2VzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBzZXJ2aWNlRW50cnkgPSAoTWFwLkVudHJ5KSBzZXJ2aWNlc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IHNlcnZpY2UuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWVDb21iby5hZGQocU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZUNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUJpbmRpbmdGaWxlc0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgYmluZGluZ0ZpbGVzTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19GSUxFUyk7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xhYmVsLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfTkFNRV9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdGaWxlc0xhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBjcmVhdGVCaW5kaW5nRmlsZXNMaXN0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZmluYWwgTGlzdCBiaW5kaW5nRmlsZXNMaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICAgICAgYmluZGluZ0ZpbGVzTGlzdC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9CSU5ESU5HX05BTUVfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nRmlsZXNMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUFkZEJpbmRpbmdGaWxlQnV0dG9uKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCwKLSAgICAgICAgICAgIGZpbmFsIExpc3QgYmluZGluZ0ZpbGVzTGlzdCkgewotICAgICAgICBCdXR0b24gYWRkQmluZGluZ0ZpbGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBhZGRCaW5kaW5nRmlsZUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfRklMRVNfQUREKTsKLSAgICAgICAgYWRkQmluZGluZ0ZpbGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyBzZWxlY3Rpb25EaWFsb2cgPSBuZXcgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ4bWwiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9CSU5ESU5HX0ZJTEVfRElBTE9HX0ZJTFRFUl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19USVRMRSk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19NRVNTQUdFKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBTZWxlY3Rpb25EaWFsb2cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZGVsLmdldEJpbmRpbmdGaWxlcygpLmNvbnRhaW5zKHJlc3VsdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldEJpbmRpbmdGaWxlcygpLmFkZChyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0ZpbGVzTGlzdC5hZGQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBhZGRCaW5kaW5nRmlsZUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVSZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwsCi0gICAgICAgICAgICBmaW5hbCBMaXN0IGJpbmRpbmdGaWxlc0xpc3QpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9CSU5ESU5HX0ZJTEVTX1JFTU9WRSk7Ci0gICAgICAgIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGVkQmluZGluZ0ZpbGVzID0gYmluZGluZ0ZpbGVzTGlzdC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBiaW5kaW5nRmlsZSA6IHNlbGVjdGVkQmluZGluZ0ZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmdGaWxlc0xpc3QucmVtb3ZlKGJpbmRpbmdGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0QmluZGluZ0ZpbGVzKCkucmVtb3ZlKGJpbmRpbmdGaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYmluZGluZ0ZpbGVzTGlzdC5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYmluZGluZ0ZpbGVzTGlzdC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmluZGluZ0ZpbGVzTGlzdC5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVQYWRkaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICByZXR1cm4gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlWE1MQ2F0YWxvZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgeG1sQ2F0YWxvZ0xhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICB4bWxDYXRhbG9nTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YTUxfQ0FUTE9HKTsKLSAgICAgICAgeG1sQ2F0YWxvZ0xhYmVsLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hNTF9DQVRBTE9HX1RPT0xUSVApOwotICAgICAgICByZXR1cm4geG1sQ2F0YWxvZ0xhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVYTUxDYXRhbG9nVGV4dChDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgVGV4dCB4bWxDYXRhbG9nVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0gICAgICAgIHhtbENhdGFsb2dUZXh0LnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hNTF9DQVRBTE9HX1RPT0xUSVApOwotICAgICAgICB4bWxDYXRhbG9nVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgeG1sQ2F0YWxvZyA9IHhtbENhdGFsb2dUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRDYXRhbG9nRmlsZSh4bWxDYXRhbG9nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIHhtbENhdGFsb2dUZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVhNTENhdGFsb2dCcm93c2VCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24geG1sQ2F0YWxvZ0Jyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIHhtbENhdGFsb2dCcm93c2VCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YTUxfQ0FUTE9HX0JST1dTRSk7Ci0gICAgICAgIHJldHVybiB4bWxDYXRhbG9nQnJvd3NlQnV0dG9uOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGQ2xhc3NwYXRoQ29udGFpbmVyUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGQ2xhc3NwYXRoQ29udGFpbmVyUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE4NzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aXphcmRzL0NYRkNsYXNzcGF0aENvbnRhaW5lclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2l6YXJkczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5JQ2xhc3NwYXRoQ29udGFpbmVyUGFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuSUNsYXNzcGF0aENvbnRhaW5lclBhZ2VFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsNCi0NCi1wdWJsaWMgY2xhc3MgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBJQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSwgSUNsYXNzcGF0aENvbnRhaW5lclBhZ2VFeHRlbnNpb24gew0KLQ0KLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7DQotICAgIHByaXZhdGUgQ29tYm9WaWV3ZXIgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyOw0KLSAgICBwcml2YXRlIExpbmsgbGluazsNCi0gICAgcHJpdmF0ZSBDWEZDb250ZXh0IGNvbnRleHQ7DQotICAgIHByaXZhdGUgQ1hGSW5zdGFsbCBkZWZhdWx0SW5zdGFsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW50YWxsZWRWZXJzaW9uOw0KLQ0KLSAgICBwdWJsaWMgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSgpIHsNCi0gICAgICAgIHN1cGVyKCJjeGYuY2xhc3NwYXRoLmNvbnRhaW5lci5wYWdlIik7DQotICAgICAgICBzZXRUaXRsZShDWEZVSU1lc3NhZ2VzLkNYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX1RJVExFKTsNCi0gICAgICAgIHNldERlc2NyaXB0aW9uKENYRlVJTWVzc2FnZXMuQ1hGX0lOU1RBTExfV0laQVJEX1BBR0VfREVTQ1JJUFRJT04pOw0KLSAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKENYRlVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiaWNvbnMvd2l6YmFuL2xpYnJhcnlfd2l6LnBuZyIpKTsNCi0gICAgICAgIGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGZpbmlzaCgpIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0U2VsZWN0aW9uKCkgew0KLSAgICAgICAgQ1hGSW5zdGFsbCBzZWxlY3RlZEluc3RhbGwgPSBnZXRTZWxlY3RlZEluc3RhbGwoKTsNCi0gICAgICAgIGlmIChzZWxlY3RlZEluc3RhbGwgIT0gbnVsbCAmJiAhc2VsZWN0ZWRJbnN0YWxsLmdldFZlcnNpb24oKS5lcXVhbHMoaW50YWxsZWRWZXJzaW9uKSkgew0KLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldENYRlJ1bnRpbWVWZXJzaW9uKHByb2plY3QsIHNlbGVjdGVkSW5zdGFsbC5nZXRWZXJzaW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIElDbGFzc3BhdGhBdHRyaWJ1dGUganN0Q29tcG9uZW50RGVwZW5kZW5jeSA9DQotICAgICAgICAgICAgICAgIEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZSgib3JnLmVjbGlwc2UuanN0LmNvbXBvbmVudC5kZXBlbmRlbmN5IiwgIi9XRUItSU5GL2xpYiIpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKENYRkNvcmVQbHVnaW4uQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfSUQpOw0KLSAgICAgICAgICAgIHBhdGggPSBwYXRoLmFwcGVuZChzZWxlY3RlZEluc3RhbGwuZ2V0VHlwZSgpKTsNCi0gICAgICAgICAgICBwYXRoID0gcGF0aC5hcHBlbmQoc2VsZWN0ZWRJbnN0YWxsLmdldFZlcnNpb24oKSk7DQotICAgICAgICAgICAgcmV0dXJuIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KHBhdGgsIG5ldyBJQWNjZXNzUnVsZVswXSwNCi0gICAgICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKQ0KLSAgICAgICAgICAgICAgICAgICAgPyBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtde2pzdENvbXBvbmVudERlcGVuZGVuY3l9IDogbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbXXt9LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJQ2xhc3NwYXRoRW50cnkgY29udGFpbmVyRW50cnkpIHsNCi0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpbnRhbGxlZFZlcnNpb24gPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDWEZSdW50aW1lVmVyc2lvbihwcm9qZWN0KTsNCi0gICAgICAgICAgICBkZWZhdWx0SW5zdGFsbCA9IGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpLmdldChpbnRhbGxlZFZlcnNpb24pOw0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0SW5zdGFsbCAhPSBudWxsICYmIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmYXVsdEluc3RhbGwpLCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsNCi0NCi0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsNCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7DQotDQotICAgICAgICBsaW5rID0gbmV3IExpbmsoY29tcG9zaXRlLCBTV1QuTk9ORSk7DQotICAgICAgICBsaW5rLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfQ09ORklHVVJFX0lOU1RBTExFRF9SVU5USU1FU19MQUJFTCk7DQotICAgICAgICBsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgaW50IHNlbGVjdGVkSW5kZXggPSBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5nZXRTZWxlY3Rpb25JbmRleCgpOw0KLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UiLCAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS5DWEZSdW50aW1lUHJlZmVyZW5jZXNQYWdlIn0sIG51bGwpLm9wZW4oKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykgew0KLSAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnJlZnJlc2goKTsNCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRDb21ibygpLnNlbGVjdChzZWxlY3RlZEluZGV4KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsNCi0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsNCi0gICAgICAgIGxpbmsuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQotDQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsNCi0gICAgICAgIGxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUFJPUEVSVFlfUEFHRV9SVU5USU1FX0xBQkVMKTsNCi0NCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsNCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOw0KLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQotDQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsNCi0NCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsNCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDWEZJbnN0YWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBDWEZJbnN0YWxsIGN4Zkluc3RhbGwgPSAoQ1hGSW5zdGFsbCkgZWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjeGZJbnN0YWxsLmdldFR5cGUoKSArICIgIiArIGN4Zkluc3RhbGwuZ2V0VmVyc2lvbigpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgQ29sbGVjdGlvbjxDWEZJbnN0YWxsPiBpbnN0YWxsYXRpb25zID0gY29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkudmFsdWVzKCk7DQotDQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0SW5wdXQoaW5zdGFsbGF0aW9ucyk7DQotDQotICAgICAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7DQotICAgICAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7DQotICAgICAgICBzZXRTZWxlY3Rpb24obnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeVtdIGN1cnJlbnRFbnRyaWVzKSB7DQotICAgICAgICBpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENYRkluc3RhbGwgZ2V0U2VsZWN0ZWRJbnN0YWxsKCkgew0KLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsNCi0gICAgICAgIGlmICghc3RydWN0dXJlZFNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBDWEZJbnN0YWxsIHNlbGVjdGVkSW5zdGFsbCA9IChDWEZJbnN0YWxsKSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEluc3RhbGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZGYWNldEluc3RhbGxXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZGYWNldEluc3RhbGxXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNWYxZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGRmFjZXRJbnN0YWxsV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuQWJzdHJhY3RGYWNldFdpemFyZFBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDWEZGYWNldEluc3RhbGxXaXphcmRQYWdlIGV4dGVuZHMgQWJzdHJhY3RGYWNldFdpemFyZFBhZ2UgewotCi0gICAgcHJpdmF0ZSBDWEZEYXRhTW9kZWwgZGF0YU1vZGVsOwotICAgIHByaXZhdGUgQ1hGQ29udGV4dCBjeGZDb250ZXh0OwotCi0gICAgcHJpdmF0ZSBDb21ib1ZpZXdlciBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXI7Ci0KLSAgICBwdWJsaWMgQ1hGRmFjZXRJbnN0YWxsV2l6YXJkUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoImN4Zi5jb3JlLmZhY2V0Lmluc3RhbGwucGFnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldFRpdGxlKENYRlVJTWVzc2FnZXMuQ1hGX0ZBQ0VUX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEUpOwotICAgICAgICBzZXREZXNjcmlwdGlvbihDWEZVSU1lc3NhZ2VzLkNYRl9GQUNFVF9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgY3hmQ29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnKE9iamVjdCBjb25maWcpIHsKLSAgICAgICAgZGF0YU1vZGVsID0gKENYRkRhdGFNb2RlbCkgY29uZmlnOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRyYW5zZmVyU3RhdGVUb0NvbmZpZygpIHsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgQ1hGSW5zdGFsbCBzZWxlY3RlZEluc3RhbGwgPSAoQ1hGSW5zdGFsbCkgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHNlbGVjdGVkSW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkYXRhTW9kZWwuc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKHNlbGVjdGVkSW5zdGFsbC5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgZGF0YU1vZGVsLnNldERlZmF1bHRSdW50aW1lTG9jYXRpb24oc2VsZWN0ZWRJbnN0YWxsLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgZGF0YU1vZGVsLnNldERlZmF1bHRSdW50aW1lVHlwZShzZWxlY3RlZEluc3RhbGwuZ2V0VHlwZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgTGluayBsaW5rID0gbmV3IExpbmsoY29tcG9zaXRlLCBTV1QuUklHSFQpOwotICAgICAgICBsaW5rLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfQ09ORklHVVJFX0lOU1RBTExFRF9SVU5USU1FU19MQUJFTCk7Ci0gICAgICAgIGxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpbnQgc2VsZWN0ZWRJbmRleCA9IGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRDb21ibygpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS5DWEZSdW50aW1lUHJlZmVyZW5jZXNQYWdlIiB9LCBudWxsKS5vcGVuKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgICAgICBzZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGxpbmsuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUFJPUEVSVFlfUEFHRV9SVU5USU1FX0xBQkVMKTsKLQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQ29sbGVjdGlvbjw/PikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ1hGSW5zdGFsbCkgewotICAgICAgICAgICAgICAgICAgICBDWEZJbnN0YWxsIGN4Zkluc3RhbGwgPSAoQ1hGSW5zdGFsbCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGwuZ2V0VHlwZSgpICsgIiAiICsgY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBDb2xsZWN0aW9uPENYRkluc3RhbGw+IGluc3RhbGxhdGlvbnMgPSBjeGZDb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKS52YWx1ZXMoKTsKLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnNldElucHV0KGluc3RhbGxhdGlvbnMpOwotICAgICAgICBzZXREZWZhdWx0KCk7Ci0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdCgpIHsKLSAgICAgICAgU3RyaW5nIGludGFsbGVkVmVyc2lvbiA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCk7Ci0gICAgICAgIENYRkluc3RhbGwgZGVmYXVsdEluc3RhbGwgPSBjeGZDb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKS5nZXQoaW50YWxsZWRWZXJzaW9uKTsKLSAgICAgICAgaWYgKGRlZmF1bHRJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmYXVsdEluc3RhbGwpLCB0cnVlKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZJbnN0YWxsV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZJbnN0YWxsV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NDE0MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGSW5zdGFsbFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ1hGSW5zdGFsbFdpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0KLSAgICBwcml2YXRlIENYRkluc3RhbGxXaXphcmRQYWdlIGN4Zkluc3RhbGxXaXphcmRQYWdlOwotICAgIHByaXZhdGUgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsOwotCi0gICAgcHVibGljIENYRkluc3RhbGxXaXphcmQoKSB7Ci0gICAgICAgIHNldFdpbmRvd1RpdGxlKENYRlVJTWVzc2FnZXMuQ1hGX0lOU1RBTExfV0laQVJEX0FERF9XSU5ET1dfVElUTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDWEZJbnN0YWxsV2l6YXJkKENYRkluc3RhbGwgY3hmSW5zdGFsbCkgewotICAgICAgICB0aGlzLmN4Zkluc3RhbGwgPSBjeGZJbnN0YWxsOwotICAgICAgICBzZXRXaW5kb3dUaXRsZShDWEZVSU1lc3NhZ2VzLkNYRl9JTlNUQUxMX1dJWkFSRF9FRElUX1dJTkRPV19USVRMRSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0gICAgICAgIGlmIChjeGZJbnN0YWxsV2l6YXJkUGFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjeGZJbnN0YWxsV2l6YXJkUGFnZSA9IG5ldyBDWEZJbnN0YWxsV2l6YXJkUGFnZSgpOwotICAgICAgICAgICAgaWYgKGN4Zkluc3RhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGN4Zkluc3RhbGxXaXphcmRQYWdlLnNldENYRkluc3RhbGwoY3hmSW5zdGFsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYWRkUGFnZShjeGZJbnN0YWxsV2l6YXJkUGFnZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGxXaXphcmRQYWdlLmZpbmlzaCgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZJbnN0YWxsV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGSW5zdGFsbFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3OGRkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZJbnN0YWxsV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5DWEZQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuTGF1bmNoVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBDWEZJbnN0YWxsV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotICAgIHByaXZhdGUgSVN0YXR1cyBDWEZfTE9DQVRJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsIG51bGwpOwotICAgIHByaXZhdGUgSVN0YXR1cyBDWEZfVFlQRV9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgbnVsbCk7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIENYRl9WRVJTSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCBudWxsKTsKLSAgICBwcml2YXRlIElTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBQYXR0ZXJuIGRpZ2l0UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXFxkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLSAgICBwcml2YXRlIFRleHQgY3hmSG9tZURpclRleHQ7Ci0gICAgcHJpdmF0ZSBUZXh0IGN4ZlR5cGVUZXh0OwotICAgIHByaXZhdGUgVGV4dCBjeGZWZXJzaW9uVGV4dDsKLQotICAgIFN0cmluZyBjeGZSdW50aW1lVmVyc2lvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIGN4ZlJ1bnRpbWVMb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIGN4ZlJ1bnRpbWVUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsOwotCi0gICAgcHJvdGVjdGVkIENYRkluc3RhbGxXaXphcmRQYWdlKCkgewotICAgICAgICBzdXBlcigiY3hmLmludGFsbC53aXphcmQucGFnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldFRpdGxlKENYRlVJTWVzc2FnZXMuQ1hGX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEUpOwotICAgICAgICBzZXREZXNjcmlwdGlvbihDWEZVSU1lc3NhZ2VzLkNYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKENYRlVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiaWNvbnMvd2l6YmFuL2xpYnJhcnlfd2l6LnBuZyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX0hPTUVfRElSX0xBQkVMKTsKLQotICAgICAgICBjeGZIb21lRGlyVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgY3hmSG9tZURpclRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgY3hmSG9tZURpclRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTG9jYXRpb25TdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQlJPV1NFX0JVVFRPTl9MQUJFTCk7Ci0KLSAgICAgICAgYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRGlyZWN0b3J5RGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGNvbXBvc2l0ZS5nZXRTaGVsbCgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjeGZIb21lRGlyVGV4dC5zZXRUZXh0KGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vQ1hGIFZlcnNpb24KLSAgICAgICAgTGFiZWwgY3hmVmVyc2lvbkxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBjeGZWZXJzaW9uTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9DWEZfVkVSU0lPTl9MQUJFTCk7Ci0KLSAgICAgICAgY3hmVmVyc2lvblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgY3hmVmVyc2lvblRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGN4ZlZlcnNpb25UZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVZlcnNpb25TdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy9CbGFuayBsYWJlbAotICAgICAgICBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgLy9DWEYgVHlwZQotICAgICAgICBMYWJlbCBjeGZUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGN4ZlR5cGVMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9UWVBFX0xBQkVMKTsKLQotICAgICAgICBjeGZUeXBlVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGN4ZlR5cGVUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBjeGZUeXBlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVUeXBlU3RhdHVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmIChjeGZJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGN4ZkhvbWVEaXJUZXh0LnNldFRleHQoY3hmSW5zdGFsbC5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIGN4ZlZlcnNpb25UZXh0LnNldFRleHQoY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgY3hmVHlwZVRleHQuc2V0VGV4dChjeGZJbnN0YWxsLmdldFR5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDWEZJbnN0YWxsKENYRkluc3RhbGwgY3hmSW5zdGFsbCkgewotICAgICAgICB0aGlzLmN4Zkluc3RhbGwgPSBjeGZJbnN0YWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMb2NhdGlvblN0YXR1cygpIHsKLSAgICAgICAgQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IGNoZWNrUnVudGltZUV4aXN0KGN4ZkhvbWVEaXJUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgIGFwcGx5U3RhdHVzVG9QYWdlKGZpbmRNb3N0U2V2ZXJlKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUeXBlU3RhdHVzKCkgewotICAgICAgICBDWEZfVFlQRV9TVEFUVVMgPSB2YWxpZGF0ZVR5cGVOYW1lKGN4ZlR5cGVUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgIGFwcGx5U3RhdHVzVG9QYWdlKGZpbmRNb3N0U2V2ZXJlKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVWZXJzaW9uU3RhdHVzKCkgewotICAgICAgICBDWEZfVkVSU0lPTl9TVEFUVVMgPSB2YWxpZGF0ZVZlcnNpb24oY3hmVmVyc2lvblRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgYXBwbHlTdGF0dXNUb1BhZ2UoZmluZE1vc3RTZXZlcmUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U3RhdHVzVG9QYWdlKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID4gSVN0YXR1cy5PSykgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0TWVzc2FnZShnZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyBmaW5kTW9zdFNldmVyZSgpIHsKLSAgICAgICAgaWYgKENYRl9UWVBFX1NUQVRVUy5nZXRTZXZlcml0eSgpID4gQ1hGX0xPQ0FUSU9OX1NUQVRVUy5nZXRTZXZlcml0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1hGX1RZUEVfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDWEZfVkVSU0lPTl9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSA+IENYRl9MT0NBVElPTl9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIENYRl9WRVJTSU9OX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ1hGX1RZUEVfU1RBVFVTLmdldFNldmVyaXR5KCkgPT0gQ1hGX0xPQ0FUSU9OX1NUQVRVUy5nZXRTZXZlcml0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ1hGX1ZFUlNJT05fU1RBVFVTLmdldFNldmVyaXR5KCkgPT0gQ1hGX0xPQ0FUSU9OX1NUQVRVUy5nZXRTZXZlcml0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDWEZfTE9DQVRJT05fU1RBVFVTOwotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyBjaGVja1J1bnRpbWVFeGlzdChTdHJpbmcgcGF0aCkgewotICAgICAgICBGaWxlIGN4ZkhvbWVEaXIgPSBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgaWYgKGN4ZkhvbWVEaXJUZXh0LmdldFRleHQoKS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBDWEZfTE9DQVRJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfTk9UX1NFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGN4ZkxpYlBhdGggPSBjeGZIb21lRGlyICsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpICsgImxpYiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpZiAoY3hmSG9tZURpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBGaWxlIGN4ZkxpYkZvbGRlciA9IG5ldyBGaWxlKGN4ZkxpYlBhdGgpOwotICAgICAgICAgICAgaWYgKGN4ZkxpYkZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gY3hmSmFyRmlsZXMgPSBnZXRDWEZKYXJGaWxlcyhjeGZMaWJGb2xkZXIpOwotICAgICAgICAgICAgICAgIGlmIChjeGZKYXJGaWxlcyAhPSBudWxsICYmIGN4ZkphckZpbGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgSVN0YXR1cyB0b29sVmVyc2lvblN0YXR1cyA9IGdldFRvb2xWZXJzaW9uKGN4ZkxpYlBhdGgpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVG9vbFZlcnNpb24odG9vbFZlcnNpb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IE9LX1NUQVRVUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY3hmVHlwZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIGN4ZlZlcnNpb25UZXh0LnNldFRleHQoIiIpOwotICAgICAgICBDWEZfTE9DQVRJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX05PVF9TRVQpOwotICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpIHsKLSAgICAgICAgaWYgKHR5cGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBDWEZfVFlQRV9TVEFUVVMgPSBuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCBDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FTlRFUl9UWVBFX05BTUUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1hGX1RZUEVfU1RBVFVTID0gT0tfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdHlwZU5hbWUubWF0Y2hlcygiW2EtekEtWjAtOV9cXC1cXHNdKyIpKSB7Ci0gICAgICAgICAgICBDWEZfVFlQRV9TVEFUVVMgPSBuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLmJpbmQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfSU5WQUxJRF9UWVBFX05BTUUsIHR5cGVOYW1lKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDWEZfVFlQRV9TVEFUVVMgPSBPS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENYRl9UWVBFX1NUQVRVUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0gICAgICAgIGlmIChDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmdldEluc3RhbGxhdGlvbnMoKS5jb250YWluc0tleSh2ZXJzaW9uKQotICAgICAgICAgICAgICAgICYmIGN4Zkluc3RhbGwgIT0gbnVsbCAmJiAhY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCkuZXF1YWxzKHZlcnNpb24pKSB7Ci0gICAgICAgICAgICBDWEZfVkVSU0lPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgIlZlcnNpb24gYWxyZWFkeSBpbnN0YWxsZWQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENYRl9WRVJTSU9OX1NUQVRVUyA9IE9LX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ1hGX1ZFUlNJT05fU1RBVFVTOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0Q1hGSmFyRmlsZXMoRmlsZSBkaXJlY3RvcnkpIHsKLSAgICAgICAgU3RyaW5nW10gY3hmSmFyRmlsZXMgPSBkaXJlY3RvcnkubGlzdChuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiY3hmIikgJiYgbmFtZS5lbmRzV2l0aCgiLmphciIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGlnaXRQYXR0ZXJuLm1hdGNoZXIobmFtZSkuZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gY3hmSmFyRmlsZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIGdldFRvb2xWZXJzaW9uKFN0cmluZyBjeExpYkZvbGRlclBhdGgpIHsKLSAgICAgICAgRmlsZSBjeGZMaWJGb2xkZXIgPSBuZXcgRmlsZShjeExpYkZvbGRlclBhdGgpOwotICAgICAgICBMaXN0PFN0cmluZz4gY3hmTGliID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZ1tdIGphckZpbGVzID0gY3hmTGliRm9sZGVyLmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmb3IgKFN0cmluZyBqYXJGaWxlIDogamFyRmlsZXMpIHsKLSAgICAgICAgICAgIGN4ZkxpYi5hZGQoY3hMaWJGb2xkZXJQYXRoICsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpICsgamFyRmlsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIElTdGF0dXMgdG9vbFZlcnNpb25TdGF0dXMgPSBMYXVuY2hVdGlscy5sYXVuY2goY3hmTGliLnRvQXJyYXkobmV3IFN0cmluZ1tjeGZMaWIuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY3hmLnRvb2xzLndzZGx0by5XU0RMVG9KYXZhIiwgbmV3IFN0cmluZ1tdIHsgIi12IiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHJldHVybiB0b29sVmVyc2lvblN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1Rvb2xWZXJzaW9uKElTdGF0dXMgdG9vbFZlcnNpb25TdGF0dXMpIHsKLSAgICAgICAgaWYgKHRvb2xWZXJzaW9uU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY3hmVG9vbFZlcnNpb24gPSB0b29sVmVyc2lvblN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIGN4ZlRvb2xWZXJzaW9uID0gY3hmVG9vbFZlcnNpb24uc3Vic3RyaW5nKGN4ZlRvb2xWZXJzaW9uLmluZGV4T2YoIi0iKSArIDEsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgY3hmVG9vbFZlcnNpb24ubGVuZ3RoKCkpLnRyaW0oKTsKLQotICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gZGlnaXRQYXR0ZXJuLm1hdGNoZXIoY3hmVG9vbFZlcnNpb24pOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gbWF0Y2hlci5zdGFydCgpOwotICAgICAgICAgICAgICAgIGludCBlbmQgPSBtYXRjaGVyLmVuZCgpOwotICAgICAgICAgICAgICAgIHdoaWxlIChtYXRjaGVyLmZpbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBlbmQgPSBtYXRjaGVyLmVuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjeGZSdW50aW1lVHlwZSA9IGN4ZlRvb2xWZXJzaW9uLnN1YnN0cmluZygwLCBzdGFydCkudHJpbSgpOwotICAgICAgICAgICAgICAgIGN4ZlJ1bnRpbWVWZXJzaW9uID0gY3hmVG9vbFZlcnNpb24uc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjeGZWZXJzaW9uVGV4dC5zZXRUZXh0KGN4ZlJ1bnRpbWVWZXJzaW9uKTsKLSAgICAgICAgICAgIGN4ZlR5cGVUZXh0LnNldFRleHQoY3hmUnVudGltZVR5cGUpOwotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q3VycmVudFJ1bnRpbWVWZXJzaW9uKG5ldyBWZXJzaW9uKGN4ZlJ1bnRpbWVWZXJzaW9uKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5pc2goKSB7Ci0gICAgICAgIENYRlBlcnNpc3RlbnRDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgICAgICBNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiBpbnN0YWxscyA9IGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpOwotICAgICAgICBDWEZJbnN0YWxsIGluc3RhbGwgPSBDWEZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDWEZJbnN0YWxsKCk7Ci0gICAgICAgIGluc3RhbGwuc2V0VmVyc2lvbihjeGZWZXJzaW9uVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAgICAgaW5zdGFsbC5zZXRMb2NhdGlvbihjeGZIb21lRGlyVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAgICAgaW5zdGFsbC5zZXRUeXBlKGN4ZlR5cGVUZXh0LmdldFRleHQoKS50cmltKCkpOwotICAgICAgICBpbnN0YWxscy5wdXQoY3hmUnVudGltZVZlcnNpb24sIGluc3RhbGwpOwotICAgICAgICBjb250ZXh0LnNldEluc3RhbGxhdGlvbnMoaW5zdGFsbHMpOwotICAgICAgICBpZiAoaXNVcGRhdGVSZXF1aXJlZChpbnN0YWxsKSkgewotICAgICAgICAgICAgdXBkYXRlUHJvamVjdHMoaW5zdGFsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVcGRhdGVSZXF1aXJlZChDWEZJbnN0YWxsIGluc3RhbGwpIHsKLSAgICAgICAgaWYgKGN4Zkluc3RhbGwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghY3hmSW5zdGFsbC5nZXRMb2NhdGlvbigpLmVxdWFscyhpbnN0YWxsLmdldExvY2F0aW9uKCkpCi0gICAgICAgICAgICAgICAgfHwgIWN4Zkluc3RhbGwuZ2V0VHlwZSgpLmVxdWFscyhpbnN0YWxsLmdldFR5cGUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQcm9qZWN0cyhDWEZJbnN0YWxsIGluc3RhbGwpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNldDxJRmFjZXRlZFByb2plY3Q+IGN4ZlByb2plY3RzID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0RmFjZXRlZFByb2plY3RzKFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgiY3hmLmNvcmUiKSk7Ci0gICAgICAgICAgICBJdGVyYXRvcjxJRmFjZXRlZFByb2plY3Q+IHByb2pJdGVyID0gY3hmUHJvamVjdHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChwcm9qSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3QgY3hmUHJvamVjdCA9IHByb2pJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW5zdGFsbGVkVmVyc2lvbiA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENYRlJ1bnRpbWVWZXJzaW9uKGN4ZlByb2plY3QuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbGVkVmVyc2lvbi5lcXVhbHMoaW5zdGFsbC5nZXRWZXJzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9JRCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCBjb250YWluZXJQYXRoID0gbmV3IFBhdGgoQ1hGQ29yZVBsdWdpbi5DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoY3hmUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyIGN4ZkNsYXNzcGF0aENvbnRhaW5lciA9IG5ldyBDWEZDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIucmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShjb250YWluZXJQYXRoLCBqYXZhUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3hmQ2xhc3NwYXRoQ29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMwY2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1ZDMzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2UwMDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gRmViIDAyIDExOjUwOjQyIEdNVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3ZDY1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVJlZ2lzdGVyQnVkZHk6IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXhiLmNvcmUuSkFYQkNvcmVQbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheGIuY29yZQotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb247dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVyczt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQuaW5pIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiOTNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yIGZlYXR1cmUgZGV0YWlscyBpbiB0aGUgIkFib3V0IiAKLSMgZGlhbG9nICh0cmFuc2xhdGVkKS4gIE1heGltdW0gMTUgbGluZXMgYW5kIDc1IGNoYXJhY3RlcnMgcGVyIGxpbmUuCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQubWFwcGluZ3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZWIyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZSBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SkFYQiBUb29sc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA5LCAyMDEwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvXG5cCi1cbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5ZDYxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmUxN2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNwcm9wZXJ0aWVzIGZpbGUgZm9yIEpBWEIgQ29yZQotcGx1Z2luTmFtZT1KQVhCIFRvb2xzIENvcmUKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUpBWEJfQ0FURUdPUllfTkFNRT1KQVhCCi0KLVhNTF9TQ0hFTUFfVFlQRV9SVUxFUz1WYWxpZGF0aW9uIHJ1bGVzIGdvdmVybmluZyB0aGUgdXNlIG9mIEBYbWxTY2hlbWFUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyMDcwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25DYXRlZ29yeSI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iJUpBWEJfQ0FURUdPUllfTkFNRSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yT3JkZXIiCi0gICAgICAgICAgICBuYW1lPSJYbWxBY2Nlc3Nvck9yZGVyIi8+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGUiCi0gICAgICAgICAgICBuYW1lPSJYbWxBY2Nlc3NvclR5cGUiLz4KLSAgICAgIAotICAgICAgPCEtLSBUT0RPIFJlaW5zdGF0ZSB3aGVuIFhtbEFkYXB0ZXIgaXNzdWUgaXMgc29sdmVkCi0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxBZGFwdGVyIgotICAgICAgICAgICAgbmFtZT0iWG1sQWRhcHRlciI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAtLT4KLSAgICAgIAotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55QXR0cmlidXRlIgotICAgICAgICAgICAgbmFtZT0iWG1sQW55QXR0cmlidXRlIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQiCi0gICAgICAgICAgICBuYW1lPSJYbWxBbnlFbGVtZW50Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dGFjaG1lbnRSZWYiCi0gICAgICAgICAgICBuYW1lPSJYbWxBdHRhY2htZW50UmVmIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbEF0dHJpYnV0ZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50IgotICAgICAgICAgICAgbmFtZT0iWG1sRWxlbWVudCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbCIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVsZW1lbnREZWNsIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWYiCi0gICAgICAgICAgICBuYW1lPSJYbWxFbGVtZW50UmVmIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWZzIgotICAgICAgICAgICAgbmFtZT0iWG1sRWxlbWVudFJlZnMiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFdyYXBwZXIiCi0gICAgICAgICAgICBuYW1lPSJYbWxFbGVtZW50V3JhcHBlciI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50cyIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVsZW1lbnRzIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVudW0iCi0gICAgICAgICAgICBuYW1lPSJYbWxFbnVtIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVudW1WYWx1ZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVudW1WYWx1ZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRCIKLSAgICAgICAgICAgIG5hbWU9IlhtbElEIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEUkVGIgotICAgICAgICAgICAgbmFtZT0iWG1sSURSRUYiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSW5saW5lQmluYXJ5RGF0YSIKLSAgICAgICAgICAgIG5hbWU9IlhtbElubGluZUJpbmFyeURhdGEiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyIgotICAgICAgICAgICAgbmFtZT0iWG1sSmF2YVR5cGVBZGFwdGVyIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcnMiCi0gICAgICAgICAgICBuYW1lPSJYbWxKYXZhVHlwZUFkYXB0ZXJzIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbExpc3QiCi0gICAgICAgICAgICBuYW1lPSJYbWxMaXN0Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE1pbWVUeXBlIgotICAgICAgICAgICAgbmFtZT0iWG1sTWltZVR5cGUiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTWl4ZWQiCi0gICAgICAgICAgICBuYW1lPSJYbWxNaXhlZCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxOcyIKLSAgICAgICAgICAgIG5hbWU9IlhtbE5zIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5IgotICAgICAgICAgICAgbmFtZT0iWG1sUmVnaXN0cnkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQiCi0gICAgICAgICAgICBuYW1lPSJYbWxSb290RWxlbWVudCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWEiCi0gICAgICAgICAgICBuYW1lPSJYbWxTY2hlbWEiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbFNjaGVtYVR5cGUiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZXMiCi0gICAgICAgICAgICBuYW1lPSJYbWxTY2hlbWFUeXBlcyI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTZWVBbHNvIgotICAgICAgICAgICAgbmFtZT0iWG1sU2VlQWxzbyI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQiCi0gICAgICAgICAgICBuYW1lPSJYbWxUcmFuc2llbnQiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbFR5cGUiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWUiCi0gICAgICAgICAgICBuYW1lPSJYbWxWYWx1ZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4Yi9jb3JlL0pBWEJDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmODgxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheGIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBKQVhCQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXhiLmNvcmUuSkFYQkNvcmVNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTkFNRV9ESUZGRVJFTlRfQ0FTRV9FWElTVFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9XSVRIX05BTUVfQUxSRUFEWV9FWElTVFM7Ci0gCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX1NDSEVNQV9UWVBFX01VU1RfSEFWRV9ERUZBVUxUX09OX0ZJRUxEX09SX01FVEhPRDsKLQkKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKQVhCQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpBWEJDb3JlTWVzc2FnZXMoKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4Yi9jb3JlL0pBWEJDb3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4MWJhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUgSW5jCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNKRFRVdGlscwotVFlQRV9OQU1FX0RJRkZFUkVOVF9DQVNFX0VYSVNUUz1BIFR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgY2FzZSBhbHJlYWR5IGV4aXN0cwotVFlQRV9XSVRIX05BTUVfQUxSRUFEWV9FWElTVFM9QSBjb21waWxhdGlvbiB1bml0IG5hbWVkICcnezB9JycgYWxyZWFkeSBleGlzdHMgaW4gcGFja2FnZSAnJ3sxfScnCi1YTUxfU0NIRU1BX1RZUEVfTVVTVF9IQVZFX0RFRkFVTFRfT05fRklFTERfT1JfTUVUSE9EPUlmIEBYbWxTY2hlbWFUeXBlIGlzIHVzZWQgb24gYSBmaWVsZCBvciBhIG1ldGhvZCwgdGhlbiB0aGUgdmFsdWUgb2YgdHlwZSgpIG11c3QgYmUgREVGQVVMVC5jbGFzcyAoSkFYQiAyLjEsIDguNi40LjIpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4Yi9jb3JlL0pBWEJDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0ZGI3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheGIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpBWEJDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkNvcmVQbHVnaW4gcGx1Z2luOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSkFYQkNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLSAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBKQVhCQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgSkFYQkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBKQVhCQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIEpBWEJDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWEJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMwY2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5NzcwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlMDAyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI01vbiBGZWIgMDIgMTE6NTA6NDIgR01UIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0N2U4NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVJlZ2lzdGVyQnVkZHk6IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gamF2YXgueG1sLnNvYXA7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5hcGFjaGUueGVyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMi45LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMS41LjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMsb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cyIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscwotSW1wb3J0LVBhY2thZ2U6IGphdmF4LmFjdGl2YXRpb24sCi0gamF2YXguandzLAotIGphdmF4Lmp3cy5zb2FwLAotIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb247dmVyc2lvbj0iMi4xLjAiLAotIGphdmF4LnhtbC53czt2ZXJzaW9uPSIyLjEuMCIsCi0gamF2YXgueG1sLndzLmh0dHA7dmVyc2lvbj0iMi4xLjAiLAotIGphdmF4LnhtbC53cy5zb2FwO3ZlcnNpb249IjIuMS4wIiwKLSBvcmcuamRvbTt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmpkb20uaW5wdXQ7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5qZG9tLm91dHB1dDt2ZXJzaW9uPSIxLjAuMCIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDE5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiOTNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5tYXBwaW5ncyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3ODhlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUpBWC1XUyBUb29sc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LCAyMDEwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvXG5cCi1cbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjlkNjEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YjZlMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZSBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jcHJvcGVydGllcyBmaWxlIGZvciBKQVhXUyBDb3JlCi1wbHVnaW5OYW1lPUpBWC1XUyBUb29scyBDb3JlCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1XRUJTRVJWSUNFX0NMQVNTX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SX1JVTEU9Q2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IGhhdmUgYSBkZWZhdWx0IHB1YmxpYyBjb25zdHJ1Y3RvcgotV0VCU0VSVklDRV9DTEFTU19QVUJMSUNfQUJTVFJBQ1RfRklOQUxfUlVMRT1DbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlIG11c3QgYmUgYW4gb3V0ZXIgcHVibGljIGNsYXNzLCBtdXN0IG5vdCBiZSBmaW5hbCwgYW5kIG11c3Qgbm90IGJlIGFic3RyYWN0Ci1XRUJTRVJWSUNFX0NMQVNTX05PX0ZJTkFMSVpFX01FVEhPRF9SVUxFPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2UgbXVzdCBub3QgZGVmaW5lIGEgZmluYWxpemUoKSBtZXRob2QKLVdFQk1FVEhPRF9PTkxZX1NVUFBPUlRFRF9PTl9DTEFTU0VTX1dJVEhfV0VCU0VSVklDRV9BTk5OT1RBVElPTj1AV2ViTWV0aG9kIGFubm90YXRpb25zIG9ubHkgc3VwcG9ydGVkIGluIGNsYXNzZXMgd2l0aCB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbgotV0VCU0VSVklDRV9TRUlfTk9fV0VCTUVUSE9TX1JVTEU9Tm8gQFdlYk1ldGhvZCBhbm5vdGF0aW9ucyBhbGxvd2VkIGluIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgY29udGFpbnMgYW4gZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlIGluIGl0J3MgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbgotV0VCU0VSVklDRV9PTl9TRUlfQVRUUklCVVRFU19SVUxFPUNlcnRhaW4gQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIHdoZW4gdXNlZCBvbiBTRUkncwotV0VCU0VSVklDRV9XRUJTRVJWSUNFX1BST1ZJREVSX0NPRVhJU1RfUlVMRT1AV2ViU2VydmljZSBhbmQgQFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9ucyBjYW5ub3QgY29leGlzdAotT05FV0FZX05PX1JFVFVSTl9WQUxVRT1AT25ld2F5IG1ldGhvZHMgbXVzdCBub3QgcmV0dXJuIGEgdmFsdWUKLVdFQk1FVEhPRF9PTkxZX1BVQkxJQ19NRVRIT0RTPU1ldGhvZHMgYW5ub3RhdGVkIHdpdGggQFdlYk1ldGhvZCBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3Qgbm90IGJlIGRlY2xhcmVkIHN0YXRpYyBvciBmaW5hbAotU09BUEJJTkRJTkdfUlVMRVM9QFNPQVBCaW5kaW5nIFJ1bGVzLiBFbmNvZGVkIHVzZSBub3Qgc3VwcG9ydGVkLiBObyBSUEMgc3R5bGUgb24gbWV0aG9kcy4gTm8gbWl4aW5nIG9mIFNPQVBCaW5kaW5nIHN0eWxlcy4gUlBDIHN0eWxlIG9ubHkgd2l0aCB3cmFwcGVkIHBhcmFtZXRlciBzdHlsZQotV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX1JVTEU9QFdlYk1ldGhvZCBleGNsdWRlIGF0dHJpYnV0ZSBpcyBub3QgYWxsb3dlZCBpbiBTRUkncy4gSWYgc3BlY2lmaWVkIGluIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzLCB0aGVuIG90aGVyIGF0dHJpYnV0ZXMgaW4gdGhlIEBXZWJNZXRob2QgYW5ub3RhdGlvbiBhcmUgbm90IGFsbG93ZWQKLVNPQVBCSU5ESU5HX0RPQ1VNRU5UX0JBUkVfUlVMRVM9RG9jdW1lbnQgQmFyZSBvcGVyYXRpb25zIGFyZSBzdWJqZWN0IHRvIGEgbnVtYmVyIG9mIHJlc3RyaWN0aW9ucy4gQ29tYmluYXRpb25zIG9mIEBPbmV3YXkuIE5vdCBAT25ld2F5LiBWb2lkIFJldHVybi4gTm9uLVZvaWQgUmV0dXJuLiBAV2ViUGFyYW0gTW9kZXMgSU4sIE9VVCwgSU5PVVQuIEhlYWRlciBwYXJhbWV0ZXJzCi1IT0xERVJfVFlQRVNfUEFSQU1FVEVSU19SVUxFPVBhcmFtZXRlcnMgdGhhdCBjb25mb3JtIHRvIHRoZSBkZWZpbml0aW9uIG9mIEhvbGRlciBUeXBlcyBtdXN0IGJlIGFubm90YXRlZCB3aXRoIEBXZWJQYXJhbS5Nb2RlLk9VVCBvciBAV2ViUGFyYW0uTW9kZS5JTk9VVAotVU5JUVVFX05BTUVTX1JVTEU9Q2hlY2tzIEBSZXNwb25zZVdyYXBwZXIsIEBSZXF1ZXN0V3JhcHBlciBhbmQgQFdlYkZhdWx0IEJlYW5zIGZvciB1bmlxdWUgY2xhc3NOYW1lIGFuZCBmYXVsdEJlYW4gYXR0cmlidXRlcwotSEFORExFUkNIQUlOX1JVTEVTPUBIYW5kbGVyQ2hhaW4gYW5kIEBTT0FQTWVzc2FnZUhhbmRsZXJzIGFubm90YXRpb25zIGNhbm5vdCBjb2V4aXN0LiBASGFuZGxlckNoYWluIGFsbG93ZWQgb24gVFlQRSBvbmx5Ci1XRUJTRVJWSUNFUkVGU19SVUxFUz1FYWNoIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gaW5zaWRlIGEgQFdlYlNlcnZpY2VSZWZzIG11c3QgY29udGFpbiBuYW1lIGFuZCB0eXBlIGVsZW1lbnRzIHdpdGggbm9uLWRlZmF1bHQgdmFsdWVzCi1XRUJTRVJWSUNFX1RBUkdFVF9OQU1FU1BBQ0VfUlVMRT1DbGFzc2VzIG9yIEludGVyZmFjZXMgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSB0aGF0IGFyZSBhbm5vdGF0ZWQgd2l0aCBAamF2YXguandzLldlYlNlcnZpY2UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IG5hbWVzcGFjZQotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1JVTEU9VGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBtdXN0IHJlbWFpbiBjb25zaXN0ZW50IHdpdGggdGhlIHBvcnRUeXBlIGFuZCBiaW5kaW5ncyBkZWNsYXJlZCBpbiB0aGlzIFdTREwgcmVmZXJlbmNlZCBpbiB0aGUgQFdlYlNlcnZpY2Uud3NkbExvY2F0aW9uIGF0dHJpYnV0ZQotV0VCU0VSVklDRVBST1ZJREVSX1JVTEVTPUEgUHJvdmlkZXIgYmFzZWQgc2VydmljZSBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbiBtdXN0IGltcGxlbWVudCBhIHR5cGVkIFByb3ZpZGVyIGludGVyZmFjZSBhbmQgcHJvdmlkZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yCi1XRUJTRVJWSUNFX01FVEhPRF9QQVJBTUVURVJTX1JFVFVSTl9UWVBFX1JVTEU9VmFsaWRhdGVzIE1ldGhvZCBQYXJhbWV0ZXJzIGFuZCBSZXR1cm4gVHlwZXMKLVdFQlNFUlZJQ0VfRUpCX1NUQVRFTEVTU19TRVNTSU9OPUBXZWJTZXJ2aWNlIG1heSBvbmx5IGJlIGFkZGVkIHRvIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW5zIGluIGFuIEVKQiBtb2R1bGUKLUpBWFdTX0NBVEVHT1JZX05BTUU9SkFYLVdTCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmExMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5Ij4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iJUpBWFdTX0NBVEVHT1JZX05BTUUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgbmFtZT0iV2ViU2VydmljZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5XZWJNZXRob2QiCi0gICAgICAgICAgICBuYW1lPSJXZWJNZXRob2QiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3MuV2ViUGFyYW0iCi0gICAgICAgICAgICBuYW1lPSJXZWJQYXJhbSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5XZWJSZXN1bHQiCi0gICAgICAgICAgICBuYW1lPSJXZWJSZXN1bHQiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3MuSGFuZGxlckNoYWluIgotICAgICAgICAgICAgbmFtZT0iSGFuZGxlckNoYWluIj4KLSAgICAgICAgIDx0YXJnZXRGaWx0ZXIgdGFyZ2V0PSJGSUVMRCIvPgotICAgICAgICAgPHRhcmdldEZpbHRlciB0YXJnZXQ9Ik1FVEhPRCIvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3MuT25ld2F5IgotICAgICAgICAgICAgbmFtZT0iT25ld2F5Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciCi0gICAgICAgICAgICBuYW1lPSJTT0FQQmluZGluZyI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIiCi0gICAgICAgICAgICBuYW1lPSJXZWJTZXJ2aWNlUHJvdmlkZXIiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCIKLSAgICAgICAgICAgIG5hbWU9IldlYlNlcnZpY2VDbGllbnQiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuV2ViU2VydmljZVJlZiIKLSAgICAgICAgICAgIG5hbWU9IldlYlNlcnZpY2VSZWYiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuV2ViU2VydmljZVJlZnMiCi0gICAgICAgICAgICBuYW1lPSJXZWJTZXJ2aWNlUmVmcyIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSIKLSAgICAgICAgICAgIG5hbWU9IlNlcnZpY2VNb2RlIgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLldlYkZhdWx0IgotICAgICAgICAgICAgbmFtZT0iV2ViRmF1bHQiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuQmluZGluZ1R5cGUiCi0gICAgICAgICAgICBuYW1lPSJCaW5kaW5nVHlwZSIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlciIKLSAgICAgICAgICAgIG5hbWU9IlJlcXVlc3RXcmFwcGVyIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlciIKLSAgICAgICAgICAgIG5hbWU9IlJlc3BvbnNlV3JhcHBlciI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5XZWJFbmRwb2ludCIKLSAgICAgICAgICAgIG5hbWU9IldlYkVuZHBvaW50IgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nIgotICAgICAgICAgICAgbmFtZT0iUmVzcGVjdEJpbmRpbmciCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nIgotICAgICAgICAgICAgbmFtZT0iQWRkcmVzc2luZyIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5zb2FwLk1UT00iCi0gICAgICAgICAgICBuYW1lPSJNVE9NIgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLkZhdWx0QWN0aW9uIgotICAgICAgICAgICAgbmFtZT0iRmF1bHRBY3Rpb24iPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuQWN0aW9uIgotICAgICAgICAgICAgbmFtZT0iQWN0aW9uIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLnNwaS5XZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24iCi0gICAgICAgICAgICBuYW1lPSJXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24iPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Qcm9jZXNzb3IiPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5Ib2xkZXJUeXBlUGFyYW1ldGVyc1J1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUhPTERFUl9UWVBFU19QQVJBTUVURVJTX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uVW5pcXVlTmFtZXNSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVVTklRVUVfTkFNRVNfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9DTEFTU19ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUl9SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9DTEFTU19QVUJMSUNfQUJTVFJBQ1RfRklOQUxfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfQ0xBU1NfTk9fRklOQUxJWkVfTUVUSE9EX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfU0VJX05PX1dFQk1FVEhPU19SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VTRUlBbGxvd2VkQXR0cmlidXRlc1J1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfT05fU0VJX0FUVFJJQlVURVNfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgCSVXRUJTRVJWSUNFX1dFQlNFUlZJQ0VfUFJPVklERVJfQ09FWElTVF9SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViTWV0aG9kIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCTUVUSE9EX09OTFlfU1VQUE9SVEVEX09OX0NMQVNTRVNfV0lUSF9XRUJTRVJWSUNFX0FOTk5PVEFUSU9OCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViTWV0aG9kIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJNRVRIT0RfT05MWV9QVUJMSUNfTUVUSE9EUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYk1ldGhvZCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYk1ldGhvZEV4Y2x1ZGVSdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5PbmV3YXkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5PbmV3YXlSdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlT05FV0FZX05PX1JFVFVSTl9WQUxVRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5TT0FQQmluZGluZ1J1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVTT0FQQklORElOR19SVUxFUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5TT0FQQmluZGluZ0RvY3VtZW50QmFyZVJ1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVTT0FQQklORElOR19ET0NVTUVOVF9CQVJFX1JVTEVTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuSGFuZGxlckNoYWluIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uSGFuZGxlckNoYWluUnVsZXMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUhBTkRMRVJDSEFJTl9SVUxFUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPiAgICAgCi0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC54bWwud3MuV2ViU2VydmljZVJlZnMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlUmVmc1J1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFUkVGU19SVUxFUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9UQVJHRVRfTkFNRVNQQUNFX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4gICAgIAotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRVBST1ZJREVSX1JVTEVTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VQYXJhbWV0ZXJzUmV0dXJuVHlwZXNSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFX01FVEhPRF9QQVJBTUVURVJTX1JFVFVSTl9UWVBFX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4gICAgIAotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlRUpCTW9kdWxlUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9FSkJfU1RBVEVMRVNTX1NFU1NJT04KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4gICAgIAotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDc3MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSkFYV1NDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9Ci0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTkFNRV9ESUZGRVJFTlRfQ0FTRV9FWElTVFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9XSVRIX05BTUVfQUxSRUFEWV9FWElTVFM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBPTkVXQVlfTk9fUkVUVVJOX1ZBTFVFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ORVdBWV9OT19DSEVDS0VEX0VYQ0VQVElPTlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT05FV0FZX05PX0hPTERFUl9QQVJBTUVURVJTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlBBUkFNX01PREVfT1VUX0lOT1VUX0hPTERFUl9UWVBFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSE9MREVSX1RZUEVfTVVTVF9CRV9PVVRfSU5PVVQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9OT05fVk9JRF9SRVRVUk5fTk9fSU5PVVRfT1VUX1BBUkFNRVRFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9PTkxZX09ORV9OT05fSEVBREVSX0lOX1BBUkFNRVRFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9WT0lEX1JFVFVSTl9PTkVfSU5fUEFSQU1FVEVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ19CQVJFX1ZPSURfUkVUVVJOX09ORV9PVVRfUEFSQU1FVEVSOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9DSEFJTl9TT0FQX01FU1NBR0VfSEFORExFUlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9DSEFJTl9PTl9GSUVMRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIQU5ETEVSX0NIQUlOX09OX01FVEhPRDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VSRUZTX05BTUVfUkVRVUlSRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVJFRlNfVFlQRV9SRVFVSVJFRDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlBBUkFNX05BTUVfUkVRVUlSRURfV0hFTl9ET0NfQkFSRV9PVVRfSU5PVVQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJNRVRIT0RfT05MWV9TVVBQT1JURURfT05fQ0xBU1NFU19XSVRIX1dFQlNFUlZJQ0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX09OTFlfT05fUFVCTElDX01FVEhPRFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX05PX0ZJTkFMX01PRElGSUVSX0FMTE9XRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX0VYQ0xVREVfTk9UX0FMTE9XRURfT05fU0VJOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9QVUJMSUNfQUJTVFJBQ1RfRklOQUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0NMQVNTX09SX0lOVEVSRkFDRV9PTkxZOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTkRQT0lOVElOVEVSRkFDRV9TRUk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9QT1JUTkFNRV9TRUk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9TRVJWSUNFTkFNRV9TRUk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX1JFRFVDRURfVklTSUJJTElUWTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfSU5DT01QQVRJQkxFX1JFVFVSTl9UWVBFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfRVhDRVBUSU9OUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0lOVEVSRkFDRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfQU5OT1RBVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfUFVCTElDOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJNRVRIT0RTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfT1VURVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX05BTUVfQVRUUklCVVRFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19TT0FQQklORElORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUkVTVUxUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJQQVJBTTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fT05FV0FZOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XRUJTRVJWSUNFUFJPVklERVJfQ09NQklOQVRJT047Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0RFRkFVTFRfUEFDS0FHRV9UQVJHRVRfTkFNRVNQQUNFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1VOQUJMRV9UT19MT0NBVEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1BPUlRfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fTk9fU0VSVklDRV9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9OT19PUEVSVEFUSU9OX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1dTRExfT1BFUkFUSU9OX09VVFBVVF9NRVRIT0RfT05FV0FZOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9TT0FQX0JJTkRJTkdfU1RZTEU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19OT19SUENfU1RZTEVfT05fTUVUSE9EUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPQVBCSU5ESU5HX0RPQ1VNRU5UX0VOQ09ERURfTk9UX1NVUFBPUlRFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19OT19NSVhFRF9CSU5ESU5HUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19SUENfTk9fQkFSRV9QQVJBTUVURVJfU1RZTEU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFUFJPVklERVJfREVGQVVMVF9QVUJMSUNfQ09OU1RSVUNUT1I7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0lNUExFTUVOVF9UWVBFRF9QUk9WSURFUl9JTlRFUkZBQ0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX1NPQVBNRVNTQUdFX1NPQVBCSU5ESU5HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VQUk9WSURFUl9TT0FQTUVTU0FHRV9NRVNTQUdFX01PREU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0RBVEFTT1VSQ0VfSFRUUEJJTkRJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0RBVEFTT1VSQ0VfTUVTU0FHRV9NT0RFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT1BFUkFUSU9OX05BTUVTX01VU1RfQkVfVU5JUVVFX0VSUk9SOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdSQVBQRVJfRkFVTFRfQkVBTl9OQU1FU19NVVNUX0JFX1VOSVFVRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9NRVRIT0RTX1VOSVFVRV9YTUxfRUxFTUVOVFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTE9DQUxfTkFNRV9BVFRSSUJVVEVTX01VU1RfQkVfVU5JUVVFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfTkNOQU1FX0FUVFJJQlVURTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUkFNRVRFUl9OQU1FX0NMQVNIOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVEVSRkFDRVNfTk9UX1NVUFBPUlRFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIQVNfSU5BRE1JU1NJQkxFX0lOTkVSX1RZUEVTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElTX1JFTU9URV9PQkpFQ1Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUJTVFJBQ1RfQ0xBU1NfTk9UX0lNUExFTUVOVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOSEVSSVRBTkNFX0FORF9JTVBMRU1FTlRBVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTVBMRU1FTlRTX01VTFRJUExFX0lOVEVSRkFDRVM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJQQVJBTV9OQU1FX1JFRFVOREFOVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX09OTFlfT05fU1RBVEVMRVNTX1NFU1NJT05fQkVBTlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9VUklfU1lOVEFYX0VSUk9SOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU1QVFlfQVRUUklCVVRFX1ZBTFVFOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpBWFdTQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpBWFdTQ29yZU1lc3NhZ2VzKCkgewotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9KQVhXU0NvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwZmYyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9KQVhXU0NvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNKRFRVdGlscwotVFlQRV9OQU1FX0RJRkZFUkVOVF9DQVNFX0VYSVNUUz1BIFR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgY2FzZSBhbHJlYWR5IGV4aXN0cwotVFlQRV9XSVRIX05BTUVfQUxSRUFEWV9FWElTVFM9QSBjb21waWxhdGlvbiB1bml0IG5hbWVkICcnezB9JycgYWxyZWFkeSBleGlzdHMgaW4gcGFja2FnZSAnJ3sxfScnCi0KLVdFQlNFUlZJQ0VfREVGQVVMVF9QVUJMSUNfQ09OU1RSVUNUT1I9Q2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IGhhdmUgYSBkZWZhdWx0IHB1YmxpYyBjb25zdHJ1Y3RvcgotV0VCU0VSVklDRV9DTEFTU19PUl9JTlRFUkZBQ0VfT05MWT1AV2ViU2VydmljZSBtYXkgb25seSBiZSBhZGRlZCB0byBhIGNsYXNzIG9yIGludGVyZmFjZQotV0VCU0VSVklDRV9QVUJMSUNfQUJTVFJBQ1RfRklOQUw9Q2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IGJlIGFuIG91dGVyIHB1YmxpYyBjbGFzcywgbXVzdCBub3QgYmUgZmluYWwsIGFuZCBtdXN0IG5vdCBiZSBhYnN0cmFjdAotV0VCU0VSVklDRV9PVkVSUklERV9GSU5BTElaRT1DbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlIG11c3Qgbm90IGRlZmluZSBhIGZpbmFsaXplKCkgbWV0aG9kCi1XRUJNRVRIT0RfT05MWV9TVVBQT1JURURfT05fQ0xBU1NFU19XSVRIX1dFQlNFUlZJQ0U9QFdlYk1ldGhvZCBpcyBvbmx5IHN1cHBvcnRlZCBvbiBjbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlCi1XRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUz1AV2ViTWV0aG9kIGFubm90YXRpb24gaXMgbm90IGFsbG93ZWQgb24gbm9uLXB1YmxpYyBtZXRob2RzCi1XRUJNRVRIT0RfTk9fRklOQUxfTU9ESUZJRVJfQUxMT1dFRD1AV2ViTWV0aG9kIGFubm90YXRpb24gaXMgbm90IGFsbG93ZWQgb24gZmluYWwgbWV0aG9kcwotV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEPUBXZWJNZXRob2QgYW5ub3RhdGlvbiBpcyBub3QgYWxsb3dlZCBvbiBzdGF0aWMgbWV0aG9kcwotV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX05PX09USEVSX0FUVFJJQlVURVNfQUxMT1dFRD1AV2ViTWV0aG9kIGV4Y2x1ZGUgYXR0cmlidXRlIGlzIHNwZWNpZmllZC4gTm8gb3RoZXIgYXR0cmlidXRlcyBhbGxvd2VkCi1XRUJNRVRIT0RfRVhDTFVERV9OT1RfQUxMT1dFRF9PTl9TRUk9QFdlYk1ldGhvZCBhbm5vdGF0aW9ucyBpbiBTRUkncyBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSB0aGUgZXhjbHVkZSBhdHRyaWJ1dGUKLVdFQlNFUlZJQ0VfU0VSVklDRU5BTUVfU0VJPUBXZWJTZXJ2aWNlIHNlcnZpY2VOYW1lIGVsZW1lbnQgaXMgbm90IGFsbG93ZWQgb24gU0VJCi1XRUJTRVJWSUNFX0VORFBPSU5USU5URVJGQUNFX1NFST1AV2ViU2VydmljZSBlbmRwb2ludEludGVyZmFjZSBlbGVtZW50IGlzIG5vdCBhbGxvd2VkIG9uIFNFSQotV0VCU0VSVklDRV9QT1JUTkFNRV9TRUk9QFdlYlNlcnZpY2UgcG9ydE5hbWUgZWxlbWVudCBpcyBub3QgYWxsb3dlZCBvbiBTRUkKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9NVVNUX0lNUExFTUVOVD1JbXBsZW1lbnRhdGlvbiBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgU0VJIG1ldGhvZCAnJ3swfScnCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfUkVEVUNFRF9WSVNJQklMSVRZPUNhbm5vdCByZWR1Y2UgdGhlIHZpc2liaWxpdHkgb2YgdGhlIFNFSSBtZXRob2QKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfUkVUVVJOX1RZUEU9VGhlIHJldHVybiB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHswfQotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9JTlRFUkZBQ0U9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgbXVzdCBiZSBhbiBJbnRlcmZhY2UKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfRk9VTkQ9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgY2Fubm90IGJlIGZvdW5kCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0FOTk9UQVRFRD1UaGUgZW5kcG9pbnRJbnRlcmZhY2UgJyd7MH0nJyBtdXN0IGJlIGFubm90YXRlZCB3aXRoIEBqYXZheC5qd3MuV2ViU2VydmljZQotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9QVUJMSUM9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgbXVzdCBiZSBwdWJsaWMKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfT1VURVI9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgbXVzdCBiZSBhbiBvdXRlciBpbnRlcmZhY2UKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19OQU1FX0FUVFJJQlVURT1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gbmFtZSBhdHRyaWJ1dGUgYWxsb3dlZAotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQk1FVEhPRFM9QFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBjb250YWlucyBhbiBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGUuIE5vIG1ldGhvZHMgYW5ub3RhdGVkIHdpdGggQFdlYk1ldGhvZCBhbGxvd2VkIGluIGltcGxlbWVudGF0aW9uIGNsYXNzCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkc9QFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBjb250YWlucyBhbiBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGUuIEBTT0FQQmluZGluZyBub3QgYWxsb3dlZCBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzcwotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQlJFU1VMVD1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBAV2ViUmVzdWx0IGFsbG93ZWQgaW4gaW1wbGVtZW50YXRpb24gY2xhc3MKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJQQVJBTT1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gcGFyYW1ldGVycyBhbm5vdGF0ZWQgd2l0aCBAV2ViUGFyYW0gYWxsb3dlZCBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzcwotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX09ORVdBWT1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBAT25ld2F5IGFsbG93ZWQgaW4gaW1wbGVtZW50YXRpb24gY2xhc3MKLVdFQlNFUlZJQ0VfV0VCU0VSVklDRVBST1ZJREVSX0NPTUJJTkFUSU9OPUBXZWJTZXJ2aWNlIGFuZCBAV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb25zIGNhbm5vdCBiZSBjb21iaW5lZAotV0VCU0VSVklDRV9ERUZBVUxUX1BBQ0tBR0VfVEFSR0VUX05BTUVTUEFDRT1DbGFzc2VzIG9yIEludGVyZmFjZXMgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSB0aGF0IGFyZSBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IHNwZWNpZnkgYSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlCi1PTkVXQVlfTk9fUkVUVVJOX1ZBTFVFPUBPbmV3YXkgbWV0aG9kcyBtdXN0IG5vdCByZXR1cm4gYSB2YWx1ZQotT05FV0FZX05PX0NIRUNLRURfRVhDRVBUSU9OUz1AT25ld2F5IG1ldGhvZHMgbXVzdCBub3QgZGVjbGFyZSBhbnkgY2hlY2tlZCBleGNlcHRpb25zCi1PTkVXQVlfTk9fSE9MREVSX1BBUkFNRVRFUlM9QE9uZXdheSBtZXRob2RzIG11c3Qgbm90IGFjY2VwdCBhbnkgamF2YXgueG1sLndzLkhvbGRlcjxUPiBwYXJhbWV0ZXJzLiAKLVdFQlBBUkFNX01PREVfT1VUX0lOT1VUX0hPTERFUl9UWVBFPVRoZSBAV2ViUGFyYW0uTW9kZS5PVVQgYW5kIEBXZWJQYXJhbS5Nb2RlLklOT1VUIG1vZGVzIG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgamF2YXgueG1sLndzLkhvbGRlcjxUPiBwYXJhbWV0ZXJzCi1IT0xERVJfVFlQRV9NVVNUX0JFX09VVF9JTk9VVD1qYXZheC54bWwud3MuSG9sZGVyPFQ+IHBhcmFtZXRlcnMgbXVzdCBiZSBAV2ViUGFyYW0uTW9kZS5PVVQgb3IgQFdlYlBhcmFtLk1vZGUuSU5PVVQKLVNPQVBCSU5ESU5HX05PX1JQQ19TVFlMRV9PTl9NRVRIT0RTPVJQQyBzdHlsZSBAU09BUEJpbmRpbmcgYW5ub3RhdGlvbnMgbm90IHN1cHBvcnRlZCBvbiBtZXRob2RzCi1TT0FQQklORElOR19SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVEPVJQQyBFbmNvZGVkIFNPQVAgQmluZGluZ3Mgbm90IHN1cHBvcnRlZAotU09BUEJJTkRJTkdfRE9DVU1FTlRfRU5DT0RFRF9OT1RfU1VQUE9SVEVEPURvY3VtZW50IEVuY29kZWQgU09BUCBCaW5kaW5ncyBub3Qgc3VwcG9ydGVkCi1TT0FQQklORElOR19OT19NSVhFRF9CSU5ESU5HUz1NaXhlZCBSUEMgYW5kIERvY3VtZW50IHN0eWxlIG9wZXJhdGlvbnMgbm90IHBlcm1pdHRlZCBpbiB0aGUgc2FtZSBzZXJ2aWNlCi1TT0FQQklORElOR19SUENfTk9fQkFSRV9QQVJBTUVURVJfU1RZTEU9VXNlIG9mIFJQQyBzdHlsZSByZXF1aXJlcyB1c2Ugb2YgV1JBUFBFRCBwYXJhbWV0ZXIgc3R5bGUKLURPQ19CQVJFX09OTFlfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSPURvY3VtZW50IGxpdGVyYWwgYmFyZSBtZXRob2RzIG1heSBoYXZlIG9ubHkgb25lIG5vbi1oZWFkZXIgSU4gcGFyYW1ldGVyCi1ET0NfQkFSRV9OT05fVk9JRF9SRVRVUk5fTk9fSU5PVVRfT1VUX1BBUkFNRVRFUj1Eb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyB0aGF0IGRlY2xhcmUgYSBub24tdm9pZCByZXR1cm4gdmFsdWUgbWF5IG5vdCBoYXZlIGFueSBPVVQgb3IgSU5PVVQgcGFyYW1ldGVycwotRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX0lOX1BBUkFNRVRFUj1Eb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyB0aGF0IGRlY2xhcmUgYSB2b2lkIHJldHVybiB2YWx1ZSBtYXkgaGF2ZSBvbmx5IG9uZSBJTi9JTk9VVCBwYXJhbWV0ZXIKLURPQ19CQVJFX1ZPSURfUkVUVVJOX09ORV9PVVRfUEFSQU1FVEVSPURvY3VtZW50IGxpdGVyYWwgYmFyZSBtZXRob2RzIHRoYXQgZGVjbGFyZSBhIHZvaWQgcmV0dXJuIHZhbHVlIG1heSBoYXZlIG9ubHkgb25lIE9VVC9JTk9VVCBwYXJhbWV0ZXIKLVdFQlBBUkFNX05BTUVfUkVRVUlSRURfV0hFTl9ET0NfQkFSRV9PVVRfSU5PVVQ9VGhlIEBXZWJQYXJhbSBuYW1lIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgRG9jdW1lbnQgQmFyZSBhbmQgdGhlIG1vZGUgaXMgT1VUIG9yIElOT1VUCi1PUEVSQVRJT05fTkFNRVNfTVVTVF9CRV9VTklRVUVfRVJST1I9T3BlcmF0aW9uIG5hbWVzIG11c3QgYmUgdW5pcXVlIDogJyd7MH0nJwotV1JBUFBFUl9GQVVMVF9CRUFOX05BTUVTX01VU1RfQkVfVU5JUVVFPUdlbmVyYXRlZCBSZXF1ZXN0L1Jlc3BvbnNlIGFuZCBGYXVsdCBiZWFuIGNsYXNzZXMgbXVzdCBoYXZlIHVuaXF1ZSBuYW1lcyB3aXRoaW4gYSBwYWNrYWdlIGFuZCBtdXN0IG5vdCBjbGFzaCB3aXRoIG90aGVyIGNsYXNzZXMgaW4gdGhhdCBwYWNrYWdlIDogJyd7MH0nJwotRE9DX0JBUkVfTUVUSE9EU19VTklRVUVfWE1MX0VMRU1FTlRTPURvY3VtZW50IExpdGVyYWwgQmFyZSBvcGVyYXRpb25zIG11c3QgaGF2ZSB1bmlxdWUgWE1MIGVsZW1lbnRzIGZvciB0aGUgaW5wdXQgYW5kIG91dHB1dCBtZXNzYWdlcyBhY3Jvc3MgYWxsIG9wZXJhdGlvbnMgb24gdGhlIFdlYiBTZXJ2aWNlIDogJyd7MH0nJwotTE9DQUxfTkFNRV9BVFRSSUJVVEVTX01VU1RfQkVfVU5JUVVFPVRoZSB3cmFwcGVyIGJlYW4gbG9jYWxOYW1lIGF0dHJpYnV0ZXMgbXVzdCBiZSB1bmlxdWUgOiAnJ3swfScnCi1JTlZBTElEX05DTkFNRV9BVFRSSUJVVEU9VGhlIEB7MH0gezF9IGF0dHJpYnV0ZSB2YWx1ZSAnJ3syfScnIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycwotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1VOQUJMRV9UT19MT0NBVEU9VW5hYmxlIHRvIGxvY2F0ZSB3c2RsIGF0IHdzZGxMb2NhdGlvbjogJyd7MH0nJwotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1BPUlRfTkFNRT1ObyB3c2RsOnBvcnQgbWF0Y2hpbmcgdGhlIHBvcnROYW1lICcnezB9JycgY2FuIGJlIGZvdW5kIGluIHRoZSBXU0RMICcnezF9JycKLVdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9OT19TRVJWSUNFX05BTUU9Tm8gd3NkbDpzZXJ2aWNlIG1hdGNoaW5nIHRoZSBzZXJ2aWNlTmFtZSAnJ3swfScnIGNhbiBiZSBmb3VuZCBpbiB0aGUgV1NETCAnJ3sxfScnCi1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fTk9fT1BFUlRBVElPTl9OQU1FPU5vIEBXZWJNZXRob2QgbWF0Y2hpbmcgdGhlIHdzZGw6b3BlcmF0aW9uICcnezB9JycgY2FuIGJlIGZvdW5kCi1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fV1NETF9PUEVSQVRJT05fT1VUUFVUX01FVEhPRF9PTkVXQVk9VGhlIE1ldGhvZCAnJ3swfScnIGlzIGFubm90YXRlZCBAT25ld2F5IGJ1dCB0aGUgd3NkbDpvcGVyYXRpb24gJyd7MH0nJyBzcGVjaWZpZXMgYSB3c2RsOm91dHB1dCBlbGVtZW50Ci1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fU09BUF9CSU5ESU5HX1NUWUxFPVRoZSB3c2RsICcnezB9Jycgc3BlY2lmaWVzIGEgJyd7MX0nJyBTT0FQIGJpbmRpbmcgc3R5bGUgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlICcnezJ9JycgU09BUCBiaW5kaW5nIHN0eWxlIG9mIHRoZSB3ZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbi9TRUkKLVBBUkFNRVRFUl9OQU1FX0NMQVNIPVBhcmFtZXRlciBuYW1lcyBtdXN0IGJlIHVuaXF1ZTogJyd7MH0nJwotR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNIPVBhcmFtZXRlciBOYW1lICcnezB9Jycgd2lsbCBjbGFzaCB3aXRoIGEgZ2VuZXJhdGVkIHBhcmFtZXRlciBuYW1lCi1IQU5ETEVSX0NIQUlOX1NPQVBfTUVTU0FHRV9IQU5ETEVSUz1ASGFuZGxlckNoYWluIGFuZCBAU09BUE1lc3NhZ2VIYW5kbGVycyBjYW5ub3QgYmUgY29tYmluZWQKLUhBTkRMRVJfQ0hBSU5fT05fRklFTEQ9VGhlIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBtYXkgb25seSBiZSBzcGVjaWZpZWQgb24gYSBUWVBFLiBUaGUgYW5ub3RhdGlvbiB0YXJnZXQgaW5jbHVkZXMgRklFTEQgZm9yIHVzZSBieSBKQVgtV1MgMi4wCi1IQU5ETEVSX0NIQUlOX09OX01FVEhPRD1UaGUgQEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIG1heSBvbmx5IGJlIHNwZWNpZmllZCBvbiBhIFRZUEUuIFRoZSBhbm5vdGF0aW9uIHRhcmdldCBpbmNsdWRlcyBNRVRIT0QgZm9yIHVzZSBieSBKQVgtV1MgMi4wCi1XRUJTRVJWSUNFUkVGU19OQU1FX1JFUVVJUkVEPUVhY2ggQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBpbnNpZGUgYSBAV2ViU2VydmljZVJlZnMgbXVzdCBjb250YWluIGEgbmFtZSBlbGVtZW50IHdpdGggYSBub24tZGVmYXVsdCAoIiIpIHZhbHVlCi1XRUJTRVJWSUNFUkVGU19UWVBFX1JFUVVJUkVEPUVhY2ggQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBpbnNpZGUgYSBAV2ViU2VydmljZVJlZnMgbXVzdCBjb250YWluIGEgdHlwZSBlbGVtZW50IHdpdGggYSBub24tZGVmYXVsdCAoT2JqZWN0LmNsYXNzKSB2YWx1ZQotV0VCU0VSVklDRVBST1ZJREVSX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2VQcm92aWRlciBtdXN0IGhhdmUgYSBkZWZhdWx0IHB1YmxpYyBjb25zdHJ1Y3RvcgotV0VCU0VSVklDRVBST1ZJREVSX0lNUExFTUVOVF9UWVBFRF9QUk9WSURFUl9JTlRFUkZBQ0U9QSBQcm92aWRlciBiYXNlZCBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbiBtdXN0IGltcGxlbWVudCBhIHR5cGVkIGphdmF4LnhtbC53cy5Qcm92aWRlciBpbnRlcmZhY2UuIFByb3ZpZGVyIGltcGxlbWVudGF0aW9ucyB3b3JrIHdpdGggdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBvYmplY3RzOiBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSwgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UgYW5kIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZQotV0VCU0VSVklDRVBST1ZJREVSX1NPQVBNRVNTQUdFX1NPQVBCSU5ESU5HPWphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIG9iamVjdHMgcmVxdWlyZSB0aGUgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlIHRoZSBTT0FQIEJpbmRpbmcKLVdFQlNFUlZJQ0VQUk9WSURFUl9TT0FQTUVTU0FHRV9NRVNTQUdFX01PREU9amF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2Ugb2JqZWN0cyByZXF1aXJlIHRoZSBQcm92aWRlciBpbXBsZW1lbnRhdGlvbiB0byBzcGVjaWZ5IGEgQGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSBhbm5vdGF0aW9uIHdpdGggamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZS5NRVNTQUdFIGFzIHRoZSB2YWx1ZSAKLVdFQlNFUlZJQ0VQUk9WSURFUl9EQVRBU09VUkNFX0hUVFBCSU5ESU5HPWphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSBkZXJpdmVkIG9iamVjdHMgcmVxdWlyZSB0aGUgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlIHRoZSBIVFRQIEJpbmRpbmcKLVdFQlNFUlZJQ0VQUk9WSURFUl9EQVRBU09VUkNFX01FU1NBR0VfTU9ERT1qYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UgZGVyaXZlZCBvYmplY3RzIHJlcXVpcmUgdGhlIFByb3ZpZGVyIGltcGxlbWVudGF0aW9uIHRvIHNwZWNpZnkgYSBAamF2YXgueG1sLndzLlNlcnZpY2VNb2RlIGFubm90YXRpb24gd2l0aCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlLk1FU1NBR0UgYXMgdGhlIHZhbHVlCi1FTVBUWV9BVFRSSUJVVEVfVkFMVUU9VGhlIEB7MH0gezF9IGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIGVtcHR5Ci1XRUJQQVJBTV9OQU1FX1JFRFVOREFOVD1OYW1lIGF0dHJpYnV0ZSBpcyBub3QgdXNlZCBpZiBTT0FQQmluZGluZy5TdHlsZSBpcyBSUEMgYW5kIHBhcnROYW1lIGlzIHByZXNlbnQKLVdFQlNFUlZJQ0VfT05MWV9PTl9TVEFURUxFU1NfU0VTU0lPTl9CRUFOUz1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGluIEVKQiBtb2R1bGVzIGNhbiBiZSBvbmx5IHVzZWQgb24gc3RhdGVsZXNzIHNlc3Npb24gYmVhbnMKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfRVhDRVBUSU9OUz1NZXRob2QgezB9IGRlY2xhcmVzIGV4Y2VwdGlvbnMgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgezB9IG1ldGhvZCBpbiB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgezF9Ci1JTlRFUkZBQ0VTX05PVF9TVVBQT1JURUQ9ezB9IGlzIGFuIGludGVyZmFjZSBhbmQgbWF5IG5vdCBiZSB1c2VkIGFzIGEgcmV0dXJuIHR5cGUgb3IgbWV0aG9kIHBhcmFtZXRlciBhcyBKQVhCIGNhbm5vdCBoYW5kbGUgaW50ZXJmYWNlcwotSEFTX0lOQURNSVNTSUJMRV9JTk5FUl9UWVBFUz1DbGFzcyB7MH0gbWF5IG5vdCBiZSB1c2VkIGFzIGEgcmV0dXJuIHR5cGUgb3IgbWV0aG9kIHBhcmFtZXRlciBhcyBpdCBoYXMgaW5uZXIgdHlwZXMgdGhhdCBhcmUgbm90IHB1YmxpYyBhbmQgc3RhdGljCi1JU19SRU1PVEVfT0JKRUNUPUNsYXNzIHswfSBpcyBhIHJlbW90ZSBPYmplY3QgYW5kIG1heSBub3QgdXNlZCBhcyBhIG1ldGhvZCByZXR1cm4gdHlwZSBvciBwYXJhbWV0ZXIKLUFCU1RSQUNUX0NMQVNTX05PVF9JTVBMRU1FTlRFRD1BYnN0cmFjdCBjbGFzcyB7MH0gY2Fubm90IGJlIHVzZWQgYXMgYSBydW50aW1lIGNsYXNzIGJlY2F1c2UgaXQgaXMgbm90IGV4dGVuZGVkIGJ5IGEgbm9uIGFic3RyYWN0IGNsYXNzIHdoaWNoIGlzIHN1aXRhYmxlIGFzIGEgcnVudGltZSBjbGFzcwotSU5IRVJJVEFOQ0VfQU5EX0lNUExFTUVOVEFUSU9OPUNsYXNzIHswfSBleHRlbmRzIHsxfSBhbmQgaW1wbGVtZW50cyBpbnRlcmZhY2UgezJ9IChtdWx0aXBsZSBpbmhlcml0YW5jZSBpcyBub3QgYWxsb3dlZCkKLUlNUExFTUVOVFNfTVVMVElQTEVfSU5URVJGQUNFUz1DbGFzcyB7MH0gaW1wbGVtZW50cyBtdWx0aXBsZSBpbnRlcmZhY2VzIChtdWx0aXBsZSBpbmhlcml0YW5jZSBpcyBub3QgYWxsb3dlZCkKLVRBUkdFVF9OQU1FU1BBQ0VfVVJJX1NZTlRBWF9FUlJPUj1VUkkgc3ludGF4IGVycm9yIGF0IGluZGV4IHswfSBvZiBpbnB1dCBTdHJpbmcgJyd7MX0nJy4gUmVhc29uOiB7Mn0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTI3ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYV1NDb3JlUGx1Z2luIHBsdWdpbjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEpBWFdTQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgSkFYV1NDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vSGFuZGxlckNoYWluUnVsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vSGFuZGxlckNoYWluUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZmU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hhbmRsZXJDaGFpblJ1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRmllbGREZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgSGFuZGxlckNoYWluUnVsZXMgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3Igew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsNCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oSGFuZGxlckNoYWluLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7DQotDQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsNCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguandzLnNvYXAuU09BUE1lc3NhZ2VIYW5kbGVycy5jbGFzcyk7DQotICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTWlycm9yICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGFubm90YXRpb25NaXJyb3IuZ2V0UG9zaXRpb24oKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSEFORExFUl9DSEFJTl9TT0FQX01FU1NBR0VfSEFORExFUlMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguandzLkhhbmRsZXJDaGFpbi5jbGFzcyk7DQotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoYW5ub3RhdGlvbk1pcnJvci5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkhBTkRMRVJfQ0hBSU5fT05fRklFTEQpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgew0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5qd3MuSGFuZGxlckNoYWluLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihhbm5vdGF0aW9uTWlycm9yLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSEFORExFUl9DSEFJTl9PTl9NRVRIT0QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hvbGRlclR5cGVQYXJhbWV0ZXJzUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9Ib2xkZXJUeXBlUGFyYW1ldGVyc1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4ZWQyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hvbGRlclR5cGVQYXJhbWV0ZXJzUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5NT0RFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7Ci0KLXB1YmxpYyBjbGFzcyBIb2xkZXJUeXBlUGFyYW1ldGVyc1J1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgIHZhbGlkYXRlUGFyYW1ldGVycygoVHlwZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVBhcmFtZXRlcnMoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXIuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzSG9sZGVyUGFyYW1ldGVyID0gdHlwZU1pcnJvci50b1N0cmluZygpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNXZWJQYXJhbU91dElub3V0TW9kZShwYXJhbWV0ZXIpICYmICFpc0hvbGRlclBhcmFtZXRlcikgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHBhcmFtZXRlci5nZXRQb3NpdGlvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCUEFSQU1fTU9ERV9PVVRfSU5PVVRfSE9MREVSX1RZUEUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNIb2xkZXJQYXJhbWV0ZXIgJiYgaXNXZWJQYXJhbUluTW9kZShwYXJhbWV0ZXIpKXsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihwYXJhbWV0ZXIuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5IT0xERVJfVFlQRV9NVVNUX0JFX09VVF9JTk9VVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dlYlBhcmFtSW5Nb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBTdHJpbmcgbW9kZSA9IGdldE1vZGUocGFyYW1ldGVyKTsKLSAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1vZGUuZXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dlYlBhcmFtT3V0SW5vdXRNb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBTdHJpbmcgbW9kZSA9IGdldE1vZGUocGFyYW1ldGVyKTsKLSAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1vZGUuZXF1YWxzKFdlYlBhcmFtLk1vZGUuT1VULm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoV2ViUGFyYW0uTW9kZS5JTk9VVC5uYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRNb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlBhcmFtLCBNT0RFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vT25ld2F5UnVsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vT25ld2F5UnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNjQyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL09uZXdheVJ1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7Ci0KLXB1YmxpYyBjbGFzcyBPbmV3YXlSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKE9uZXdheS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgLmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIGlmICghbWV0aG9kRGVjbGFyYXRpb24uZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyhlbnZpcm9ubWVudC5nZXRUeXBlVXRpbHMoKS5nZXRWb2lkVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIG9uZXdheSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBPbmV3YXkuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG9uZXdheS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fUkVUVVJOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uLmdldFRocm93blR5cGVzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIG9uZXdheSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBPbmV3YXkuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG9uZXdheS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fQ0hFQ0tFRF9FWENFUFRJT05TKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKG1ldGhvZERlY2xhcmF0aW9uLCBhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFyYW1ldGVycyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXIuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGlmICh0eXBlTWlycm9yLnRvU3RyaW5nKCkuZXF1YWxzKEhvbGRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKG9uZXdheS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fSE9MREVSX1BBUkFNRVRFUlMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ0RvY3VtZW50QmFyZVJ1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1NPQVBCaW5kaW5nRG9jdW1lbnRCYXJlUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmY2NiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1NPQVBCaW5kaW5nRG9jdW1lbnRCYXJlUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkhFQURFUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5NT0RFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlsczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5UeXBlTWlycm9yOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdEb2N1bWVudEJhcmVSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFNPQVBCaW5kaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyYXRpb24oKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUobWlycm9yKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvbnMgPSB0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01ldGhvZChtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb25NaXJyb3IgbWlycm9yIDogYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLmdldERlY2xhcmF0aW9uKCkuZXF1YWxzKGFubm90YXRpb25EZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKG1pcnJvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTWV0aG9kKG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NNZXRob2QoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLQotICAgICAgICAvL0BPbmV3YXkgb3BlcmF0aW9ucwotICAgICAgICBpZiAoaXNPbmV3YXkobWV0aG9kRGVjbGFyYXRpb24pICYmICFpc1NpbmdsZU5vbkhlYWRlcklOUGFyYW1ldGVyKHBhcmFtZXRlcnMpKSB7Ci0gICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfT05MWV9PTkVfTk9OX0hFQURFUl9JTl9QQVJBTUVURVIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGlzVm9pZFJldHVyblR5cGUobWV0aG9kRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50SU5QYXJhbWV0ZXJzKHBhcmFtZXRlcnMpID4gMSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX0lOX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb3VudE9VVFBhcmFtZXRlcnMocGFyYW1ldGVycykgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9WT0lEX1JFVFVSTl9PTkVfT1VUX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRJTlBhcmFtZXRlcnMocGFyYW1ldGVycykgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX09OTFlfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50T1VUUGFyYW1ldGVycyhwYXJhbWV0ZXJzKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihtZXRob2REZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfTk9OX1ZPSURfUkVUVVJOX05PX0lOT1VUX09VVF9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vY2hlY2sgZm9yIEBXZWJQYXJhbS5uYW1lIGF0dHJpYnV0ZSB3aGVuIEBXZWJQYXJhbS5Nb2RlID0gT1VUIG9yIElOT1VUCi0vLyAgICAgICAgZm9yKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotLy8gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotLy8gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk1pcnJvciAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGdldFdlYlBhcmFtTW9kZShhbm5vdGF0aW9uTWlycm9yLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbik7Ci0vLyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBOQU1FKTsKLS8vCi0vLyAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsICYmIChtb2RlLmVxdWFscyhNb2RlLk9VVC5uYW1lKCkpIHx8IG1vZGUuZXF1YWxzKE1vZGUuSU5PVVQubmFtZSgpKSkpIHsKLS8vICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGFubm90YXRpb25NaXJyb3IuZ2V0UG9zaXRpb24oKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJQQVJBTV9OQU1FX1JFUVVJUkVEX1dIRU5fRE9DX0JBUkVfT1VUX0lOT1VUKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPbmV3YXkoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgaWYgKG9uZXdheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVm9pZFJldHVyblR5cGUoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKS5lcXVhbHMoZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0Vm9pZFR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2luZ2xlTm9uSGVhZGVySU5QYXJhbWV0ZXIoQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICByZXR1cm4gY291bnROb25IZWFkZXJJTlBhcmFtZXRlcnMocGFyYW1ldGVycykgPD0gMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjb3VudE5vbkhlYWRlcklOUGFyYW1ldGVycyhDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGludCBpbk5vbkhlYWRlclBhcmFtZXRlcnMgPSAwOwotICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgaWYgKGlzTm9uSGVhZGVySU5QYXJhbWV0ZXIocGFyYW1ldGVyRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgaW5Ob25IZWFkZXJQYXJhbWV0ZXJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluTm9uSGVhZGVyUGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNOb25IZWFkZXJJTlBhcmFtZXRlcihQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyRGVjbGFyYXRpb24sIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKS5lcXVhbHMoTW9kZS5JTi5uYW1lKCkpCi0gICAgICAgICAgICAgICYmICFpc0hlYWRlcih3ZWJQYXJhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuSU4ubmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY291bnRJTlBhcmFtZXRlcnMoQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICBpbnQgaW5Ob25IZWFkZXJQYXJhbWV0ZXJzID0gMDsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIGlmIChpc0lOUGFyYW1ldGVyKHBhcmFtZXRlckRlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIGluTm9uSGVhZGVyUGFyYW1ldGVycysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbk5vbkhlYWRlclBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSU5QYXJhbWV0ZXIoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGdldFdlYlBhcmFtTW9kZSh3ZWJQYXJhbSwgcGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIChtb2RlLmVxdWFscyhNb2RlLklOLm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICAmJiAhaXNIZWFkZXIod2ViUGFyYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGRlZmF1bHRNb2RlID0gZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbik7Ci0gICAgICAgIGlmIChkZWZhdWx0TW9kZS5lcXVhbHMoTW9kZS5JTi5uYW1lKCkpIHx8IGRlZmF1bHRNb2RlLmVxdWFscyhNb2RlLklOT1VULm5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNvdW50T1VUUGFyYW1ldGVycyhDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGludCBvdXROb25IZWFkZXJQYXJhbWV0ZXJzID0gMDsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIGlmIChpc09VVFBhcmFtZXRlcihwYXJhbWV0ZXJEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBvdXROb25IZWFkZXJQYXJhbWV0ZXJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dE5vbkhlYWRlclBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzT1VUUGFyYW1ldGVyKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICBpZiAod2ViUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAobW9kZS5lcXVhbHMoTW9kZS5PVVQubmFtZSgpKSB8fCBtb2RlLmVxdWFscyhNb2RlLklOT1VULm5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgICYmICFpc0hlYWRlcih3ZWJQYXJhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuSU5PVVQubmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSGVhZGVyKEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvcikgewotICAgICAgICBCb29sZWFuIGhlYWRlciA9IEFubm90YXRpb25VdGlscy5nZXRCb29sZWFuVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgSEVBREVSKTsKLSAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYlBhcmFtTW9kZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBtb2RlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb25NaXJyb3IsIE1PREUpOwotICAgICAgICBpZiAobW9kZSA9PSBudWxsIHx8IG1vZGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbW9kZSA9IGdldERlZmF1bHRXZWJQYXJhbU1vZGUocGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRXZWJQYXJhbU1vZGUoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRUeXBlKCkpOwotICAgICAgICBpZiAodHlwZU1pcnJvci50b1N0cmluZygpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIE1vZGUuSU5PVVQubmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNb2RlLklOLm5hbWUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vU09BUEJpbmRpbmdSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ1J1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTRlNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ1J1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5IRUFERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5QQVJBTUVURVJfU1RZTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUEFSVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNUWUxFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlVTRTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ1J1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gc29hcEJpbmRpbmdEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFNPQVBCaW5kaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChzb2FwQmluZGluZ0RlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGNoZWNrRm9yRW5jb2RlZFVzZShkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgY2hlY2tGb3JSUENCYXJlT25UeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBjaGVja1JlZHVuZGFudFdlYlBhcmFtTmFtZUF0dHJpYnV0ZSh0eXBlRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIGNoZWNrRm9yUlBDU3R5bGVPbk1ldGhvZERlY2xhcmF0aW9uKChNZXRob2REZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yUlBDQmFyZU9uVHlwZURlY2xhcmF0aW9uKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBzb2FwQmluZGluZyA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmcsIFNUWUxFKTsKLSAgICAgICAgaWYgKHN0eWxlICE9IG51bGwgJiYgc3R5bGUuZXF1YWxzKFN0eWxlLlJQQy50b1N0cmluZygpKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nLCBQQVJBTUVURVJfU1RZTEUpOwotICAgICAgICAgICAgaWYgKHBhcmFtZXRlclN0eWxlICE9IG51bGwgJiYgcGFyYW1ldGVyU3R5bGUuZXF1YWxzKFBhcmFtZXRlclN0eWxlLkJBUkUudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKHNvYXBCaW5kaW5nLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX1JQQ19OT19CQVJFX1BBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjaGVjayBmb3IgRG9jdW1lbnQgc3R5bGUgQFNPQVBCaW5kaW5nIG9uIG1ldGhvZHMKLSAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvbnMgPSB0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEJpbmRpbmcyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlMiA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShzb2FwQmluZGluZzIsIFNUWUxFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlMiA9PSBudWxsIHx8IHN0eWxlMi5lcXVhbHMoU3R5bGUuRE9DVU1FTlQudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioc29hcEJpbmRpbmcyLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX05PX01JWEVEX0JJTkRJTkdTKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0ZvckVuY29kZWRVc2UoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBzb2FwQmluZGluZyA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmcsIFVTRSk7Ci0gICAgICAgIGlmICh1c2UgIT0gbnVsbCAmJiB1c2UuZXF1YWxzKFVzZS5FTkNPREVELnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmcsIFNUWUxFKTsKLSAgICAgICAgICAgIGlmIChzdHlsZSA9PSBudWxsIHx8IHN0eWxlLmVxdWFscyhTdHlsZS5ET0NVTUVOVC50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioc29hcEJpbmRpbmcuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfRE9DVU1FTlRfRU5DT0RFRF9OT1RfU1VQUE9SVEVEKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihzb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0ZvclJQQ1N0eWxlT25NZXRob2REZWNsYXJhdGlvbihNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHNvYXBCaW5kaW5nID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nLCBTVFlMRSk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmVxdWFscyhTdHlsZS5SUEMudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHNvYXBCaW5kaW5nLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX05PX1JQQ19TVFlMRV9PTl9NRVRIT0RTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlZHVuZGFudFdlYlBhcmFtTmFtZUF0dHJpYnV0ZShUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nLCBTVFlMRSk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmVxdWFscyhTdHlsZS5SUEMudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyRGVjbGFyYXRpb24sIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwgJiYgIWlzSGVhZGVyKHdlYlBhcmFtKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHBhcnROYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJQYXJhbSwgUEFSVF9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKHdlYlBhcmFtLCBOQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50V2FybmluZyhuYW1lLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlBBUkFNX05BTUVfUkVEVU5EQU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yKSB7Ci0gICAgICAgIEJvb2xlYW4gaGVhZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEJvb2xlYW5WYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBIRUFERVIpOwotICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9VbmlxdWVOYW1lc1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vVW5pcXVlTmFtZXNSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjNlNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9VbmlxdWVOYW1lc1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkNMQVNTX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRkFVTFRfQkVBTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5IRUFERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTE9DQUxfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5NT0RFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk5BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUEFSVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBPUlRfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5SRVNQT05TRV9TVUZGSVg7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuU0VSVklDRV9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlRBUkdFVF9OQU1FU1BBQ0U7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuUmVmZXJlbmNlVHlwZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbjsKLQotcHVibGljIGNsYXNzIFVuaXF1ZU5hbWVzUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJhcmdcXGQrKyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIHdlYlNlcnZpY2VEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKHdlYlNlcnZpY2VEZWNsYXJhdGlvbik7Ci0KLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZU5hbWVBdHRyaWJ1dGVzKHR5cGVEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgY2hlY2tPcGVyYXRpb25OYW1lcyh0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpKTsKLSAgICAgICAgICAgICAgICBjaGVja1dyYXBwZXJBbmRGYXVsdEJlYW5OYW1lcyh0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpKTsKLSAgICAgICAgICAgICAgICBjaGVja0RvY3VtZW50QmFyZU1ldGhvZHModHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKSk7Ci0gICAgICAgICAgICAgICAgY2hlY2tNZXRob2RQYXJhbWV0ZXJzKHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTmFtZUF0dHJpYnV0ZXMoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICBjaGVja0F0dHJpYnV0ZVZhbHVlKHdlYlNlcnZpY2UsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBOQU1FKTsKLSAgICAgICAgY2hlY2tBdHRyaWJ1dGVWYWx1ZSh3ZWJTZXJ2aWNlLCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgUE9SVF9OQU1FKTsKLSAgICAgICAgY2hlY2tBdHRyaWJ1dGVWYWx1ZSh3ZWJTZXJ2aWNlLCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgU0VSVklDRV9OQU1FKTsKLQotICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYk1ldGhvZCA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGVWYWx1ZSh3ZWJNZXRob2QsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIE9QRVJBVElPTl9OQU1FKTsKLQotICAgICAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGVWYWx1ZSh3ZWJQYXJhbSwgV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBOQU1FKTsKLSAgICAgICAgICAgICAgICBjaGVja0F0dHJpYnV0ZVZhbHVlKHdlYlBhcmFtLCBXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIFBBUlRfTkFNRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBdHRyaWJ1dGVWYWx1ZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIGFubm90YXRpb25WYWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvblZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvblZhbHVlLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihhbm5vdGF0aW9uVmFsdWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5FTVBUWV9BVFRSSUJVVEVfVkFMVUUsIG5ldyBPYmplY3RbXSB7IGFubm90YXRpb25OYW1lLCBhdHRyaWJ1dGVOYW1lIH0pKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFYTUxDaGFyLmlzVmFsaWROYW1lKGFubm90YXRpb25WYWx1ZS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGFubm90YXRpb25WYWx1ZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLklOVkFMSURfTkNOQU1FX0FUVFJJQlVURSwgbmV3IE9iamVjdFtdIHsgYW5ub3RhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lLCAgYW5ub3RhdGlvblZhbHVlLnRvU3RyaW5nKCkgfSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja09wZXJhdGlvbk5hbWVzKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzKSB7Ci0gICAgICAgIE1hcDxEZWNsYXJhdGlvbiwgUU5hbWU+IG5hbWVNYXAgPSBuZXcgSGFzaE1hcDxEZWNsYXJhdGlvbiwgUU5hbWU+KCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBuYW1lTWFwLnB1dChtZXRob2REZWNsYXJhdGlvbiwgbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShtZXRob2REZWNsYXJhdGlvbi5nZXREZWNsYXJpbmdUeXBlKCkpLAotICAgICAgICAgICAgICAgICAgICBnZXRPcGVyYXRpb25OYW1lKG1ldGhvZERlY2xhcmF0aW9uKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGVjbGFyYXRpb25bXSBrZXlzID0gbmFtZU1hcC5rZXlTZXQoKS50b0FycmF5KG5ldyBEZWNsYXJhdGlvbltuYW1lTWFwLnNpemUoKV0pOwotICAgICAgICBRTmFtZVtdIHZhbHVlcyA9IG5hbWVNYXAudmFsdWVzKCkudG9BcnJheShuZXcgUU5hbWVbbmFtZU1hcC5zaXplKCldKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSB2YWx1ZXNbaV07Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBvdGhlclFOYW1lID0gdmFsdWVzW2pdOwotICAgICAgICAgICAgICAgIGlmIChxTmFtZS5lcXVhbHMob3RoZXJRTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihrZXlzW2ldLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuT1BFUkFUSU9OX05BTUVTX01VU1RfQkVfVU5JUVVFX0VSUk9SLCBxTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGtleXNbal0uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5PUEVSQVRJT05fTkFNRVNfTVVTVF9CRV9VTklRVUVfRVJST1IsIG90aGVyUU5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb24sIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKTsKLSAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXcmFwcGVyQW5kRmF1bHRCZWFuTmFtZXMoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9ucykgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIHJlcXVlc3RXcmFwcGVyRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihSZXF1ZXN0V3JhcHBlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gcmVzcG9zZVdyYXBwZXJEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFJlc3BvbnNlV3JhcHBlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIFNldDxEZWNsYXJhdGlvbj4gbWV0aG9kcyA9IG5ldyBIYXNoU2V0PERlY2xhcmF0aW9uPigpOwotICAgICAgICBtZXRob2RzLmFkZEFsbChlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKHJlcXVlc3RXcmFwcGVyRGVjbGFyYXRpb24pKTsKLSAgICAgICAgbWV0aG9kcy5hZGRBbGwoZW52aXJvbm1lbnQuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChyZXNwb3NlV3JhcHBlckRlY2xhcmF0aW9uKSk7Ci0KLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uVmFsdWU+IGNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25WYWx1ZT4oKTsKLSAgICAgICAgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgUU5hbWU+KCk7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciByZXF1ZXN0V3JhcHBlciA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBSZXF1ZXN0V3JhcHBlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RXcmFwcGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHJlcXVlc3RXcmFwcGVyLCBDTEFTU19OQU1FLCBjbGFzc05hbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkTG9jYWxOYW1lKHJlcXVlc3RXcmFwcGVyLCBMT0NBTF9OQU1FLCAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3IgcmVzcG9uc2VXcmFwcGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFJlc3BvbnNlV3JhcHBlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlV3JhcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENsYXNzTmFtZShyZXNwb25zZVdyYXBwZXIsIENMQVNTX05BTUUsIGNsYXNzTmFtZXMpOwotICAgICAgICAgICAgICAgICAgICBhZGRMb2NhbE5hbWUocmVzcG9uc2VXcmFwcGVyLCBMT0NBTF9OQU1FLCAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNldDxSZWZlcmVuY2VUeXBlPiB0aHJvd25UeXBlcyA9IG5ldyBIYXNoU2V0PFJlZmVyZW5jZVR5cGU+KCk7Ci0KLSAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgdGhyb3duVHlwZXMuYWRkQWxsKG1ldGhvZERlY2xhcmF0aW9uLmdldFRocm93blR5cGVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChSZWZlcmVuY2VUeXBlIHJlZmVyZW5jZVR5cGUgOiB0aHJvd25UeXBlcykgewotICAgICAgICAgICAgaWYgKHJlZmVyZW5jZVR5cGUgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gKENsYXNzRGVjbGFyYXRpb24pIHJlZmVyZW5jZVR5cGU7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJGYXVsdCA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGNsYXNzRGVjbGFyYXRpb24sIFdlYkZhdWx0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAod2ViRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUod2ViRmF1bHQsIEZBVUxUX0JFQU4sIGNsYXNzTmFtZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXMuZ2V0KGkpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgY2xhc3NOYW1lcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSBvdGhlckNsYXNzTmFtZSA9IGNsYXNzTmFtZXMuZ2V0KGopOwotICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWUuZ2V0VmFsdWUoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2Uob3RoZXJDbGFzc05hbWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGNsYXNzTmFtZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldSQVBQRVJfRkFVTFRfQkVBTl9OQU1FU19NVVNUX0JFX1VOSVFVRSwgY2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iob3RoZXJDbGFzc05hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XUkFQUEVSX0ZBVUxUX0JFQU5fTkFNRVNfTVVTVF9CRV9VTklRVUUsIG90aGVyQ2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsaWRhdGVRTmFtZXMocU5hbWVzLCBKQVhXU0NvcmVNZXNzYWdlcy5MT0NBTF9OQU1FX0FUVFJJQlVURVNfTVVTVF9CRV9VTklRVUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVFOYW1lcyhNYXA8T2JqZWN0LCBRTmFtZT4gcU5hbWVzLCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0gICAgICAgIE9iamVjdFtdIGtleXMgPSAgcU5hbWVzLmtleVNldCgpLnRvQXJyYXkobmV3IE9iamVjdFtxTmFtZXMuc2l6ZSgpXSk7Ci0gICAgICAgIFFOYW1lW10gdmFsdWVzID0gcU5hbWVzLnZhbHVlcygpLnRvQXJyYXkobmV3IFFOYW1lW3FOYW1lcy5zaXplKCldKTsKLQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IHZhbHVlc1tpXTsKLSAgICAgICAgICAgIGZvcihpbnQgaiA9IGkgKyAxOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgb3RoZXJRTmFtZSA9IHZhbHVlc1tqXTsKLSAgICAgICAgICAgICAgICBpZiAocU5hbWUuZXF1YWxzKG90aGVyUU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZ2V0UG9zaXRpb24oa2V5c1tpXSksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoZXJyb3JNZXNzYWdlLCBxTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGdldFBvc2l0aW9uKGtleXNbal0pLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKGVycm9yTWVzc2FnZSwgb3RoZXJRTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDbGFzc05hbWUoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yLCBTdHJpbmcgYXR0cmlidXRlS2V5LAotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uVmFsdWU+IGNsYXNzTmFtZXMpIHsKLSAgICAgICAgQW5ub3RhdGlvblZhbHVlIGNsYXNzTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgYXR0cmlidXRlS2V5KTsKLSAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZExvY2FsTmFtZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFN0cmluZyBhdHRyaWJ1dGVLZXksCi0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcykgewotICAgICAgICBBbm5vdGF0aW9uVmFsdWUgbG9jYWxOYW1lVmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIGF0dHJpYnV0ZUtleSk7Ci0gICAgICAgIGlmIChsb2NhbE5hbWVWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBxTmFtZXMucHV0KGxvY2FsTmFtZVZhbHVlLCBuZXcgUU5hbWUoZ2V0VGFyZ2V0TmFtZXNwYWNlKGFubm90YXRpb25NaXJyb3IsIG1ldGhvZERlY2xhcmF0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lVmFsdWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tEb2N1bWVudEJhcmVNZXRob2RzKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzKSB7Ci0gICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IGRvY0JhcmVNZXRob2RzID0gbmV3IEFycmF5TGlzdDxNZXRob2REZWNsYXJhdGlvbj4oKTsKLSAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmIChoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZyhtZXRob2REZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBkb2NCYXJlTWV0aG9kcy5hZGQobWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgUU5hbWU+KCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBkb2NCYXJlTWV0aG9kcykgewotICAgICAgICAgICAgZ2V0RG9jdW1lbnRCYXJlT3BlcmF0aW9uUmVxdWVzdChtZXRob2REZWNsYXJhdGlvbiwgcU5hbWVzKTsKLSAgICAgICAgICAgIGdldERvY3VtZW50QmFyZU9wZXJhdGlvblJlc3BvbnNlKG1ldGhvZERlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsaWRhdGVRTmFtZXMocU5hbWVzLCBKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9NRVRIT0RTX1VOSVFVRV9YTUxfRUxFTUVOVFMpOwotICAgIH0KLQotICAgIHByaXZhdGUgU291cmNlUG9zaXRpb24gZ2V0UG9zaXRpb24oT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFubm90YXRpb25WYWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuICgoQW5ub3RhdGlvblZhbHVlKSB2YWx1ZSkuZ2V0UG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuICgoTWV0aG9kRGVjbGFyYXRpb24pIHZhbHVlKS5nZXRQb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQYXJhbWV0ZXJEZWNsYXJhdGlvbikgdmFsdWUpLmdldFBvc2l0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdldERvY3VtZW50QmFyZU9wZXJhdGlvblJlcXVlc3QoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGdldFdlYlBhcmFtTW9kZSh3ZWJQYXJhbSwgcGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChtb2RlLmVxdWFscyhNb2RlLklOLm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldE9wZXJhdGlvblJlcXVlc3Qod2ViUGFyYW0sIG1ldGhvZERlY2xhcmF0aW9uLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgcU5hbWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHFOYW1lcy5wdXQocGFyYW1ldGVyRGVjbGFyYXRpb24sIGdldE9wZXJhdGlvblJlcXVlc3REZWZhdWx0KG1ldGhvZERlY2xhcmF0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0T3BlcmF0aW9uUmVxdWVzdChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLAotICAgICAgICAgICAgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24sIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIE5BTUUpOwotICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZShnZXRUYXJnZXROYW1lc3BhY2UoYW5ub3RhdGlvbk1pcnJvciwgbWV0aG9kRGVjbGFyYXRpb24pLCBuYW1lLmdldFZhbHVlKCkKLSAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcU5hbWVzLnB1dChuYW1lLCBxTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBxTmFtZXMucHV0KHBhcmFtZXRlckRlY2xhcmF0aW9uLCBnZXRPcGVyYXRpb25SZXF1ZXN0RGVmYXVsdChtZXRob2REZWNsYXJhdGlvbikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRPcGVyYXRpb25SZXF1ZXN0RGVmYXVsdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShtZXRob2REZWNsYXJhdGlvbi5nZXREZWNsYXJpbmdUeXBlKCkpLCBtZXRob2REZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgIC5nZXRTaW1wbGVOYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXREb2N1bWVudEJhcmVPcGVyYXRpb25SZXNwb25zZShNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcykgewotICAgICAgICBpZiAoIXJldHVybnNWb2lkKG1ldGhvZERlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgZ2V0T3BlcmF0aW9uUmVzcG9uc2UoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYlJlc3VsdC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUuZXF1YWxzKE1vZGUuT1VULm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpICYmICFpc0hlYWRlcih3ZWJQYXJhbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE9wZXJhdGlvblJlc3BvbnNlKHdlYlBhcmFtLCBtZXRob2REZWNsYXJhdGlvbiwgcU5hbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnZXREZWZhdWx0V2ViUGFyYW1Nb2RlKHBhcmFtZXRlckRlY2xhcmF0aW9uKS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHFOYW1lcy5wdXQocGFyYW1ldGVyRGVjbGFyYXRpb24sIGdldE9wZXJhdGlvblJlc3BvbnNlRGVmYXVsdChtZXRob2REZWNsYXJhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0T3BlcmF0aW9uUmVzcG9uc2UoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIE5BTUUpOwotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHFOYW1lcy5wdXQobmFtZSwgbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShhbm5vdGF0aW9uTWlycm9yLCBtZXRob2REZWNsYXJhdGlvbiksIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcU5hbWVzLnB1dChtZXRob2REZWNsYXJhdGlvbiwgZ2V0T3BlcmF0aW9uUmVzcG9uc2VEZWZhdWx0KG1ldGhvZERlY2xhcmF0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBxTmFtZXMucHV0KG1ldGhvZERlY2xhcmF0aW9uLCBnZXRPcGVyYXRpb25SZXNwb25zZURlZmF1bHQobWV0aG9kRGVjbGFyYXRpb24pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUU5hbWUgZ2V0T3BlcmF0aW9uUmVzcG9uc2VEZWZhdWx0KE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoZ2V0VGFyZ2V0TmFtZXNwYWNlKG1ldGhvZERlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKSksIG1ldGhvZERlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgLmdldFNpbXBsZU5hbWUoKQotICAgICAgICAgICAgICAgICsgUkVTUE9OU0VfU1VGRklYKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yKSB7Ci0gICAgICAgIEJvb2xlYW4gaGVhZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEJvb2xlYW5WYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBIRUFERVIpOwotICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYlBhcmFtTW9kZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBtb2RlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb25NaXJyb3IsIE1PREUpOwotICAgICAgICBpZiAobW9kZSA9PSBudWxsIHx8IG1vZGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbW9kZSA9IGdldERlZmF1bHRXZWJQYXJhbU1vZGUocGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRXZWJQYXJhbU1vZGUoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRUeXBlKCkpOwotICAgICAgICBpZiAodHlwZU1pcnJvci50b1N0cmluZygpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIE1vZGUuSU5PVVQubmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNb2RlLklOLm5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcmV0dXJuc1ZvaWQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKS5lcXVhbHMoZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0Vm9pZFR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTWV0aG9kUGFyYW1ldGVycyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZERlY2xhcmF0aW9uPigpOwotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAvL05vdCBEb2MgQmFyZQotICAgICAgICAgICAgaWYgKCFoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZyhtZXRob2REZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kcykgewotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uVmFsdWU+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uVmFsdWU+KCk7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gKExpc3Q8UGFyYW1ldGVyRGVjbGFyYXRpb24+KSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSBuYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJQYXJhbSwgTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGb3JHZW5lcmF0ZWROYW1lQ2xhc2gobmFtZSwgcGFyYW1ldGVyRGVjbGFyYXRpb24sIHBhcmFtZXRlcnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBuYW1lcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbmFtZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG90aGVyTmFtZSA9IG5hbWVzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUudG9TdHJpbmcoKS5lcXVhbHMob3RoZXJOYW1lLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuUEFSQU1FVEVSX05BTUVfQ0xBU0gsIG5hbWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG90aGVyTmFtZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5QQVJBTUVURVJfTkFNRV9DTEFTSCwgb3RoZXJOYW1lLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RGb3JHZW5lcmF0ZWROYW1lQ2xhc2goQW5ub3RhdGlvblZhbHVlIHdlYlBhcmFtTmFtZSwgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyLAotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHdlYlBhcmFtTmFtZS50b1N0cmluZygpOwotICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobmFtZSk7Ci0gICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgaW50IGFyZ04gPSBJbnRlZ2VyLnBhcnNlSW50KG5hbWUuc3Vic3RyaW5nKDMpKTsKLSAgICAgICAgICAgIGlmIChhcmdOICE9IHBhcmFtZXRlcnMuaW5kZXhPZihwYXJhbWV0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ04gPCBwYXJhbWV0ZXJzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJOID0gcGFyYW1ldGVycy5nZXQoYXJnTik7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW1OID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyTiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAod2ViUGFyYW1OICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSB3ZWJQYXJhbU5hbWVOID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJQYXJhbU4sIE5BTUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtTmFtZU4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IocGFyYW1ldGVyTi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3ZWJQYXJhbU5hbWVOLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViUGFyYW1OYW1lTi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihwYXJhbWV0ZXJOLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZ2V0QXR0cmlidXRlVmFsdWUodHlwZURlY2xhcmF0aW9uLCBXZWJTZXJ2aWNlLmNsYXNzLCBUQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZSh0eXBlRGVjbGFyYXRpb24uZ2V0UGFja2FnZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBUQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBnZXRUYXJnZXROYW1lc3BhY2UobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShtZXRob2REZWNsYXJhdGlvbiwgV2ViTWV0aG9kLmNsYXNzLCBPUEVSQVRJT05fTkFNRSk7Ci0gICAgICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25OYW1lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICBpZiAoc29hcEJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUoc29hcEJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICByZXR1cm4gaGFzRG9jdW1lbnRCYXJlU09BUEJpbmRpbmcobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGQ1ZjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViTWV0aG9kLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248QW5ub3RhdGlvbk1pcnJvcj4gYW5ub3RhdGlvbk1pcnJvcnMgPSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyYXRpb24oKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFjaGVja0ZvcldlYlNlcnZpY2VBbm5vdGF0aW9uKCgoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKS5nZXREZWNsYXJpbmdUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfU1VQUE9SVEVEX09OX0NMQVNTRVNfV0lUSF9XRUJTRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0ZvcldlYlNlcnZpY2VBbm5vdGF0aW9uKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgV2ViU2VydmljZS5jbGFzcykgIT0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RFeGNsdWRlUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2ZDM0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5FWENMVURFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kRXhjbHVkZVJ1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJNZXRob2QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50LmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZXhjbHVkZUF0dHJpYnV0ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENMVURFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2x1ZGVBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IG1ldGhvZERlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoQm9vbGVhbikgZXhjbHVkZUF0dHJpYnV0ZS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX05PVF9BTExPV0VEX09OX1NFSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGFubm90YXRpb25NaXJyb3IuZ2V0RWxlbWVudFZhbHVlcygpLnNpemUoKSA+IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQm9vbGVhbi52YWx1ZU9mKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0VmFsdWUoKS50b1N0cmluZygpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjAxMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1vZGlmaWVyOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQkKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViTWV0aG9kLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKAotICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPE1vZGlmaWVyPiBtb2RpZmllcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX09OX1BVQkxJQ19NRVRIT0RTKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuRklOQUwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtZXRob2REZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfTk9fRklOQUxfTU9ESUZJRVJfQUxMT1dFRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuU1RBVElDKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY2YTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Nb2RpZmllcjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgLmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24gJiYgIShkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiA9IChDbGFzc0RlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGNvbnN0cnVjdG9ycyA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0Q29uc3RydWN0b3JzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9ycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBoYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDogY29uc3RydWN0b3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRGVmYXVsdENvbnN0cnVjdG9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWhhc0RlZmF1bHRDb25zdHJ1Y3RvcikgewotICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIG1pcnJvciA6IGFubm90YXRpb25NaXJyb3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKGFubm90YXRpb25EZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGRlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRUpCTW9kdWxlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRUpCTW9kdWxlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTUwN2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZUVKQk1vZHVsZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLmVudi5FY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRUpCTW9kdWxlUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVMRVNTID0gImphdmF4LmVqYi5TdGF0ZWxlc3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9GQUNFVCA9ICJqc3QuZWpiIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfRkFDRVRfVkVSU0lPTiA9ICIzLjAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBpZiAoZW52aXJvbm1lbnQgaW5zdGFuY2VvZiBFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KSB7Ci0gICAgICAgICAgICBFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGVjbGlwc2VFbnZpcm9ubWVudCA9IChFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KSBlbnZpcm9ubWVudDsKLQotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGVjbGlwc2VFbnZpcm9ubWVudC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRmFjZXRlZFByb2plY3QocHJvamVjdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChFSkJfRkFDRVQpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRUpCX0ZBQ0VUKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKS5lcXVhbHMoRUpCX0ZBQ0VUX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiB3ZWJTZXJ2aWNlRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZWNsaXBzZUVudmlyb25tZW50LmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlY2xpcHNlRW52aXJvbm1lbnQuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aCh3ZWJTZXJ2aWNlRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U3RhdGVsZXNzQW5ub3RhdGlvbihkZWNsYXJhdGlvbikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfT05MWV9PTl9TVEFURUxFU1NfU0VTU0lPTl9CRUFOUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEFubm90YXRpb25NaXJyb3IgZ2V0U3RhdGVsZXNzQW5ub3RhdGlvbihEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgOiBhYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiA9IGFubm90YXRpb25NaXJyb3IuZ2V0QW5ub3RhdGlvblR5cGUoKS5nZXREZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoU1RBVEVMRVNTKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uTWlycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZhY2V0ZWRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgU2V0PElGYWNldGVkUHJvamVjdD4gZmFjZXRlZFByb2plY3RzID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0RmFjZXRlZFByb2plY3RzKCk7Ci0gICAgICAgIGZvciAoSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0IDogZmFjZXRlZFByb2plY3RzKSB7Ci0gICAgICAgICAgICBpZiAoZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzRiZDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkZJTkFMSVpFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gZmluYWxpemVNZXRob2QgPSBnZXRGaW5hbGl6ZU1ldGhvZChkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICBpZiAoZmluYWxpemVNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGZpbmFsaXplTWV0aG9kLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2REZWNsYXJhdGlvbiBnZXRGaW5hbGl6ZU1ldGhvZChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKWRlY2xhcmF0aW9uOwotICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uLmdldFNpbXBsZU5hbWUoKS5lcXVhbHMoRklOQUxJWkUpIAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUGFyYW1ldGVyc1JldHVyblR5cGVzUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUGFyYW1ldGVyc1JldHVyblR5cGVzUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmJlYTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVBhcmFtZXRlcnNSZXR1cm5UeXBlc1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5lbnYuRWNsaXBzZUFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbjsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5JbnRlcmZhY2VEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Nb2RpZmllcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5BcnJheVR5cGU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5DbGFzc1R5cGU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5JbnRlcmZhY2VUeXBlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuVHlwZU1pcnJvcjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQYXJhbWV0ZXJzUmV0dXJuVHlwZXNSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEpBVkFfVFlQRVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBBTExPV0VEX0lOX01VTFRJUExFX0lOSEVSSVRBTkNFID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEudXRpbC5DYWxlbmRhciIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuRGF0ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkFycmF5TGlzdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuSGFzaFNldCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuTGlua2VkTGlzdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuTGlzdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuU3RhY2siKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLlZlY3RvciIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubWF0aC5CaWdEZWNpbWFsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubWF0aC5CaWdJbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuVVVJRCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLm5ldC5VUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5hd3QuSW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Cb29sZWFuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5DaGFyYWN0ZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkZsb2F0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5CeXRlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Eb3VibGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkxvbmciKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLlNob3J0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Wb2lkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5pby5TZXJpYWxpemFibGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkNsb25lYWJsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuQ29tcGFyYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEudXRpbC5NYXAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkhhc2hNYXAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkhhc2h0YWJsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5FeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLlRocm93YWJsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEFMTE9XRURfSU5fTVVMVElQTEVfSU5IRVJJVEFOQ0UuYWRkKCJqYXZhLmxhbmcuQ2xvbmVhYmxlIik7IC8vICROT04tTkxTJAotICAgICAgICBBTExPV0VEX0lOX01VTFRJUExFX0lOSEVSSVRBTkNFLmFkZCgiamF2YS5sYW5nLkNvbXBhcmFibGUiKTsgLy8gJE5PTi1OTFMkCi0gICAgICAgIEFMTE9XRURfSU5fTVVMVElQTEVfSU5IRVJJVEFOQ0UuYWRkKCJqYXZhLmlvLlNlcmlhbGl6YWJsZSIpOyAvLyAkTk9OLU5MUyQKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX09CSkVDVCA9ICJqYXZhLnJtaS5SZW1vdGUiOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiB3ZWJTZXJ2aWNlRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKHdlYlNlcnZpY2VEZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlTWV0aG9kUGFyYW1ldGVyc0FuZFJldHVyblR5cGVzKChJbnRlcmZhY2VEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWV0aG9kUGFyYW1ldGVyc0FuZFJldHVyblR5cGVzKEludGVyZmFjZURlY2xhcmF0aW9uIGludGVyZmFjZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gaW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpOwotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kcykgewotICAgICAgICAgICAgVHlwZU1pcnJvciByZXR1cm5UeXBlID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgdmFsaWRhdGVUeXBlTWlycm9yKHJldHVyblR5cGUsIG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSAgbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVR5cGVNaXJyb3IocGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0VHlwZSgpLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVUeXBlTWlycm9yKFR5cGVNaXJyb3IgcmV0dXJuVHlwZSwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgaWYgKHJldHVyblR5cGUgaW5zdGFuY2VvZiBBcnJheVR5cGUpIHsKLSAgICAgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSByZXR1cm5UeXBlOwotCi0gICAgICAgICAgICBUeXBlTWlycm9yIGNvbXBvbmVudFR5cGUgPSBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gKENsYXNzRGVjbGFyYXRpb24pIGNvbXBvbmVudFR5cGU7Ci0gICAgICAgICAgICAgICAgY2hlY2tDbGFzc1Jlc3RyaWN0aW9uKGNsYXNzRGVjbGFyYXRpb24sIG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXR1cm5UeXBlIGluc3RhbmNlb2YgSW50ZXJmYWNlVHlwZSkgewotICAgICAgICAgICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlID0gKEludGVyZmFjZVR5cGUpIHJldHVyblR5cGU7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFR5cGVNaXJyb3I+IHR5cGVBcmd1bWVudHMgPSBpbnRlcmZhY2VUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKFR5cGVNaXJyb3IgdHlwZU1pcnJvciA6IHR5cGVBcmd1bWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZU1pcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ2xhc3NSZXN0cmljdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tJbnRlcmZhY2UoKEludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlTWlycm9yLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0ludGVyZmFjZShpbnRlcmZhY2VUeXBlLmdldERlY2xhcmF0aW9uKCksIG1ldGhvZERlY2xhcmF0aW9uKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJldHVyblR5cGUgaW5zdGFuY2VvZiBDbGFzc1R5cGUpIHsKLSAgICAgICAgICAgIENsYXNzVHlwZSBjbGFzc1R5cGUgPSAoQ2xhc3NUeXBlKSByZXR1cm5UeXBlOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxUeXBlTWlycm9yPiB0eXBlQXJndW1lbnRzID0gY2xhc3NUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKFR5cGVNaXJyb3IgdHlwZU1pcnJvciA6IHR5cGVBcmd1bWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZU1pcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ2xhc3NSZXN0cmljdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjbGFzc1R5cGUuZ2V0RGVjbGFyYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrQ2xhc3NSZXN0cmljdGlvbihjbGFzc1R5cGUuZ2V0RGVjbGFyYXRpb24oKSwgbWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xhc3NSZXN0cmljdGlvbihDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIGNoZWNrSW5uZXJQdWJsaWNTdGF0aWNUeXBlcyhjbGFzc0RlY2xhcmF0aW9uLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgIGNoZWNrSWZSZW1vdGVPYmplY3QoY2xhc3NEZWNsYXJhdGlvbiwgbWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICBjaGVja0Fic3RhY3RUeXBlKGNsYXNzRGVjbGFyYXRpb24sIG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgY2hlY2tNdWx0aXBsZUluaGVyaXRhbmNlKGNsYXNzRGVjbGFyYXRpb24sIG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJbm5lclB1YmxpY1N0YXRpY1R5cGVzKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgaWYgKGhhc0lubmVyTm9uUHVibGljU3RhdGljVHlwZXMoY2xhc3NEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSEFTX0lOQURNSVNTSUJMRV9JTk5FUl9UWVBFUywgY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNJbm5lck5vblB1YmxpY1N0YXRpY1R5cGVzKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoaXNKYXZhVHlwZShjbGFzc0RlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkgJiYgSkFWQV9UWVBFUy5jb250YWlucyhjbGFzc0RlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBDb2xsZWN0aW9uPFR5cGVEZWNsYXJhdGlvbj4gbmVzdGVkVHlwZXMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldE5lc3RlZFR5cGVzKCk7Ci0gICAgICAgIGZvciAoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA6IG5lc3RlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoIXR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpCi0gICAgICAgICAgICAgICAgICAgIHx8ICF0eXBlRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuU1RBVElDKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJbnRlcmZhY2UoSW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIGlmICghaXNTdWl0YWJsZUludGVyZmFjZShpbnRlcmZhY2VEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSU5URVJGQUNFU19OT1RfU1VQUE9SVEVELCBpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1aXRhYmxlSW50ZXJmYWNlKEludGVyZmFjZURlY2xhcmF0aW9uIGludGVyZmFjZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBpc0phdmFUeXBlKGludGVyZmFjZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkgJiYgSkFWQV9UWVBFUy5jb250YWlucyhpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpCi0gICAgICAgIHx8IGlzWE1MVHlwZShpbnRlcmZhY2VEZWNsYXJhdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzWE1MVHlwZShJbnRlcmZhY2VEZWNsYXJhdGlvbiBpbnRlcmZhY2VEZWNsYXJhdGlvbikgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oaW50ZXJmYWNlRGVjbGFyYXRpb24sIFhtbFR5cGUuY2xhc3MpICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSWZSZW1vdGVPYmplY3QoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoaXNSZW1vdGVPYmplY3QoY2xhc3NEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSVNfUkVNT1RFX09CSkVDVCwgY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbW90ZU9iamVjdChDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQ29sbGVjdGlvbjxJbnRlcmZhY2VUeXBlPiBzdXBlckludGVyZmFjZXMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyaW50ZXJmYWNlcygpOwotICAgICAgICBmb3IgKEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA6IHN1cGVySW50ZXJmYWNlcykgewotCi0gICAgICAgICAgICBpZiAoaW50ZXJmYWNlVHlwZS5nZXREZWNsYXJhdGlvbigpICE9IG51bGwgJiYgaW50ZXJmYWNlVHlwZS5nZXREZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoUkVNT1RFX09CSkVDVCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWJzdGFjdFR5cGUoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoY2xhc3NEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5BQlNUUkFDVCkpIHsKLSAgICAgICAgICAgIGlmIChlbnZpcm9ubWVudCBpbnN0YW5jZW9mIEVjbGlwc2VBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQpIHsKLSAgICAgICAgICAgICAgICBFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGVjbGlwc2VFbnZpcm9ubWVudCA9IChFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KSBlbnZpcm9ubWVudDsKLSAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBlY2xpcHNlRW52aXJvbm1lbnQuZ2V0SmF2YVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIElUeXBlW10gc3ViVHlwZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VidHlwZXModHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdWJUeXBlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElUeXBlIHN1YlR5cGUgOiBzdWJUeXBlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRmxhZ3MuaXNBYnN0cmFjdChzdWJUeXBlLmdldEZsYWdzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAgZW52aXJvbm1lbnQuZ2V0VHlwZURlY2xhcmF0aW9uKHN1YlR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBzdWJUeXBlRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlT2JqZWN0KHN1YlR5cGVEZWNsYXJhdGlvbikgfHwgaGFzSW5uZXJOb25QdWJsaWNTdGF0aWNUeXBlcyhzdWJUeXBlRGVjbGFyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGltcGxlbWVudHNNdWx0aXBsZUludGVyZmFjZXMoc3ViVHlwZURlY2xhcmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbXBsZW1lbnRzQ2xhc3NBbmRJbnRlcmZhY2Uoc3ViVHlwZURlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkFCU1RSQUNUX0NMQVNTX05PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkFCU1RSQUNUX0NMQVNTX05PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpbXBsZW1lbnRzTXVsdGlwbGVJbnRlcmZhY2VzKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoaGFzU3VwZXJDbGFzcyhjbGFzc0RlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIGNvdW50QWxsb3dlZEludGVyZmFjZXMoY2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlcmludGVyZmFjZXMoKSkgPiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaW1wbGVtZW50c0NsYXNzQW5kSW50ZXJmYWNlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoIWhhc1N1cGVyQ2xhc3MoY2xhc3NEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBjb3VudEFsbG93ZWRJbnRlcmZhY2VzKGNsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJpbnRlcmZhY2VzKCkpID4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1N1cGVyQ2xhc3MoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENsYXNzVHlwZSBzdXBlckNsYXNzID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIGlmIChzdXBlckNsYXNzLmdldERlY2xhcmF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBzdXBlckNsYXNzLmdldERlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgcmV0dXJuIHF1YWxpZmllZE5hbWUuZXF1YWxzKE9iamVjdC5jbGFzcy5nZXROYW1lKCkpIHx8IHF1YWxpZmllZE5hbWUuZXF1YWxzKEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNdWx0aXBsZUluaGVyaXRhbmNlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgaWYgKGltcGxlbWVudHNNdWx0aXBsZUludGVyZmFjZXMoY2xhc3NEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VOYW1lcyA9IGdldEFsbG93ZWRJbnRlcmZhY2VOYW1lcyhjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyaW50ZXJmYWNlcygpKTsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSU1QTEVNRU5UU19NVUxUSVBMRV9JTlRFUkZBQ0VTLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0IFtdIHsgY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCksIGludGVyZmFjZU5hbWVzLmdldCgwKSwgaW50ZXJmYWNlTmFtZXMuZ2V0KDEpIH0pKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW1wbGVtZW50c0NsYXNzQW5kSW50ZXJmYWNlKGNsYXNzRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gaW50ZXJmYWNlTmFtZXMgPSBnZXRBbGxvd2VkSW50ZXJmYWNlTmFtZXMoY2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlcmludGVyZmFjZXMoKSk7Ci0gICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLklOSEVSSVRBTkNFX0FORF9JTVBMRU1FTlRBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtjbGFzc0RlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyY2xhc3MoKS5nZXREZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lcy5nZXQoMCl9ICkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0QWxsb3dlZEludGVyZmFjZU5hbWVzKENvbGxlY3Rpb248SW50ZXJmYWNlVHlwZT4gc3VwZXJJbnRlcmZhY2VzKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmb3IgKEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA6IHN1cGVySW50ZXJmYWNlcykgewotICAgICAgICAgICAgaWYgKGludGVyZmFjZVR5cGUuZ2V0RGVjbGFyYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSW50ZXJmYWNlRGVjbGFyYXRpb24gc3VwZXJJbnRlcmZhY2UgPSBpbnRlcmZhY2VUeXBlLmdldERlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFBTExPV0VEX0lOX01VTFRJUExFX0lOSEVSSVRBTkNFLmNvbnRhaW5zKHN1cGVySW50ZXJmYWNlLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZXMuYWRkKHN1cGVySW50ZXJmYWNlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VOYW1lczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjb3VudEFsbG93ZWRJbnRlcmZhY2VzKENvbGxlY3Rpb248SW50ZXJmYWNlVHlwZT4gc3VwZXJJbnRlcmZhY2VzKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlIDogc3VwZXJJbnRlcmZhY2VzKSB7Ci0gICAgICAgICAgICBpZiAoaW50ZXJmYWNlVHlwZS5nZXREZWNsYXJhdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbnRlcmZhY2VEZWNsYXJhdGlvbiBzdXBlckludGVyZmFjZSA9IGludGVyZmFjZVR5cGUuZ2V0RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoIUFMTE9XRURfSU5fTVVMVElQTEVfSU5IRVJJVEFOQ0UuY29udGFpbnMoc3VwZXJJbnRlcmZhY2UuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSmF2YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0gICAgICAgIHJldHVybiB0eXBlTmFtZS5zdGFydHNXaXRoKCJqYXZhLiIpICB8fCB0eXBlTmFtZS5zdGFydHNXaXRoKCJqYXZheC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTc1YTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVByb3ZpZGVyUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlZBTFVFOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7DQotDQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNvbnN0cnVjdG9yRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5JbnRlcmZhY2VEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTW9kaWZpZXI7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuSW50ZXJmYWNlVHlwZTsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5UeXBlTWlycm9yOw0KLQ0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBwcm9jZXNzKCkgew0KLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOw0KLQ0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7DQotICAgICAgICAJaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgCQljaGVja0ZvckRlZmF1bHRDb25zdHJ1Y3RvcigoQ2xhc3NEZWNsYXJhdGlvbilkZWNsYXJhdGlvbik7DQotICAgICAgICAJCWNoZWNrRm9yUHJvdmlkZXJJbnRlcmZhY2UoKENsYXNzRGVjbGFyYXRpb24pZGVjbGFyYXRpb24pOw0KLSAgICAgICAgCX0NCi0gICAgICAgIH0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yUHJvdmlkZXJJbnRlcmZhY2UoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBDb2xsZWN0aW9uPEludGVyZmFjZVR5cGU+IGludGVyZmFjZXMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyaW50ZXJmYWNlcygpOw0KLSAgICAgICAgYm9vbGVhbiBpbXBsZW1lbnRzVHlwZWRQcm92aWRlciA9IGZhbHNlOw0KLSAgICAgICAgaWYgKGludGVyZmFjZXMuc2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlIDogaW50ZXJmYWNlcykgew0KLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFR5cGVNaXJyb3I+IHR5cGVQYXJhbWV0ZXJzID0gaW50ZXJmYWNlVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCk7DQotICAgICAgICAgICAgICAgIGlmICh0eXBlUGFyYW1ldGVycy5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKFR5cGVNaXJyb3IgdHlwZU1pcnJvciA6IHR5cGVQYXJhbWV0ZXJzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsID0gKENsYXNzRGVjbGFyYXRpb24pIHR5cGVNaXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc0RlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhTT0FQTWVzc2FnZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NPQVBNZXNzYWdlUmVxdWlyZW1lbnRzKGNsYXNzRGVjbGFyYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50c1R5cGVkUHJvdmlkZXIgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnRlZEludGVyZmFjZXMgPSBjbGFzc0RlY2wuZ2V0U3VwZXJpbnRlcmZhY2VzKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbXBsZW1lbnRlZEludGVyZmFjZSA6IGltcGxlbWVudGVkSW50ZXJmYWNlcykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbCA9IGltcGxlbWVudGVkSW50ZXJmYWNlLmdldERlY2xhcmF0aW9uKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhTb3VyY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzVHlwZWRQcm92aWRlciA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKERhdGFTb3VyY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0RhdGFTb3VyY2VSZXF1aXJlbWVudHMoY2xhc3NEZWNsYXJhdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHNUeXBlZFByb3ZpZGVyID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlTWlycm9yIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbCA9IChJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZU1pcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhTb3VyY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50c1R5cGVkUHJvdmlkZXIgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhEYXRhU291cmNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRGF0YVNvdXJjZVJlcXVpcmVtZW50cyhjbGFzc0RlY2xhcmF0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHNUeXBlZFByb3ZpZGVyID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFpbXBsZW1lbnRzVHlwZWRQcm92aWRlcikgew0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZVByb3ZpZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcyk7DQotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHdlYlNlcnZpY2VQcm92aWRlci5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VQUk9WSURFUl9JTVBMRU1FTlRfVFlQRURfUFJPVklERVJfSU5URVJGQUNFKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU09BUE1lc3NhZ2VSZXF1aXJlbWVudHMoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBpZiAoIWlzU09BUEJpbmRpbmcoY2xhc3NEZWNsYXJhdGlvbikpIHsNCi0gICAgICAgICAgICBwcmludEVycm9yKGNsYXNzRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVBST1ZJREVSX1NPQVBNRVNTQUdFX1NPQVBCSU5ESU5HKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghaXNNZXNzYWdlTW9kZShjbGFzc0RlY2xhcmF0aW9uKSkgew0KLSAgICAgICAgICAgIHByaW50RXJyb3IoY2xhc3NEZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUFJPVklERVJfU09BUE1FU1NBR0VfTUVTU0FHRV9NT0RFKTsNCi0gICAgICAgIH0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRGF0YVNvdXJjZVJlcXVpcmVtZW50cyhDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIGlmICghaXNIVFRQQmluZGluZyhjbGFzc0RlY2xhcmF0aW9uKSkgew0KLSAgICAgICAgICAgIHByaW50RXJyb3IoY2xhc3NEZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUFJPVklERVJfREFUQVNPVVJDRV9IVFRQQklORElORyk7DQotICAgICAgICB9DQotDQotCSAgICBpZiAoIWlzTWVzc2FnZU1vZGUoY2xhc3NEZWNsYXJhdGlvbikpIHsNCi0gICAgICAgICAgICBwcmludEVycm9yKGNsYXNzRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVBST1ZJREVSX0RBVEFTT1VSQ0VfTUVTU0FHRV9NT0RFKTsNCi0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQkNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU09BUEJpbmRpbmcoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBTdHJpbmcgYmluZGluZ1R5cGUgPSBnZXRCaW5kaW5nVHlwZVZhbHVlKGNsYXNzRGVjbGFyYXRpb24pOw0KLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpIA0KLSAgICAgICAgICAgICAgICB8fCBiaW5kaW5nVHlwZS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKQ0KLSAgICAgICAgICAgICAgICB8fCBiaW5kaW5nVHlwZS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpDQotICAgICAgICAgICAgICAgIHx8IGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIVFRQQmluZGluZyhDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGdldEJpbmRpbmdUeXBlVmFsdWUoY2xhc3NEZWNsYXJhdGlvbik7DQotICAgICAgICBpZiAoYmluZGluZ1R5cGUuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRCaW5kaW5nVHlwZVZhbHVlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBiaW5kaW5nVHlwZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGNsYXNzRGVjbGFyYXRpb24sIEJpbmRpbmdUeXBlLmNsYXNzKTsNCi0gICAgICAgIGlmIChiaW5kaW5nVHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGJpbmRpbmdUeXBlLCBWQUxVRSk7DQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWVzc2FnZU1vZGUoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICByZXR1cm4gZ2V0U2VydmljZU1vZGUoY2xhc3NEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuTUVTU0FHRS5uYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BheWxvYWRNb2RlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgcmV0dXJuIGdldFNlcnZpY2VNb2RlKGNsYXNzRGVjbGFyYXRpb24pLmVxdWFscyhNb2RlLlBBWUxPQUQubmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTZXJ2aWNlTW9kZShDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc2VydmljZU1vZGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBTZXJ2aWNlTW9kZS5jbGFzcyk7DQotICAgICAgICBpZiAoc2VydmljZU1vZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShzZXJ2aWNlTW9kZSwgVkFMVUUpOw0KLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gTW9kZS5QQVlMT0FELnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yRGVmYXVsdENvbnN0cnVjdG9yKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLQkJYm9vbGVhbiBoYXNEZWZhdWx0Q29uc3RydWN0b3IgPSBmYWxzZTsNCi0JCUNvbGxlY3Rpb248Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4gY29uc3RydWN0b3JzID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRDb25zdHJ1Y3RvcnMoKTsNCi0JCWlmIChjb25zdHJ1Y3RvcnMuc2l6ZSgpID09IDApIHsNCi0JCQloYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOw0KLQkJfSBlbHNlIHsNCi0JCQlmb3IgKENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA6IGNvbnN0cnVjdG9ycykgew0KLQkJCQlpZiAoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpICYmIA0KLQkJCQkJCWNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7DQotCQkJCQloYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlpZiAoIWhhc0RlZmF1bHRDb25zdHJ1Y3Rvcikgew0KLQkJCUFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZVByb3ZpZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwgV2ViU2VydmljZVByb3ZpZGVyLmNsYXNzKTsNCi0JCQlwcmludEZpeGFibGVFcnJvcih3ZWJTZXJ2aWNlUHJvdmlkZXIuZ2V0UG9zaXRpb24oKSwNCi0JCQkgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VQUk9WSURFUl9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUik7IA0KLQkJfSAgICAgICAgICAgICAgICANCi0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1ZTM4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5JbnRlcmZhY2VEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Nb2RpZmllcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGRlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfQ0xBU1NfT1JfSU5URVJGQUNFX09OTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3REZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGRlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfQ0xBU1NfT1JfSU5URVJGQUNFX09OTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3REZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdERlY2xhcmF0aW9uKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPE1vZGlmaWVyPiBtb2RpZmllcnMgPSBkZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgaWYgKG1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5GSU5BTCkgfHwgbW9kaWZpZXJzLmNvbnRhaW5zKE1vZGlmaWVyLkFCU1RSQUNUKQotICAgICAgICAgICAgICAgIHx8ICFtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25NaXJyb3IgbWlycm9yIDogYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKWRlY2xhcmF0aW9uOwotICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmdldE5lc3RlZFR5cGVzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgdGVzdE5lc3RlZFR5cGVzKHR5cGVEZWNsYXJhdGlvbi5nZXROZXN0ZWRUeXBlcygpLCBhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3ROZXN0ZWRUeXBlcyhDb2xsZWN0aW9uPFR5cGVEZWNsYXJhdGlvbj4gbmVzdGVkVHlwZXMsQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24pIHsKLSAgICAgICAgZm9yIChUeXBlRGVjbGFyYXRpb24gbmVzdGVkRGVjbGFyYXRpb24gOiBuZXN0ZWRUeXBlcykgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IG5lc3RlZERlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25NaXJyb3IgbWlycm9yIDogYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUmVmc1J1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VSZWZzUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3ZjVlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VSZWZzUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTkFNRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVFlQRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVkFMVUU7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWZzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUmVmc1J1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7DQotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlUmVmcy5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudA0KLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKTsNCi0NCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgew0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZVJlZnMgPSBBbm5vdGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBXZWJTZXJ2aWNlUmVmcy5jbGFzcyk7DQotDQotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHdlYlNlcnZpY2VSZWZzVmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKHdlYlNlcnZpY2VSZWZzLCBWQUxVRSk7DQotDQotICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2VSZWZzVmFsdWUgIT0gbnVsbCAmJiB3ZWJTZXJ2aWNlUmVmc1ZhbHVlLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBMaXN0PD8+KSB7DQotICAgICAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvblZhbHVlPiB2YWx1ZSA9IChMaXN0PEFubm90YXRpb25WYWx1ZT4pIHdlYlNlcnZpY2VSZWZzVmFsdWUuZ2V0VmFsdWUoKTsNCi0NCi0gICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uVmFsdWUgYW5ub3RhdGlvblZhbHVlIDogdmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uVmFsdWUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb25NaXJyb3IpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2VSZWYgPSAoQW5ub3RhdGlvbk1pcnJvcikgYW5ub3RhdGlvblZhbHVlLmdldFZhbHVlKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdlYlNlcnZpY2VSZWZOYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2VSZWYsIE5BTUUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWJTZXJ2aWNlUmVmTmFtZSA9PSBudWxsIHx8IHdlYlNlcnZpY2VSZWZOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViU2VydmljZVJlZi5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VSRUZTX05BTUVfUkVRVUlSRUQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgd2ViU2VydmljZVJlZk5hbWVUeXBlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VSZWYsIFRZUEUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWJTZXJ2aWNlUmVmTmFtZVR5cGUgIT0gbnVsbCAmJiB3ZWJTZXJ2aWNlUmVmTmFtZVR5cGUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHR5cGUgPSAoQW5ub3RhdGlvblZhbHVlKSB3ZWJTZXJ2aWNlUmVmTmFtZVR5cGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlUmVmLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUkVGU19UWVBFX1JFUVVJUkVEKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViU2VydmljZVJlZi5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VSRUZTX1RZUEVfUkVRVUlSRUQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VTRUlBbGxvd2VkQXR0cmlidXRlc1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSUFsbG93ZWRBdHRyaWJ1dGVzUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzI1MGRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSUFsbG93ZWRBdHRyaWJ1dGVzUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5FTkRQT0lOVF9JTlRFUkZBQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUE9SVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNFUlZJQ0VfTkFNRTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJQWxsb3dlZEF0dHJpYnV0ZXNSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0gICAgICAgIAotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgc2VydmljZU5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgU0VSVklDRV9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHNlcnZpY2VOYW1lLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfU0VSVklDRU5BTUVfU0VJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZW5kcG9pbnRJbnRlcmZhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgRU5EUE9JTlRfSU5URVJGQUNFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGVuZHBvaW50SW50ZXJmYWNlLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5EUE9JTlRJTlRFUkZBQ0VfU0VJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHBvcnROYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZShtaXJyb3IsIFBPUlRfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihwb3J0TmFtZS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BPUlROQU1FX1NFSSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiYTRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VTRUlSZXN0cmljdGlvbnNSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5FTkRQT0lOVF9JTlRFUkZBQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTkFNRTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkludGVyZmFjZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1vZGlmaWVyOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlSZXN0cmljdGlvbnNSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248QW5ub3RhdGlvbk1pcnJvcj4gYW5ub3RhdGlvbk1pcnJvcnMgPSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZW5kcG9pbnRJbnRlcmZhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRQT0lOVF9JTlRFUkZBQ0UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobmFtZS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX05BTUVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUmVzdHJpY3Rpb25zKChDbGFzc0RlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbiwgZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tKU1IxODFBbm5vdGF0aW9ucygoQ2xhc3NEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzdHJpY3Rpb25zKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgQW5ub3RhdGlvblZhbHVlIGVuZHBvaW50SW50ZXJmYWNlKSB7Ci0gICAgICAgIFN0cmluZyBzZWkgPSBlbmRwb2ludEludGVyZmFjZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShzZWkpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBlbnZpcm9ubWVudC5nZXRUeXBlRGVjbGFyYXRpb24oc2VpKTsKLSAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoISh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgfHwgdHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfSU5URVJGQUNFLCBzZWkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihlbmRwb2ludEludGVyZmFjZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9PVVRFUiwgc2VpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfQU5OT1RBVEVELCBzZWkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCF0eXBlRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfUFVCTElDLCBzZWkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyaW50ZXJmYWNlcygpLmNvbnRhaW5zKHR5cGVEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gc2VpTWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IGltcGxNZXRob2RzID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZCA6IHNlaU1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbXBsZW1lbnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIGltcGxNZXRob2QgOiBpbXBsTWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5jb21wYXJlTWV0aG9kcyhzZWlNZXRob2QsIGltcGxNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBsTWV0aG9kLmdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlBVQkxJQykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoaW1wbE1ldGhvZC5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9SRURVQ0VEX1ZJU0lCSUxJVFkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWltcGxNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyhzZWlNZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihpbXBsTWV0aG9kLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX0lOQ09NUEFUSUJMRV9SRVRVUk5fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZSh0eXBlRGVjbGFyYXRpb24sIHNlaU1ldGhvZCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfSU5DT01QQVRJQkxFX1JFVFVSTl9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxNZXRob2QuZ2V0VGhyb3duVHlwZXMoKS5zaXplKCkgIT0gc2VpTWV0aG9kLmdldFRocm93blR5cGVzKCkuc2l6ZSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW1wbE1ldGhvZC5nZXRUaHJvd25UeXBlcygpLmNvbnRhaW5zQWxsKHNlaU1ldGhvZC5nZXRUaHJvd25UeXBlcygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGltcGxNZXRob2QuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfSU5DT01QQVRJQkxFX0VYQ0VQVElPTlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbE1ldGhvZC5nZXRTaW1wbGVOYW1lKCksIHNlaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBsZW1lbnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZSh0eXBlRGVjbGFyYXRpb24sIHNlaU1ldGhvZCkpLCAiIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRFcnJvcihlbmRwb2ludEludGVyZmFjZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5ELCBzZWkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEltcGxlbWVudHNNZXNzYWdlKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcih0eXBlRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZXNzYWdlLmFwcGVuZChzZWlNZXRob2QuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gc2VpTWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgSXRlcmF0b3I8UGFyYW1ldGVyRGVjbGFyYXRpb24+IGl0ZXIgPSBwYXJhbWV0ZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRUeXBlKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCh0eXBlTWlycm9yLnN1YnN0cmluZyh0eXBlTWlycm9yLmxhc3RJbmRleE9mKCIuIikgKyAxKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBtZXNzYWdlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSlNSMTgxQW5ub3RhdGlvbnMoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihzb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkcpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24+IGltcGxNZXRob2RzID0gY2xhc3NEZWNsYXJhdGlvbgotICAgICAgICAuZ2V0TWV0aG9kcygpOwotICAgICAgICBmb3IgKGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogaW1wbE1ldGhvZHMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3IgbXNvYXBCaW5kaW5nID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChtc29hcEJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKG1zb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1NPQVBCSU5ESU5HKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChvbmV3YXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKG9uZXdheS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX09ORVdBWSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViTWV0aG9kID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcih3ZWJNZXRob2QuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJNRVRIT0RTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUmVzdWx0ID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYlJlc3VsdC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAod2ViUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcih3ZWJSZXN1bHQuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJSRVNVTFQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3Iod2ViUGFyYW0uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUEFSQU0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxNTRlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2VSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlRBUkdFVF9OQU1FU1BBQ0U7DQotDQotaW1wb3J0IGphdmEubmV0LlVSSTsNCi1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsNCi0NCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhY2thZ2VEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3Igew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsNCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50DQotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQNCi0gICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7DQotDQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsNCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgdGFyZ2V0TmFtZXNwYWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJTZXJ2aWNlLCBUQVJHRVRfTkFNRVNQQUNFKTsNCi0NCi0gICAgICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOw0KLSAgICAgICAgICAgICAgICAvLw0KLSAgICAgICAgICAgICAgICBQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uID0gdHlwZURlY2xhcmF0aW9uLmdldFBhY2thZ2UoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8IHRhcmdldE5hbWVzcGFjZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHdlYlNlcnZpY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9ERUZBVUxUX1BBQ0tBR0VfVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVVUklTeW50YXgodGFyZ2V0TmFtZXNwYWNlKTsNCi0NCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMgPSAoKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pLmdldE1ldGhvZHMoKTsNCi0gICAgICAgICAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsNCi0gICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlVVJJU3ludGF4KEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUod2ViUGFyYW0sIFRBUkdFVF9OQU1FU1BBQ0UpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVVJJU3ludGF4KEFubm90YXRpb25WYWx1ZSB0YXJnZXROYW1lc3BhY2UpIHsNCi0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIG5ldyBVUkkodGFyZ2V0TmFtZXNwYWNlLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHVyaXNlKSB7DQotICAgICAgICAgICAgICAgIHByaW50RXJyb3IodGFyZ2V0TmFtZXNwYWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuVEFSR0VUX05BTUVTUEFDRV9VUklfU1lOVEFYX0VSUk9SLCBuZXcgT2JqZWN0W10gew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpc2UuZ2V0SW5kZXgoKSwgdXJpc2UuZ2V0SW5wdXQoKSwgdXJpc2UuZ2V0UmVhc29uKCkgfSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXU0RMTG9jYXRpb25SdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXU0RMTG9jYXRpb25SdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YTMzYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRU5EUE9JTlRfSU5URVJGQUNFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkVYQ0xVREU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUE9SVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBPUlRfU1VGRklYOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNFUlZJQ0VfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5TRVJWSUNFX1NVRkZJWDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5TVFlMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UQVJHRVRfTkFNRVNQQUNFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLldTRExfTE9DQVRJT047Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5lbnYuRWNsaXBzZUFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gKENsYXNzRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIGNoZWNrV1NETG9jYXRpb24oY2xhc3NEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXU0RMb2NhdGlvbihDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEFubm90YXRpb25WYWx1ZSB3c2RsTG9jYXRpb25WYWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUod2ViU2VydmljZSwgV1NETF9MT0NBVElPTik7Ci0gICAgICAgIGlmICh3c2RsTG9jYXRpb25WYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uVmFsdWUuZ2V0VmFsdWUoKS50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmICh3c2RsTG9jYXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHdzZGxMb2NhdGlvbi5lbmRzV2l0aCgiLndzZGwiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIFVSTCByZWxhdGl2ZVVSTCA9IGdldFJlbGF0aXZlVVJMKGNsYXNzRGVjbGFyYXRpb24sIHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZVVSTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVdTREwocmVsYXRpdmVVUkwudG9TdHJpbmcoKSwgd2ViU2VydmljZSwgY2xhc3NEZWNsYXJhdGlvbiwgd3NkbExvY2F0aW9uVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRXYXJuaW5nKHdzZGxMb2NhdGlvblZhbHVlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9VTkFCTEVfVE9fTE9DQVRFLCB3c2RsTG9jYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlV1NETCh3c2RsTG9jYXRpb24sIHdlYlNlcnZpY2UsIGNsYXNzRGVjbGFyYXRpb24sIHdzZGxMb2NhdGlvblZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3c2RsTG9jYXRpb25WYWx1ZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRU1QVFlfQVRUUklCVVRFX1ZBTFVFLCBuZXcgT2JqZWN0W10ge1dlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMX0xPQ0FUSU9OfSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBVUkwgZ2V0UmVsYXRpdmVVUkwoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uLCBTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIGlmIChlbnZpcm9ubWVudCBpbnN0YW5jZW9mIEVjbGlwc2VBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQpIHsKLSAgICAgICAgICAgIEVjbGlwc2VBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgZWNsaXBzZUVudmlyb25tZW50ID0gKEVjbGlwc2VBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQpIGVudmlyb25tZW50OwotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZWNsaXBzZUVudmlyb25tZW50LmdldEphdmFQcm9qZWN0KCk7Ci0gICAgICAgICAgICBJRm9sZGVyIHdlYkNvbnRlbnRGb2xkZXIgPSBXU0RMVXRpbHMuZ2V0V2ViQ29udGVudEZvbGRlcihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgaWYgKHdlYkNvbnRlbnRGb2xkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElSZXNvdXJjZSB3c2RsUmVzb3VyY2UgPSB3ZWJDb250ZW50Rm9sZGVyLmZpbmRNZW1iZXIod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbFJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3c2RsUmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKS50b1VSTCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2cobXVybGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVdTREwoU3RyaW5nIHdzZGxMb2NhdGlvbiwgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24sIEFubm90YXRpb25WYWx1ZSB3c2RsTG9jYXRpb25WYWx1ZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHdzZGxVUkwgPSBuZXcgVVJMKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMVXRpbHMucmVhZFdTREwod3NkbFVSTCk7Ci0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gIGdldFNlcnZpY2VRTmFtZSh3ZWJTZXJ2aWNlLCBjbGFzc0RlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKGRlZmluaXRpb24sIHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSAgZ2V0UG9ydE5hbWUod2ViU2VydmljZSwgY2xhc3NEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIFBvcnQgcG9ydCA9IGdldFBvcnQoc2VydmljZSwgcG9ydE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlQmluZGluZyhiaW5kaW5nLCBjbGFzc0RlY2xhcmF0aW9uLCB3ZWJTZXJ2aWNlLCB3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZE1hcCA9IGdldFdlYk1ldGhvZHMoY2xhc3NEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8T3BlcmF0aW9uPiBvcGVyYXRpb25zID0gYmluZGluZy5nZXRQb3J0VHlwZSgpLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT3BlcmF0aW9uIG9wZXJhdGlvbiA6IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IG1ldGhvZE1hcC5nZXQob3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX09QRVJUQVRJT05fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uZXdheSAhPSBudWxsICYmIG9wZXJhdGlvbi5nZXRPdXRwdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9XU0RMX09QRVJBVElPTl9PVVRQVVRfTUVUSE9EX09ORVdBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHttZXRob2REZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCksIG9wZXJhdGlvbi5nZXROYW1lKCl9KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHdlYlNlcnZpY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1BPUlRfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwb3J0TmFtZSwgd3NkbExvY2F0aW9ufSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1NFUlZJQ0VfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3NlcnZpY2VRTmFtZS5nZXRMb2NhbFBhcnQoKSwgd3NkbExvY2F0aW9ufSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0gICAgICAgICAgICBwcmludEVycm9yKHdzZGxMb2NhdGlvblZhbHVlLmdldFBvc2l0aW9uKCksIG11cmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgcHJpbnRXYXJuaW5nKHdzZGxMb2NhdGlvblZhbHVlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9VTkFCTEVfVE9fTE9DQVRFLCB3c2RsTG9jYXRpb24pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUJpbmRpbmcoQmluZGluZyBiaW5kaW5nLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24sCi0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UsIFN0cmluZyB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQubmFtZSgpOwotCi0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmdBbm5vdGF0aW9uID0gZ2V0U09BUEJpbmRpbmcoY2xhc3NEZWNsYXJhdGlvbiwgd2ViU2VydmljZSk7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ0Fubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHN0eWxlVmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmdBbm5vdGF0aW9uLCBTVFlMRSk7Ci0gICAgICAgICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgPSBzdHlsZVZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSAgYmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudEV4dGVuc2libGUgOiBleHRlbnNpYmlsaXR5RWxlbWVudHMpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50RXh0ZW5zaWJsZSBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGVsZW1lbnRFeHRlbnNpYmxlOwotICAgICAgICAgICAgICAgIGlmIChzdHlsZS5jb21wYXJlVG9JZ25vcmVDYXNlKHNvYXBCaW5kaW5nLmdldFN0eWxlKCkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihzb2FwQmluZGluZ0Fubm90YXRpb24gPT0gbnVsbCA/IHdlYlNlcnZpY2UuZ2V0UG9zaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc29hcEJpbmRpbmdBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuYmluZChKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fU09BUF9CSU5ESU5HX1NUWUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt3c2RsTG9jYXRpb24sIHNvYXBCaW5kaW5nLmdldFN0eWxlKCksIHN0eWxlfSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50RXh0ZW5zaWJsZSBpbnN0YW5jZW9mIFNPQVAxMkJpbmRpbmcpIHsKLSAgICAgICAgICAgICAgICBTT0FQMTJCaW5kaW5nIHNvYXAxMkJpbmRpbmcgPSAoU09BUDEyQmluZGluZykgZWxlbWVudEV4dGVuc2libGU7Ci0gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmNvbXBhcmVUb0lnbm9yZUNhc2Uoc29hcDEyQmluZGluZy5nZXRTdHlsZSgpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioc29hcEJpbmRpbmdBbm5vdGF0aW9uID09IG51bGwgPyB3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNvYXBCaW5kaW5nQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1NPQVBfQklORElOR19TVFlMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7d3NkbExvY2F0aW9uLCBzb2FwMTJCaW5kaW5nLmdldFN0eWxlKCksIHN0eWxlfSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQW5ub3RhdGlvbk1pcnJvciBnZXRTT0FQQmluZGluZyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UpIHsKLSAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2UsIEVORFBPSU5UX0lOVEVSRkFDRSk7Ci0gICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gc2VpRGVjbGFyYXRpb24gPSBlbnZpcm9ubWVudC5nZXRUeXBlRGVjbGFyYXRpb24oZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgaWYgKHNlaURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0eXBlRGVjbGFyYXRpb24gPSBzZWlEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZURlY2xhcmF0aW9uLCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2REZWNsYXJhdGlvbj4gZ2V0V2ViTWV0aG9kcyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UpIHsKLSAgICAgICAgTWFwPFN0cmluZywgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kRGVjbGFyYXRpb24+KCk7Ci0KLSAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2UsIEVORFBPSU5UX0lOVEVSRkFDRSk7Ci0gICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gc2VpRGVjbGFyYXRpb24gPSBlbnZpcm9ubWVudC5nZXRUeXBlRGVjbGFyYXRpb24oZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgaWYgKHNlaURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0eXBlRGVjbGFyYXRpb24gPSBzZWlEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViTWV0aG9kID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwgJiYgIWlzRXhsdWRlZCh3ZWJNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kTWFwLnB1dChnZXRPcGVyYXRpb25OYW1lKHdlYk1ldGhvZCwgbWV0aG9kRGVjbGFyYXRpb24pLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1ldGhvZE1hcC5wdXQobWV0aG9kRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGhvZE1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFeGx1ZGVkKEFubm90YXRpb25NaXJyb3Igd2ViTWV0aG9kKSB7Ci0gICAgICAgIEJvb2xlYW4gZXhjbHVkZSA9IEFubm90YXRpb25VdGlscy5nZXRCb29sZWFuVmFsdWUod2ViTWV0aG9kLCBFWENMVURFKTsKLSAgICAgICAgaWYgKGV4Y2x1ZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGUuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoQW5ub3RhdGlvbk1pcnJvciB3ZWJNZXRob2QsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYk1ldGhvZCwgT1BFUkFUSU9OX05BTUUpOwotICAgICAgICBpZiAob3BlcmF0aW9uTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgU2VydmljZSBnZXRTZXJ2aWNlKERlZmluaXRpb24gZGVmaW5pdGlvbiwgUU5hbWUgc2VydmljZVFOYW1lKSB7Ci0gICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgU2V0PE1hcC5FbnRyeT4gc2VydmljZXNTZXQgPSBzZXJ2aWNlc01hcC5lbnRyeVNldCgpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxRTmFtZSwgU2VydmljZT4gc2VydmljZUVudHJ5IDogc2VydmljZXNTZXQpIHsKLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VFbnRyeUtleSA9IHNlcnZpY2VFbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlRW50cnlLZXkuZXF1YWxzKHNlcnZpY2VRTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZUVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBQb3J0IGdldFBvcnQoU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICAgICAgTWFwIHBvcnRzTWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICBTZXQ8TWFwLkVudHJ5PiBwb3J0c1NldCA9IHBvcnRzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgUG9ydD4gcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0RW50cnlLZXkgPSBwb3J0RW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBpZiAocG9ydEVudHJ5S2V5LmVxdWFscyhwb3J0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcG9ydEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRTZXJ2aWNlUU5hbWUoQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2UsIFNFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpICsgU0VSVklDRV9TVUZGSVg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShnZXRUYXJnZXROYW1lc3BhY2Uod2ViU2VydmljZSwgY2xhc3NEZWNsYXJhdGlvbiksIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQb3J0TmFtZShBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UsIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViU2VydmljZSwgUE9SVF9OQU1FKTsKLSAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHBvcnROYW1lID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCkgKyBQT1JUX1NVRkZJWDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZSwgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViU2VydmljZSwgVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gSkRUVXRpbHMuZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKAotICAgICAgICAgICAgICAgICAgICBjbGFzc0RlY2xhcmF0aW9uLmdldFBhY2thZ2UoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhYTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgIGNoZWNrV2ViU2VydmljZVByb3ZpZGVyKG1pcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXZWJTZXJ2aWNlUHJvdmlkZXIoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IpIHsKLSAgICAgICAgaWYgKG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLldFQlNFUlZJQ0VfV0VCU0VSVklDRVBST1ZJREVSX0NPTUJJTkFUSU9OKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL3V0aWxzL0pBWFdTSGFuZGxlclV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS91dGlscy9KQVhXU0hhbmRsZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE1NzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL3V0aWxzL0pBWFdTSGFuZGxlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Gb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyOwotaW1wb3J0IG9yZy5qZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy5qZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmpkb20uSkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuamRvbS5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmpkb20uaW5wdXQuU0FYQnVpbGRlcjsKLWltcG9ydCBvcmcuamRvbS5vdXRwdXQuWE1MT3V0cHV0dGVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSkFYV1NIYW5kbGVyVXRpbHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfQ0hBSU5TID0gImhhbmRsZXItY2hhaW5zIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfQ0hBSU4gPSAiaGFuZGxlci1jaGFpbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSID0gImhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFUl9OQU1FID0gImhhbmRsZXItbmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX0NMQVNTID0gImhhbmRsZXItY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hbWVzcGFjZSBKQVZBRUVfTlMgPSBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBKQVhXU0hhbmRsZXJVdGlscygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlSGFuZGxlckNoYWluRmlsZShJUGF0aCBwYXRoLCBTdHJpbmcgaGFuZGxlck5hbWUsIFN0cmluZyBoYW5kbGVyQ2xhc3MpIHsKLSAgICAgICAgSUZpbGUgaGFuZGxlckNoYWluRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgICAgaWYgKCFoYW5kbGVyQ2hhaW5GaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5GaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7fSksIHRydWUsIHByb2dyZXNzTW9uaXRvcik7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDaGFpbnNFbGVtZW50ID0gbmV3IEVsZW1lbnQoSEFORExFUl9DSEFJTlMpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbnNFbGVtZW50LnNldE5hbWVzcGFjZShKQVZBRUVfTlMpOwotCi0gICAgICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyQ2hhaW5FbGVtZW50ID0gbmV3IEVsZW1lbnQoSEFORExFUl9DSEFJTiwgSkFWQUVFX05TKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJFbGVtZW50ID0gbmV3IEVsZW1lbnQoSEFORExFUiwgSkFWQUVFX05TKTsKLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlck5hbWVFbGVtZW50ID0gbmV3IEVsZW1lbnQoSEFORExFUl9OQU1FLCBKQVZBRUVfTlMpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJOYW1lRWxlbWVudC5zZXRUZXh0KGhhbmRsZXJOYW1lKTsKLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlckNsYXNzRWxlbWVudCA9IG5ldyBFbGVtZW50KEhBTkRMRVJfQ0xBU1MsIEpBVkFFRV9OUyk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckNsYXNzRWxlbWVudC5zZXRUZXh0KGhhbmRsZXJDbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBoYW5kbGVyRWxlbWVudC5hZGRDb250ZW50KGhhbmRsZXJOYW1lRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckVsZW1lbnQuYWRkQ29udGVudChoYW5kbGVyQ2xhc3NFbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkVsZW1lbnQuYWRkQ29udGVudChoYW5kbGVyRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5zRWxlbWVudC5hZGRDb250ZW50KGhhbmRsZXJDaGFpbkVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoaGFuZGxlckNoYWluc0VsZW1lbnQpOwotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICAgICAgICAgIFhNTE91dHB1dHRlciBvdXRwdXR0ZXIgPSBuZXcgWE1MT3V0cHV0dGVyKCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0dGVyLm91dHB1dChkb2N1bWVudCwgb3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5GaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICBmb3JtYXRYTUxGaWxlKGhhbmRsZXJDaGFpbkZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coY2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGZuZmUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUhhbmRsZXJDaGFpbkZpbGUoSVBhdGggcGF0aCkgewotICAgICAgICBJRmlsZSBoYW5kbGVyQ2hhaW5GaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICBpZiAoIWhhbmRsZXJDaGFpbkZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHt9KSwgdHJ1ZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlckNoYWluc0VsZW1lbnQgPSBuZXcgRWxlbWVudChIQU5ETEVSX0NIQUlOUyk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckNoYWluc0VsZW1lbnQuc2V0TmFtZXNwYWNlKEpBVkFFRV9OUyk7Ci0KLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudChoYW5kbGVyQ2hhaW5zRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGhhbmRsZXJDaGFpbkZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXR0ZXIub3V0cHV0KGRvY3VtZW50LCBvdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIGZvcm1hdFhNTEZpbGUoaGFuZGxlckNoYWluRmlsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coZm5mZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGlvZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkSGFuZGxlclRvSGFuZGxlckNoYWluKElQYXRoIHBhdGgsIFN0cmluZyBoYW5kbGVyTmFtZSwgU3RyaW5nIGhhbmRsZXJDbGFzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJRmlsZSBoYW5kbGVyQ2hhaW5GaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICBpZiAoaGFuZGxlckNoYWluRmlsZS5leGlzdHMoKSAmJiBoYW5kbGVyQ2hhaW5GaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGhhbmRsZXJJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaGFuZGxlckNoYWluRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKTsKLSAgICAgICAgICAgICAgICBTQVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU0FYQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5idWlsZChoYW5kbGVySW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldFJvb3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDaGFpbkVsZW1lbnQgPSByb290LmdldENoaWxkKEhBTkRMRVJfQ0hBSU4sIEpBVkFFRV9OUyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkVsZW1lbnQgPSBuZXcgRWxlbWVudChIQU5ETEVSX0NIQUlOLCBKQVZBRUVfTlMpOwotICAgICAgICAgICAgICAgICAgICByb290LmFkZENvbnRlbnQoaGFuZGxlckNoYWluRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyRWxlbWVudCA9IG5ldyBFbGVtZW50KEhBTkRMRVIsIEpBVkFFRV9OUyk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJOYW1lRWxlbWVudCA9IG5ldyBFbGVtZW50KEhBTkRMRVJfTkFNRSwgSkFWQUVFX05TKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyTmFtZUVsZW1lbnQuc2V0VGV4dChoYW5kbGVyTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDbGFzc0VsZW1lbnQgPSBuZXcgRWxlbWVudChIQU5ETEVSX0NMQVNTLCBKQVZBRUVfTlMpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJDbGFzc0VsZW1lbnQuc2V0VGV4dChoYW5kbGVyQ2xhc3MpOwotCi0gICAgICAgICAgICAgICAgaGFuZGxlckVsZW1lbnQuYWRkQ29udGVudChoYW5kbGVyTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJFbGVtZW50LmFkZENvbnRlbnQoaGFuZGxlckNsYXNzRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5FbGVtZW50LmFkZENvbnRlbnQoaGFuZGxlckVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGhhbmRsZXJDaGFpbkZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXR0ZXIub3V0cHV0KGRvY3VtZW50LCBvdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGZuZmUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoSkRPTUV4Y2VwdGlvbiBqZG9tZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coamRvbWUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAvL1RPRE8gQ2xvc2Ugc3RyZWFtcwotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIGZvcm1hdFhNTEZpbGUoaGFuZGxlckNoYWluRmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEb2N1bWVudFRvRmlsZShJUGF0aCBmaWxlUGF0aCwgRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUZpbGUgaGFuZGxlckNoYWluRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0gICAgICAgIGlmIChoYW5kbGVyQ2hhaW5GaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChpc0hhbmRsZXJDaGFpbkZpbGUoaGFuZGxlckNoYWluRmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHRlci5vdXRwdXQoZG9jdW1lbnQsIG91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5GaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFhNTEZpbGUoaGFuZGxlckNoYWluRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hhbmRsZXJEZWZpbmVkKElGaWxlIGhhbmRsZXJDaGFpbkZpbGUsIFN0cmluZyBoYW5kbGVyTmFtZSwgU3RyaW5nIGhhbmRsZXJDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzSGFuZGxlckNoYWluRmlsZShoYW5kbGVyQ2hhaW5GaWxlKSkgewotICAgICAgICAgICAgU0FYQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBoYW5kbGVyQ2hhaW5JbnB1dFN0ZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLnRvRmlsZSgpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5idWlsZChoYW5kbGVyQ2hhaW5JbnB1dFN0ZWFtKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0Um9vdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBMaXN0PEVsZW1lbnQ+IGhhbmRsZXJDaGFpbnMgPSByb290LmdldENoaWxkcmVuKEhBTkRMRVJfQ0hBSU4sIEpBVkFFRV9OUyk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbGVtZW50IGhhbmRsZXJDaGFpbiA6IGhhbmRsZXJDaGFpbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyID0gaGFuZGxlckNoYWluLmdldENoaWxkKEhBTkRMRVIsIEpBVkFFRV9OUyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlck5hbWVFbGVtZW50ID0gaGFuZGxlci5nZXRDaGlsZChIQU5ETEVSX05BTUUsIEpBVkFFRV9OUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDbGFzc0VsZW1lbnQgPSBoYW5kbGVyLmdldENoaWxkKEhBTkRMRVJfQ0xBU1MsIEpBVkFFRV9OUyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyTmFtZUVsZW1lbnQgIT0gbnVsbCAmJiBoYW5kbGVyTmFtZUVsZW1lbnQuZ2V0VGV4dCgpLmVxdWFscyhoYW5kbGVyTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGFuZGxlckNsYXNzRWxlbWVudCAhPSBudWxsICYmIGhhbmRsZXJDbGFzc0VsZW1lbnQuZ2V0VGV4dCgpLmVxdWFscyhoYW5kbGVyQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGpkb21lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqZG9tZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbklucHV0U3RlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGFuZGxlckNoYWluRmlsZShJRmlsZSBoYW5kbGVyQ2hhaW5GaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoaGFuZGxlckNoYWluRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGhhbmRsZXJDaGFpbklucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICAgICAgaWYgKGhhbmRsZXJDaGFpbklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMCkgewotICAgICAgICAgICAgICAgIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5idWlsZChoYW5kbGVyQ2hhaW5JbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXRSb290RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocm9vdC5nZXROYW1lKCkuZXF1YWxzKEhBTkRMRVJfQ0hBSU5TKSAmJiByb290LmdldE5hbWVzcGFjZSgpLmVxdWFscyhKQVZBRUVfTlMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpET01FeGNlcHRpb24gamRvbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqZG9tZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNoYWluSW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXRYTUxGaWxlKElGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlci5nZXRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgLmdldEZvcm1hdFByb2Nlc3Nvcihjb250ZW50VHlwZS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0UHJvY2Vzc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdEZpbGUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS91dGlscy9KQVhXU1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS91dGlscy9KQVhXU1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZTBkZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvdXRpbHMvSkFYV1NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVQbHVnaW47Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSkFYV1NVdGlscyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT04gPSAiYWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSRyA9ICJhcmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0NIQVJBQ1RFUiA9ICIuIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORFBPSU5UX0lOVEVSRkFDRSA9ICJlbmRwb2ludEludGVyZmFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFID0gImV4Y2x1ZGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQkVBTiA9ICJmYXVsdEJlYW4iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxJWkUgPSAiZmluYWxpemUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSID0gImhlYWRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19TVUJQQUNLQUdFID0gImpheHdzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX05BTUUgPSAibG9jYWxOYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREUgPSAibW9kZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElPTl9OQU1FID0gIm9wZXJhdGlvbk5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1NUWUxFID0gInBhcmFtZXRlclN0eWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfTkFNRSA9ICJwYXJ0TmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUUgPSAicG9ydE5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9TVUZGSVggPSAiUG9ydCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRSA9ICJSZXNwb25zZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9TVUZGSVggPSAiUmVzcG9uc2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOID0gInJldHVybiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUUgPSAic2VydmljZU5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9TVUZGSVggPSAiU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRSA9ICJzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFID0gInRhcmdldE5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRSA9ICJ1c2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9MT0NBVElPTiA9ICJ3c2RsTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIEpBWFdTVXRpbHMoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvY3VtZW50QmFyZShBbm5vdGF0aW9uTWlycm9yIG1pcnJvcikgewotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBTVFlMRSk7Ci0gICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBVU0UpOwotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyU3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBQQVJBTUVURVJfU1RZTEUpOwotCi0gICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKHN0eWxlLCB1c2UsIHBhcmFtZXRlclN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudEJhcmUoSUFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBTVFlMRSk7Ci0gICAgICAgICAgICBTdHJpbmcgdXNlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBVU0UpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBQQVJBTUVURVJfU1RZTEUpOwotICAgICAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUoc3R5bGUsIHVzZSwgcGFyYW1ldGVyU3R5bGUpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudEJhcmUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFNUWUxFKTsKLSAgICAgICAgU3RyaW5nIHVzZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgVVNFKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBQQVJBTUVURVJfU1RZTEUpOwotCi0gICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKHN0eWxlLCB1c2UsIHBhcmFtZXRlclN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudEJhcmUoU3RyaW5nIHN0eWxlLCBTdHJpbmcgdXNlLCBTdHJpbmcgcGFyYW1ldGVyU3R5bGUpIHsKLSAgICAgICAgcmV0dXJuIChzdHlsZSA9PSBudWxsIHx8IHN0eWxlLmVxdWFscyhTdHlsZS5ET0NVTUVOVC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICYmICh1c2UgPT0gbnVsbCB8fCB1c2UuZXF1YWxzKFVzZS5MSVRFUkFMLm5hbWUoKSkpCi0gICAgICAgICAgICAgICAgJiYgKHBhcmFtZXRlclN0eWxlICE9IG51bGwgJiYgcGFyYW1ldGVyU3R5bGUuZXF1YWxzKFBhcmFtZXRlclN0eWxlLkJBUkUubmFtZSgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKEFubm90YXRpb25NaXJyb3IgbWlycm9yKSB7Ci0gICAgICAgIFN0cmluZyBzdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFNUWUxFKTsKLSAgICAgICAgU3RyaW5nIHVzZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFVTRSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJTdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFBBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvY3VtZW50V3JhcHBlZChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFNUWUxFKTsKLSAgICAgICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFVTRSk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyU3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFBBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBTVFlMRSk7Ci0gICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFVTRSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJTdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgUEFSQU1FVEVSX1NUWUxFKTsKLQotICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKFN0cmluZyBzdHlsZSwgU3RyaW5nIHVzZSwgU3RyaW5nIHBhcmFtZXRlclN0eWxlKSB7Ci0gICAgICAgIHJldHVybiAoc3R5bGUgPT0gbnVsbCB8fCBzdHlsZS5lcXVhbHMoU3R5bGUuRE9DVU1FTlQubmFtZSgpKSkKLSAgICAgICAgICAgICAgICAmJiAodXNlID09IG51bGwgfHwgdXNlLmVxdWFscyhVc2UuTElURVJBTC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICYmIChwYXJhbWV0ZXJTdHlsZSA9PSBudWxsIHx8IHBhcmFtZXRlclN0eWxlLmVxdWFscyhQYXJhbWV0ZXJTdHlsZS5XUkFQUEVELm5hbWUoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBnaXZlbiB7QGxpbmsgSU1ldGhvZH0gdG8gc2VlIGlmIGl0IGlzIGFuIG92ZXJsb2FkZWQgbWV0aG9kLiBJZiBpdCBpcyBpdCB3aWxsIHJldHVybgotICAgICAqIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcG9zaXRpb24gb2YgdGhpcyBtZXRob2QgaW4gaXQncyBwYXJlbnRzIHtAbGluayBJVHlwZX0uCi0gICAgICogPHA+Ci0gICAgICogRS5nLiBHaXZlbiB0aHJlZSBtZXRob2RzOgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIHZvaWQgbXlNZXRob2QoLi4uKTsKLSAgICAgKiBwdWJsaWMgdm9pZCBteU1ldGhvZCguLi4pOwotICAgICAqIHB1YmxpYyB2b2lkIG15TWV0aG9kKC4uLik7Ci0gICAgICogPC9wcmU+Ci0gICAgICogVGhlIGZpcnN0IG1ldGhvZCB3b3VsZCByZXR1cm4gYSBibGFuayBzdHJpbmcsIHRoZSBzZWNvbmQgd291bGQgcmV0dXJuIHRoZSBzdHJpbmcgIjEiIGFuZCB0aGUgdGhpcmQKLSAgICAgKiB3b3VsZCByZXR1cm4gdGhlIHN0cmluZyAiMiIuCi0gICAgICogPC9wPgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZCB0byB0ZXN0Ci0gICAgICogQHJldHVybiBhIHN0cmluZyB2YWx1ZQotICAgICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIHRocm93biBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyByZXNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjY291bnRGb3JPdmVybG9hZGVkTWV0aG9kcyhJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgCUlUeXBlIHR5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOwotICAgIAlpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm4gIiI7Ci0gICAgCX0KLSAgICAgICAgTGlzdDxJTWV0aG9kPiBtZXRob2RzID0gIEFycmF5cy5hc0xpc3QodHlwZS5nZXRNZXRob2RzKCkpOwotICAgICAgICBMaXN0PElNZXRob2Q+IHNpbWlsYXJNZXRob2RzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kPigpOwotICAgICAgICBmb3IgKElNZXRob2QgbWV0aG9kVG9UZXN0IDogbWV0aG9kcykgewotICAgICAgICAgICAgaWYgKCFtZXRob2QuZXF1YWxzKG1ldGhvZFRvVGVzdCkgJiYgbWV0aG9kLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kVG9UZXN0LmdldEVsZW1lbnROYW1lKCkpICYmIG1ldGhvZFRvVGVzdC5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpIDwKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCkpIHsKLSAgICAgICAgICAgICAgICBzaW1pbGFyTWV0aG9kcy5hZGQobWV0aG9kVG9UZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2ltaWxhck1ldGhvZHMuc2l6ZSgpID4gMCA/IEludGVnZXIudG9TdHJpbmcoc2ltaWxhck1ldGhvZHMuc2l6ZSgpKSA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkMjlkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBKRFQgVXRpbGl0eSBjbGFzcy4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKRFRVdGlscyB7Ci0KLSAgICBwcml2YXRlIEpEVFV0aWxzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIDxjb2RlPklDbGFzc3BhdGhFbnRyeTwvY29kZT4gdG8gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+Ci0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IHRvIGFkZCB0aGUgY2xhc3NwYXRoIGVudHJ5IHRvCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aEVudHJ5IHRoZSA8Y29kZT5JQ2xhc3NwYXRoRW50cnk8L2NvZGU+IHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0NsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGN1cnJlbnRFbnRyaWVzID0gQXJyYXlzLmFzTGlzdChqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSk7Ci0gICAgICAgICAgICBMaXN0PElDbGFzc3BhdGhFbnRyeT4gbmV3RW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwotICAgICAgICAgICAgbmV3RW50cmllcy5hZGRBbGwoY3VycmVudEVudHJpZXMpOwotICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEVudHJ5ICE9IG51bGwgJiYgIW5ld0VudHJpZXMuY29udGFpbnMoY2xhc3NwYXRoRW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgbmV3RW50cmllcy5hZGQoY2xhc3NwYXRoRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W25ld0VudHJpZXMuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSA8Y29kZT5JQ2xhc3NwYXRoRW50cnk8L2NvZGU+IGZyb20gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+Ci0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IHRvIHJlbW92ZSB0aGUgY2xhc3NwYXRoIGVudHJ5IGZyb20KLSAgICAgKiBAcGFyYW0gY2xhc3NwYXRoRW50cnkgdGhlIDxjb2RlPklDbGFzc3BhdGhFbnRyeTwvY29kZT4gdG8gcmVtb3ZlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBjdXJyZW50RW50cmllcyA9IEFycmF5cy5hc0xpc3QoamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkpOwotICAgICAgICAgICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IG5ld0VudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKLSAgICAgICAgICAgIG5ld0VudHJpZXMuYWRkQWxsKGN1cnJlbnRFbnRyaWVzKTsKLSAgICAgICAgICAgIGlmIChjbGFzc3BhdGhFbnRyeSAhPSBudWxsICYmIG5ld0VudHJpZXMuY29udGFpbnMoY2xhc3NwYXRoRW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgbmV3RW50cmllcy5yZW1vdmUoY2xhc3NwYXRoRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W25ld0VudHJpZXMuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcHJvamVjdCBuYW1lLgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgcHJvamVjdCBuYW1lCi0gICAgICogQHJldHVybiB0aGUgSmF2YSBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb2plY3QgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvZiB0aGUgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24gZm9yIHRoZSBnaXZlbiBqYXZhIHByb2plY3QuCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBkZWZhdWx0IG91dHB1dCBmb2xkZXIgZm9yIHRoZSBnaXZlbiBqYXZhIHByb2plY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKSkuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoamF2YVByb2plY3QuZ2V0UGF0aCgpKS5nZXRMb2NhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIG9mIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbiBmb3IgdGhlIGdpdmVuIGphdmEgcHJvamVjdCBuYW1lLgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgamF2YSBwcm9qZWN0Ci0gICAgICogQHJldHVybiAgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGRlZmF1bHQgb3V0cHV0IGZvbGRlciBmb3IgdGhlIGdpdmVuIGphdmEgcHJvamVjdCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGgoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIHJldHVybiBKRFRVdGlscy5nZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGgoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmdWxsLCBhYnNvbHV0ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugb2YgdGhlIHNvdXJjZSBmb2xkZXIgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gdHlwZS4KLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgPGNvZGU+SVR5cGU8L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZ2l2ZW4gPGNvZGU+SVR5cGU8L2NvZGU+IHNvdXJjZSBmb2xkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChJVHlwZSB0eXBlKSB7Ci0gICAgICAgIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKLSAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcGFja2FnZUZyYWdtZW50LmdldFBhcmVudCgpOwotICAgICAgICBJUmVzb3VyY2Ugc3JjRGlyZWN0b3J5UmVzb3VyY2UgPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFJlc291cmNlKCk7Ci0gICAgICAgIHJldHVybiBzcmNEaXJlY3RvcnlSZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgZmlyc3Qgc291cmNlIGZvbGRlciBmb3VuZCBpbiB0aGUgamF2YSBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaXJzdCBzb3VyY2UgZm9sZGVyIGZvdW5kIGluIHRoZSBqYXZhIHByb2plY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgZmlyc3Qgc291cmNlIGZvbGRlciBmb3VuZCBpbiB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCB0aGUgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpcnN0IHNvdXJjZSBmb2xkZXIgZm91bmQgaW4gdGhlIGdpdmVuIGphdmEgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqYXZhUHJvamVjdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOwotICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IHBhY2thZ2VGcmFnbWVudFJvb3RzWzBdOwotICAgICAgICAgICAgSVJlc291cmNlIHNyY0RpcmVjdG9yeVJlc291cmNlID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgcmV0dXJuIHNyY0RpcmVjdG9yeVJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFBhdGgoIiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBnaXZlbiA8Y29kZT5JVHlwZTwvY29kZT4gaXMgYW4gaW50ZXJmYWNlIGFsbCBtZXRob2RzIGRlY2xhcmVkIGluIHRoYXQgaW50ZXJmYWNlIGFyZSByZXR1cm5lZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbHRlcm5hdGl2ZWx5IGlmIHRoZSBnaXZlbiBnaXZlbiA8Y29kZT5JVHlwZTwvY29kZT4gaXMgYSBjbGFzcywgb25seSBtZXRob2RzIHRoYXQgYXJlIGV4cGxpY2l0bHkgbWFya2VkCi0gICAgICogcHVibGljIGFyZSByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSA8Y29kZT5JVHlwZTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMgbWV0aG9kcyBkZWNsYXJlZCBpbiB0aGlzIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElNZXRob2RbXSBnZXRQdWJsaWNNZXRob2RzKElUeXBlIHR5cGUpIHsKLSAgICAgICAgTGlzdDxJTWV0aG9kPiBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kPigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSU1ldGhvZFtdIGFsbE1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWxsTWV0aG9kczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gYWxsTWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoRmxhZ3MuaXNQdWJsaWMobWV0aG9kLmdldEZsYWdzKCkpICYmICFtZXRob2QuaXNDb25zdHJ1Y3RvcigpICYmICFtZXRob2QuaXNNYWluTWV0aG9kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljTWV0aG9kcy5hZGQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHVibGljTWV0aG9kcy50b0FycmF5KG5ldyBJTWV0aG9kW3B1YmxpY01ldGhvZHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIHRhcmdldCBuYW1lc3BhY2Ugc3RyaW5nIGZyb20gdGhlIGdpdmVuIHBhY2thZ2UgbmFtZSBieSBzcGxpdHRpbmcgdGhlIGRvdCAnLicgc2VwYXJhdGVkCi0gICAgICogcGFja2FnZSBuYW1lLCByZXZlcnNpbmcgdGhlIG9yZGVyIG9mIHRoZSBwYWNrYWdlIG5hbWUgc2VnbWVudHMgZm9sbG93ZWQgYnkgcHJlZml4aW5nIHRoZSBzdHJpbmcgd2l0aAotICAgICAqICdodHRwOi8vJyBhbmQgYXBwZW5kaW5nIGEgZm9yd2FyZCBzbGFzaCAnLycgdG8gdGhlIGVuZC4KLSAgICAgKiA8cD5FLmcuLCB0aGUgSmF2YSBwYWNrYWdlINJjb20uZXhhbXBsZS53c9Mgd291bGQgcmV0dXJuIHRoZSB0YXJnZXQgbmFtZXNwYWNlINJodHRwOi8vd3MuZXhhbXBsZS5jb20v0y48L3A+Ci0gICAgICogPHA+SWYgdGhlIHBhY2thZ2UgbmFtZSBpcyBudWxsIG9yIGlzIG9mIHplcm8gbGVuZ3RoICAiaHR0cDovL2RlZmF1bHRfcGFja2FnZS8iIGlzIHJldHVybmVkLjwvcD4KLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIHBhY2thZ2UgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIGRlcml2ZWQgdGFyZ2V0IG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuICJodHRwOi8vZGVmYXVsdF9wYWNrYWdlLyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBMaXN0PFN0cmluZz4gbmFtZXNwYWNlRWxlbWVudHMgPSBBcnJheXMuYXNMaXN0KHBhY2thZ2VOYW1lLnNwbGl0KCJcXC4iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQ29sbGVjdGlvbnMucmV2ZXJzZShuYW1lc3BhY2VFbGVtZW50cyk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovLyI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzcGFjZUl0ZXJhdG9yID0gbmFtZXNwYWNlRWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKG5hbWVzcGFjZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnQgPSBuYW1lc3BhY2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlICs9IGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgKz0gIi4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRhcmdldE5hbWVzcGFjZSArPSAiLyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0J3MgY2xhc3NwYXRoIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4KLSAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIGdpdmVuIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4KLSAgICAgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lCi0gICAgICogQHJldHVybiB0aGUgZmlyc3QgdHlwZSBmb3VuZCBmb2xsb3dpbmcgdGhlIGphdmEgcHJvamVjdCdzIGNsYXNzcGF0aCB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElUeXBlIGZpbmRUeXBlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3QgdHlwZSBmb3VuZCB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb2xsb3dpbmcgdGhlIGNsYXNzcGF0aCBvZiB0aGUgamF2YSBwcm9qZWN0IHdpdGgKLSAgICAgKiB0aGUgZ2l2ZSBwcm9qZWN0IG5hbWUgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgamF2YSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoZSBqYXZhIHByb2plY3QncyBjbGFzc3BhdGggd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZmluZFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpLCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyB0aGUgamF2YSBuYXR1cmUuCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIGdpdmVuIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGhhcyB0aGUgamF2YSBuYXR1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGlzbid0IGEgbWFpbiBtZXRob2Qgb3IgY29uc3RydWN0b3IgYW5kIGlmIGl0IGhhcyB0aGUgcHVibGljIG1vZGlmaWVyLgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIGdpdmVuIG1ldGhvZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1ldGhvZCBpcyBwdWJsaWMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQdWJsaWNNZXRob2QoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBGbGFncy5pc1B1YmxpYyhtZXRob2QuZ2V0RmxhZ3MoKSkgJiYgIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgJiYgIW1ldGhvZC5pc01haW5NZXRob2QoKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIEphdmEgdHlwZSBuYW1lLCBlaXRoZXIgc2ltcGxlIG9yIHF1YWxpZmllZCwgdXNpbmcgdGhlIHdvcmtzcGFjZSBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgdHlwZQotICAgICAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSBJU3RhdHVzLk9LIGlmIHRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgSmF2YSB0eXBlIG5hbWUsIGEgc3RhdHVzIHdpdGgKLSAgICAgKiBjb2RlIElTdGF0dXMuV0FSTklORyBpbmRpY2F0aW5nIHdoeSB0aGUgZ2l2ZW4gbmFtZSBpcyBkaXNjb3VyYWdlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUphdmFUeXBlTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgc291cmNlTGV2ZWwgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFKTsKLSAgICAgICAgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFKTsKLSAgICAgICAgcmV0dXJuIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZShuYW1lLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIEphdmEgdHlwZSBuYW1lLCBlaXRoZXIgc2ltcGxlIG9yIHF1YWxpZmllZCwgdXNpbmcgdGhlIGdpdmVuIHByb2plY3RzIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIHR5cGUKLSAgICAgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgSVN0YXR1cy5PSyBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIEphdmEgdHlwZSBuYW1lLCBhIHN0YXR1cyB3aXRoCi0gICAgICogY29kZSBJU3RhdHVzLldBUk5JTkcgaW5kaWNhdGluZyB3aHkgdGhlIGdpdmVuIG5hbWUgaXMgZGlzY291cmFnZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVKYXZhVHlwZU5hbWUoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIFN0cmluZyBzb3VyY2VMZXZlbCA9IGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIHRydWUpOwotICAgICAgICBTdHJpbmcgY29tcGxpYW5jZUxldmVsID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpOwotICAgICAgICByZXR1cm4gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKG5hbWUsIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUgdXNpbmcgdGhlIGdpdmVuIHByb2plY3RzIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIG5hbWUgb2YgYSBwYWNrYWdlCi0gICAgICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIElTdGF0dXMuT0sgaWYgdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBwYWNrYWdlIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cwotICAgICAqIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVBhY2thZ2VOYW1lKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgU3RyaW5nIHNvdXJjZUxldmVsID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgdHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwgPSBqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSwgc291cmNlTGV2ZWwsIGNvbXBsaWFuY2VMZXZlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBnaXZlbiBKYXZhIGlkZW50aWZpZXIgd2l0aCB0aGUgd29ya3NwYWNlIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCi0gICAgICogQHBhcmFtIGlkIHRoZSBKYXZhIGlkZW50aWZpZXIKLSAgICAgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgSVN0YXR1cy5PSyBpZiB0aGUgZ2l2ZW4gaWRlbnRpZmllciBpcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllciwgb3RoZXJ3aXNlCi0gICAgICogYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBpZGVudGlmaWVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSWRlbnRpZmllcihTdHJpbmcgaWQpIHsKLSAgICAgICAgU3RyaW5nIHNvdXJjZUxldmVsID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSk7Ci0gICAgICAgIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSk7Ci0gICAgICAgIHJldHVybiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVJZGVudGlmaWVyKGlkLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ5YTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQnVnICMyNzQyOTMgLSBzdWRoYW5AcHJvZ3Jlc3MuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEyQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLlVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBXU0RMIFV0aWxpdHkgY2xhc3MuCi0gKiA8cD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotICogdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETFV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GSUxFX05BTUVfUEFUVEVSTiA9ICJbYS16QS1aMC05X1xcLV0rLndzZGwiOy8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9RVUVSWSA9ICI/d3NkbCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIFdTRExfRk9MREVSX1BBVEggPSBuZXcgUGF0aCgid3NkbC8iKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUID0gMzAwMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEVfRVhURU5TSU9OID0gIi53c2RsIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBXU0RMVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPmphdmF4LndzZGwuRGVmaW5pdGlvbjwvY29kZT4gYnkgcmVhZGluZyB0aGUgV1NETCBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4gVVJMIG9yIG51bGwgaWYgbm9uZSBjYW4gYmUgZm91bmQKLSAgICAgKiBvciBpZiB0aGUgY29ubmVjdGlvbiB0aW1lcyBvdXQuCi0gICAgICogQHBhcmFtIHdzZGxVUkwgdGhlIHVybCBvZiB0aGUgd3NkbCBkb2N1bWVudCB0byByZWFkLgotICAgICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24gZGVzY3JpYmVkIGluIHRoZSB3c2RsIGRvY3VtZW50IHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIFVSTC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBleGNlcHRpb24gb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRGVmaW5pdGlvbiByZWFkV1NETChVUkwgd3NkbFVSTCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uID0gd3NkbFVSTC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICB1cmxDb25uZWN0aW9uLnNldENvbm5lY3RUaW1lb3V0KFRJTUVPVVQpOwotICAgICAgICB1cmxDb25uZWN0aW9uLnNldFJlYWRUaW1lb3V0KFRJTUVPVVQpOwotICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHVybENvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIFdTRExGYWN0b3J5IHdzZGxGYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFdTRExSZWFkZXIgd3NkbFJlYWRlciA9IHdzZGxGYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxSZWFkZXIucmVhZFdTREwod3NkbFVSTC5nZXRQYXRoKCksIGlucHV0U291cmNlKTsKLSAgICAgICAgICAgIHJldHVybiBkZWZpbml0aW9uOwotICAgICAgICB9IGNhdGNoIChXU0RMRXhjZXB0aW9uIHdzZGxlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKHdzZGxlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIDxjb2RlPmphdmF4LndzZGwuRGVmaW5pdGlvbjwvY29kZT4gdG8gdGhlIHdzZGwgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIFVSTC4KLSAgICAgKiBAcGFyYW0gd3NkbFVSTCB0aGUgdXJsIG9mIHRoZSB3c2RsIGRvY3VtZW50IHRvIHdyaXRlIHRvLgotICAgICAqIEBwYXJhbSBkZWZpbml0aW9uIHRoZSBXU0RMIGRlZmluaXRpb24gdG8gYmUgd3JpdHRlbi4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXhjZXB0aW9uIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyByZWZyZXNoaW5nIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UgaWYgaXQgZXhpc3RzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVdTREwoVVJMIHdzZGxVUkwsIERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgVVJJIHdzZGxVUkkgPSBudWxsOwotICAgICAgICBPdXRwdXRTdHJlYW0gd3NkbE91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3c2RsVVJJID0gd3NkbFVSTC50b1VSSSgpOwotICAgICAgICAgICAgRmlsZSB3c2RsRmlsZSA9IG5ldyBGaWxlKHdzZGxVUkkpOwotICAgICAgICAgICAgd3NkbE91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHdzZGxGaWxlKTsKLSAgICAgICAgICAgIFdTRExGYWN0b3J5IHdzZGxGYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFdTRExXcml0ZXIgd3NkbFdyaXRlciA9IHdzZGxGYWN0b3J5Lm5ld1dTRExXcml0ZXIoKTsKLSAgICAgICAgICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIHdzZGxPdXRwdXRTdHJlYW0pOwotICAgICAgICB9IGNhdGNoIChXU0RMRXhjZXB0aW9uIHdzZGxlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKHdzZGxlKTsKLSAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHVyaXNlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKHVyaXNlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh3c2RsT3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3c2RsT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLSAgICAgICAgICAgICAgICAuZ2V0RmlsZUZvckxvY2F0aW9uKFVSSVV0aWwudG9QYXRoKHdzZGxVUkkpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZmlsZSBuYW1lIGNvbnRhaW5zIEFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCB1bmRlcnNjb3JlICdfJywKLSAgICAgKiBkYXNoZXMgJy0nIGFuZCBlbmRzIHdpdGggdGhlICcud3NkbCcgZXh0ZW5zaW9uLiBPdGhlcndpc2UgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogQHBhcmFtIHdzZGxGaWxlTmFtZSB0aGUgd3NkbCBmaWxlIG5hbWUKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHZhbGlkLCBjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXU0RMRmlsZU5hbWUoU3RyaW5nIHdzZGxGaWxlTmFtZSkgewotICAgICAgICByZXR1cm4gd3NkbEZpbGVOYW1lICE9IG51bGwgJiYgd3NkbEZpbGVOYW1lLm1hdGNoZXMoV1NETF9GSUxFX05BTUVfUEFUVEVSTik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIG9mIHRoZSBnaXZlbiBwcm9qZWN0LiBUaGUgcmV0dXJuZWQgcmVzb3VyY2UgbWF5IG5vdCBleGlzdC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgbmFtZSBvZiB0aGUgd2ViIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSB3ZWIgY29udGVudCBmb2xkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElGb2xkZXIgZ2V0V2ViQ29udGVudEZvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcigKLSAgICAgICAgICAgICAgICBXU0RMVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFdTREwgZm9sZGVyIG9mIHRoZSBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuIFRoZSBXU0RMIGZvbGRlciBwYXRoIGlzIHRoZSBwcm9qZWN0cyB3ZWIgY29udGVudCBmb2xkZXIKLSAgICAgKiBwYXRoIGFwcGVuZGVkIHdpdGggdGhlICdXU0RMJyBkaXJlY3RvcnkuIFRoZSByZXR1cm5lZCByZXNvdXJjZSBtYXkgbm90IGV4aXN0LgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgd2ViIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSB3c2RsIGZvbGRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUZvbGRlciBnZXRXU0RMRm9sZGVyKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gV1NETFV0aWxzLmdldFdTRExGb2xkZXIoV1NETFV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBXU0RMIGZvbGRlciBvZiB0aGUgZ2l2ZW4gcHJvamVjdC4gVGhlIFdTREwgZm9sZGVyIHBhdGggaXMgdGhlIHByb2plY3RzIHdlYiBjb250ZW50IGZvbGRlcgotICAgICAqIHBhdGggYXBwZW5kZWQgd2l0aCB0aGUgJ1dTREwnIGRpcmVjdG9yeS4gVGhlIHJldHVybmVkIHJlc291cmNlIG1heSBub3QgZXhpc3QuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSB3ZWIgcHJvamVjdAotICAgICAqIEByZXR1cm4gdGhlIHdzZGwgZm9sZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRm9sZGVyIGdldFdTRExGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBJUGF0aCB3c2RsRm9sZGVyUGF0aCA9IFdTRExVdGlscy5nZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KS5hcHBlbmQoV1NETFV0aWxzLldTRExfRk9MREVSX1BBVEgpOwotICAgICAgICBJRm9sZGVyIHdzZGxGb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcih3c2RsRm9sZGVyUGF0aCk7Ci0gICAgICAgIGlmICghd3NkbEZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3c2RsRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbEZvbGRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLSAgICAgICAgcmV0dXJuIHZpcnR1YWxDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBmb3VuZCBpbiB0aGUgZ2l2ZW4KLSAgICAgKiA8Y29kZT5EZWZpbml0aW9uPC9jb2RlPiBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuCi0gICAgICogQHBhcmFtIGRlZmluaXRpb24gdGhlIGdpdmVuIGRlZmluaXRpb24uCi0gICAgICogQHJldHVybiByZXR1cm4gb25lIG9mOgotICAgICAqIDxsaT5TT0FQQWRkcmVzczxsaT5TT0FQMTJBZGRyZXNzPGxpPm51bGwgaWYgaXQgY2FuIG5vdCBmaW5kIGEgc29hcCBhZGRyZXNzCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBnZXRFbmRwb2ludEFkZHJlc3MoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgIFNldDxNYXAuRW50cnk+IHNlcnZpY2VzU2V0ID0gc2VydmljZXNNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHNlcnZpY2VFbnRyeSA6IHNlcnZpY2VzU2V0KSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIE1hcCBwb3J0c01hcCA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBwb3J0c1NldCA9IHBvcnRzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cyA9IHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IGV4dGVuc2liaWxpdHlFbGVtZW50cykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzIHx8IG9iamVjdCBpbnN0YW5jZW9mIFNPQVAxMkFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jYXRpb24gVVJJIGZyb20gdGhlIGZpcnN0IDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBmb3VuZAotICAgICAqIGluIHRoZSBnaXZlbiA8Y29kZT5EZWZpbml0aW9uPC9jb2RlPiBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuIFRoZSByZXR1cm5lZCBsb2NhdGlvbiBVUkkgaXMgYXBwZW5kZWQgd2l0aAotICAgICAqIHRoZSAnP3dzZGwnIHF1ZXJ5IGlmIHRoZSBxdWVyeSB3YXMgbm90IHByZXNlbnQgaW4gdGhlIDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBsb2NhdGlvbiBVUkkuCi0gICAgICogQHBhcmFtIGRlZmluaXRpb24gdGhlIGdpdmVuIGRlZmludGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBVUkkgb3IgdGhlIGZpcnN0IDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBmb3VuZCBpbiB0aGUgZ2l2ZW4gZGVmaW5pdGlvbi4KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgdGVzdGluZyB0aGUgbG9jYXRpb24gVVJJIGZvciBhIHF1ZXJ5IHBhcnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NETExvY2F0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gV1NETFV0aWxzLmdldEVuZHBvaW50QWRkcmVzcyhkZWZpbml0aW9uKTsKLSAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvblVSSSA9IGdldExvY2F0aW9uVVJJKGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChsb2NhdGlvblVSSS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBVUkwgZW5kcG9pbnRVUkwgPSBuZXcgVVJMKGxvY2F0aW9uVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRVUkwuZ2V0UXVlcnkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uVVJJICs9IFdTRExfUVVFUlk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvblVSSTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkkoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFNPQVBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQMTJBZGRyZXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChTT0FQMTJBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgZG90IHNlcGFyYXRlZCBwYWNrYWdlIG5hbWUgZnJvbSBhIGdpdmVuIG5hbWVzcGFjZS4KLSAgICAgKiA8cD5FLmcuLCB0aGUgbmFtZXNwYWNlINJodHRwOi8vd3MuZXhhbXBsZS5jb20v0yB3b3VsZCByZXR1cm4gdGhlIEphdmEgcGFja2FnZSBuYW1lINJjb20uZXhhbXBsZS53c9MuPC9wPgotICAgICAqIDxwPk4uQi4gVGhpcyBtZXRob2QgZG9lcyBub3QgcHJlc2VydmUgJ3d3dycgaW4gdGhlIHJldHVybmVkIHBhY2thZ2UgbmFtZSBpZiBpdCBleGlzdHMgaW4gdGhlIGdpdmVuIG5hbWVzcGFjZS48L3A+Ci0gICAgICogQHBhcmFtIG5hbWVzcGFjZSB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBAcmV0dXJuIGEgcGFja2FnZSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcGFja2FnZU5hbWVFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgICAgICBVUkwgbmFtZXNwYWNlVVJMID0gbmV3IFVSTChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgd3d3IGlmIHRoZXJlCi0gICAgICAgICAgICBTdHJpbmcgYXV0aG9yaXR5ID0gbmFtZXNwYWNlVVJMLmdldEF1dGhvcml0eSgpOwotICAgICAgICAgICAgaWYgKGF1dGhvcml0eS5pbmRleE9mKCJ3d3ciKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYXV0aG9yaXR5ID0gYXV0aG9yaXR5LnN1YnN0cmluZyhhdXRob3JpdHkuaW5kZXhPZigiLiIpICsgMSwgYXV0aG9yaXR5Lmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gYXV0aG9yaXR5RWxlbWVudHMgPSBBcnJheXMuYXNMaXN0KGF1dGhvcml0eS5zcGxpdCgiXFwuIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKGF1dGhvcml0eUVsZW1lbnRzKTsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lRWxlbWVudHMuYWRkQWxsKGF1dGhvcml0eUVsZW1lbnRzKTsKLQotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBuYW1lc3BhY2VVUkwuZ2V0UGF0aCgpOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBhdGhFbGVtZW50cyA9IEFycmF5cy5hc0xpc3QocGF0aC5zcGxpdCgiWy9cXFxcXSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcGFja2FnZU5hbWVFbGVtZW50cy5hZGRBbGwocGF0aEVsZW1lbnRzKTsKLQotICAgICAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBwYWNrYWdlSXRlcmF0b3IgPSBwYWNrYWdlTmFtZUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAocGFja2FnZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50ID0gcGFja2FnZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICs9IGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArPSAiLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKG11cmxlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWUudG9Mb3dlckNhc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDFhNDMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiMTlhZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWY1Yjc0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb247c2luZ2xldG9uOj10cnVlDQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luLkRvbUludGVncmF0aW9uUGx1Z2luDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsDQotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLA0KLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwNCi0gb3JnLmVjbGlwc2UudWkuaWRlLA0KLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IsDQotIG9yZy5lY2xpcHNlLmpkdC51aSwNCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwNCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aSwNCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywNCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlDQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkNCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDEwYWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAxNSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxMWQ5OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgaWNvbnMvDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2ljb25zL2pheHdzX25hdmNvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2ljb25zL2pheHdzX25hdmNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9pY29ucy9qYXh3c19uYXZjb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDE2NTNlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTGFuZ3VhZ2UgRmlsZSBmb3IgdGhpcyBQbHVnaW4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBHZW5lcmljIExhYmVsIGFuZCBEZXNjcmlwdGlvbg0KLUJ1bmRsZS1OYW1lLjA9SkFYLVdTIERPTSBJbnRlZ3JhdGlvbg0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KLQ0KLURvbVZhbGlkYXRvcl9OYW1lID0gV2ViIFNlcnZpY2VzIFZhbGlkYXRpb24NCi1Eb21WYWxpZGF0aW9uX01hcmtlck5hbWUgPSBXZWIgU2VydmljZXMgUHJvYmxlbSBNYXJrZXINCi1uYXZpZ2F0b3JDb250ZW50Lm5hbWUuMCA9IEpBWC1XUyBXZWIgU2VydmljZXMgRWxlbWVudHMNCi1kZWNvcmF0b3IubGFiZWwuMCA9IFdlYiBTZXJ2aWNlIERlY29yYXRvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4YTBhNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgIAotICAgIENvbnRyaWJ1dG9yczoKLSAgICAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4KLQkJPGZhY3RvcnkgCi0JCQl1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIiAKLQkJCWNsYXNzID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IiAKLQkJCXN1cHBvcnRlZFR5cGVzID0gCi0JCQkJIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLSAgPCEtLSB7e3sgRGVmaW5lcyBpbnRlZ3JhdGlvbiBmb3IgRE9NIG9iamVjdHMgdG8gbmF2aWdhdGlvbiB0cmVlIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4gCi0JCTxuYXZpZ2F0b3JDb250ZW50Ci0gICAgICAgIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciIKLSAgICAgICAgaWNvbj0iaWNvbnMvamF4d3NfbmF2Y29udGVudC5naWYiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QubmF2aWdhdG9yLmoyZWUudWkuamF4d3MiCi0gICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciIKLSAgICAgICAgbmFtZT0iJW5hdmlnYXRvckNvbnRlbnQubmFtZS4wIgotICAgICAgICBwcmlvcml0eT0iaGlnaGVzdCI+Ci0JCQk8dHJpZ2dlclBvaW50cz4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIgLz4KLQkJCQk8L29yPgotCQkJPC90cmlnZ2VyUG9pbnRzPgotCQkJPHBvc3NpYmxlQ2hpbGRyZW4+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSIvPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QiLz4KLQkJCQk8L29yPgotCQkJPC9wb3NzaWJsZUNoaWxkcmVuPgotCQkJPGFjdGlvblByb3ZpZGVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnMuV1NBY3Rpb25Qcm92aWRlciIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucy5XU0FjdGlvblByb3ZpZGVyIj4KLQkJCQk8ZW5hYmxlbWVudD4KLQkJCQkJPG9yPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIi8+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSIvPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIvPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCIvPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtIi8+Ci0JCQkJCTwvb3I+Ci0JCQkJPC9lbmFibGVtZW50PgotCQkJPC9hY3Rpb25Qcm92aWRlcj4KLQkJPC9uYXZpZ2F0b3JDb250ZW50PgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMiPgotCQk8ZGVjb3JhdG9yCi0JCQlhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBsb2NhdGlvbj0iQk9UVE9NX1JJR0hUIgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9ImZhbHNlIgotICAgICAgICAgICAgbGFiZWw9IiVkZWNvcmF0b3IubGFiZWwuMCIKLSAgICAgICAgICAgIHN0YXRlPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLldlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5XZWJTZXJ2aWNlRGVjb3JhdG9yIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklTRUlDaGlsZExpc3QiLz4KLQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklXZWJTZXJ2aWNlQ2hpbGRMaXN0Ii8+Ci0JCQkJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCIvPgotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kIi8+Ci0JCQkJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSIvPgotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSIvPgotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9kZWNvcmF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgPCEtLSB9fX0gLS0+Ci0gIDwhLS0ge3t7IERlZmluZXMgaW50ZWdyYXRpb24gZm9yIERPTSBvYmplY3RzIHRvIHByb3BlcnRpZXMgdmlldyAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5Ij4KLQkJCTxhZGFwdGVyCi0JCQkJdHlwZT0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlciI+Ci0JCQk8L2FkYXB0ZXI+Ci0JCTwvZmFjdG9yeT4KLQkJPGZhY3RvcnkKLQkJCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSI+Ci0JCQk8YWRhcHRlcgotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIiPgotCQkJPC9hZGFwdGVyPgotCQk8L2ZhY3Rvcnk+Ci0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSI+Ci0JCQk8YWRhcHRlcgotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIiPgotCQkJPC9hZGFwdGVyPgotCQk8L2ZhY3Rvcnk+Ci0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkiPgotCQkJPGFkYXB0ZXIKLQkJCQl0eXBlPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIj4KLQkJCTwvYWRhcHRlcj4KLQkJPC9mYWN0b3J5PgotCQk8ZmFjdG9yeQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0iCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkiPgotCQkJPGFkYXB0ZXIKLQkJCQl0eXBlPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIj4KLQkJCTwvYWRhcHRlcj4KLQkJPC9mYWN0b3J5PgkJCi0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklET01Qcm9wZXJ0eVZhbHVlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUl0ZW1WYWx1ZVByb3BlcnR5U291cmNlRmFjdG9yeSI+Ci0JCQk8YWRhcHRlcgotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlIj4KLQkJCTwvYWRhcHRlcj4KLQkJPC9mYWN0b3J5PgkJCi0gICA8L2V4dGVuc2lvbj4KLTwhLS0gfX19IC0tPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvcGx1Z2luL0RvbUludGVncmF0aW9uTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjFhNmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgRG9tSW50ZWdyYXRpb25NZXNzYWdlcyBleHRlbmRzIE5MUw0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luLkRvbUludGVncmF0aW9uTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9KYXhXc1dlYlNlcnZpY2VzTGFiZWw7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9Mb2FkaW5nQ2FuY2VsZWRMYWJlbDsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdEdW1teUxhYmVsOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfU2VpTGFiZWw7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9XZWJTZXJ2aWNlc0xhYmVsOw0KLQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuV1NSZXNvdXJjZUFjdGlvbl9OYW1lOw0KLQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luV2ViU2VydmljZXNBcmVhQWN0aW9uOw0KLQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luRUpCQXJlYUFjdGlvbjsNCi0NCi0Jc3RhdGljDQotCXsNCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERvbUludGVncmF0aW9uTWVzc2FnZXMuY2xhc3MpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3BsdWdpbi9Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5MjczNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3BsdWdpbi9Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0pheFdzV2ViU2VydmljZXNMYWJlbAkJPSBKQVgtV1MgV2ViIFNlcnZpY2VzDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdDYW5jZWxlZExhYmVsCQkJPSBMb2FkaW5nIENhbmNlbGVkDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdEdW1teUxhYmVsCQkJPSBMb2FkaW5nLi4uDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1NlaUxhYmVsCQkJCQkJPSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMNCi1ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfV2ViU2VydmljZXNMYWJlbAkJCQk9IFdlYiBTZXJ2aWNlcw0KLQ0KLU9wZW5XU1Jlc291cmNlQWN0aW9uX05hbWUJCQkJCQkJCQk9IE9wZW4NCi0NCi1OYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luV2ViU2VydmljZXNBcmVhQWN0aW9uCT0gTG9jYXRlIGluIFdlYiBTZXJ2aWNlcyBOb2RlDQotTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uX1Nob3dJbkVKQkFyZWFBY3Rpb24JCQk9IExvY2F0ZSBpbiBEZXBsb3ltZW50IERlc2NyaXB0b3IgTm9kZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25QbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmE5YWIwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvcGx1Z2luL0RvbUludGVncmF0aW9uUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOw0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsNCi0NCi0vKioNCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tSW50ZWdyYXRpb25QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsNCi0NCi0JLy8gVGhlIHBsdWctaW4gSUQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24iOw0KLQ0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlDQotCXByaXZhdGUgc3RhdGljIERvbUludGVncmF0aW9uUGx1Z2luIHBsdWdpbjsNCi0JDQotCXByaXZhdGUgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7DQotCQ0KLQkvKioNCi0JICogVGhlIGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgRG9tSW50ZWdyYXRpb25QbHVnaW4oKSB7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOw0KLQkJcGx1Z2luID0gdGhpczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXBsdWdpbiA9IG51bGw7DQotCQlzdXBlci5zdG9wKGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICoNCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIERvbUludGVncmF0aW9uUGx1Z2luIGdldERlZmF1bHQoKSB7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldExhYmVsUHJvdmlkZXIoZmluYWwgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShsYWJlbFByb3ZpZGVyLCAibGFiZWxQcm92aWRlciIpOyAvLyROT04tTkxTLTEkDQotCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOw0KLQl9DQotCQ0KLQlwdWJsaWMgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKQ0KLQl7DQotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsNCi0JfQ0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3V0aWwvUHJvamVjdEV4cGxvcmVyVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3V0aWwvUHJvamVjdEV4cGxvcmVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MmY2OGZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC91dGlsL1Byb2plY3RFeHBsb3JlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5pbnRlcm5hbC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotDQotLyoqDQotICogVXRpbGl0eSBjbGFzcyB0aGF0IGhvbGRzIG1ldGhvZHMgdG8gbWFuaXB1bGF0ZSBQcm9qZWN0RXhwbG9yZXIgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0RXhwbG9yZXJVdGlsIA0KLXsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcm9qZWN0RXhwbG9yZXJVdGlsIElOU1RBTkNFID0gbmV3IFByb2plY3RFeHBsb3JlclV0aWwoKTsNCi0JDQotCS8qKg0KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgZnJvbSBVSSB0aHJlYWQgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcmV0dXJuZWQNCi0JICogDQotCSAqIEByZXR1cm4gdGhlIHByb2plY3QgZXhwbG9yZXIge0BsaW5rIElWaWV3UGFydH0gaW4gY2FzZSBpdCBpcyBhdmFpbGFibGUgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgSVZpZXdQYXJ0IGZpbmRQcm9qZWN0RXhwbG9yZXIoKQ0KLQl7DQotCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7DQotCQlpZiAod29ya2JlbmNoV2luPT1udWxsIHx8IHdvcmtiZW5jaFdpbi5nZXRBY3RpdmVQYWdlKCk9PW51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdvcmtiZW5jaFdpbi5nZXRBY3RpdmVQYWdlKCkuZmluZFZpZXcoIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTVmMjUyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0N1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLkRvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgdGhhdCBhZGFwdHMgRE9NIG9iamVjdHMgd2l0aCBJdGVtIHByb3ZpZGVyIGFkYXB0ZXJzLiBGb3Ige0BsaW5rIElTRUlDaGlsZExpc3R9IGFuZCANCi0gKiB7QGxpbmsgSVdlYlNlcnZpY2VDaGlsZExpc3R9IGl0IGNyZWF0ZXMgc3BlY2lmaWMgYWRhcHRlciBmb3Igb3RoZXIgRE9NIG9iamVjdHMgZGVsZWdhdGVzIHRvDQotICoge0BsaW5rIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5fS4NCi0gKiANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgDQotew0KLQkvKioNCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOw0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqLw0KLQlwcml2YXRlIEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgDQotCXsNCi0JCXN1cGVyKCk7DQotCQkNCi0JCXN1cHBvcnRlZFR5cGVzLmFkZChJV2ViU2VydmljZUNoaWxkTGlzdC5jbGFzcyk7DQotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVNFSUNoaWxkTGlzdC5jbGFzcyk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQ2hpbGRMaXN0QWRhcHRlcihmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qKSANCi0Jew0KLQkJcmV0dXJuIG5ldyBJV2ViU2VydmljZUNoaWxkTGlzdCgpDQotCQkJew0KLQkJCQlwdWJsaWMgRUxpc3Q8SVdlYlNlcnZpY2U+IGdldFdTQ2hpbGRMaXN0KCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvai5nZXRXZWJTZXJ2aWNlcygpOw0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSANCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvajsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSANCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgDQotCQkJCXsNCi0JCQkJCS8vIG5vIHByb2Nlc3NpbmcgbmVlZGVkIGN1cnJlbnRseQ0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIA0KLQkJCQl7DQotCQkJCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZCBjdXJyZW50bHkNCi0JCQkJfQ0KLQkJCX07DQotCX0NCi0JDQotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZUlTRUlDaGlsZExpc3RBZGFwdGVyKGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2opIA0KLQl7DQotCQlyZXR1cm4gbmV3IElTRUlDaGlsZExpc3QoKQ0KLQkJCXsNCi0JCQkJcHVibGljIEVMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IGdldFNFSUNoaWxkTGlzdCgpDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2ouZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpOw0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSANCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvajsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSANCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgDQotCQkJCXsNCi0JCQkJCS8vIG5vIHByb2Nlc3NpbmcgbmVlZGVkIGN1cnJlbnRseQ0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIA0KLQkJCQl7DQotCQkJCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZCBjdXJyZW50bHkNCi0JCQkJfQ0KLQkJCX07DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpDQotCXsNCi0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlUHJvamVjdCAmJiB0eXBlIGluc3RhbmNlb2YgQ2xhc3MpDQotCQl7DQotCQkJaWYodHlwZS5lcXVhbHMoSVdlYlNlcnZpY2VDaGlsZExpc3QuY2xhc3MpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGFkYXB0SVdlYlNlcnZpY2VDaGlsZExpc3QoKElXZWJTZXJ2aWNlUHJvamVjdClub3RpZmllcik7DQotCQkJfQ0KLQkJCWVsc2UgaWYodHlwZS5lcXVhbHMoSVNFSUNoaWxkTGlzdC5jbGFzcykpDQotCQkJew0KLQkJCQlyZXR1cm4gYWRhcHRJU0VJQ2hpbGRMaXN0KChJV2ViU2VydmljZVByb2plY3Qpbm90aWZpZXIpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0eXBlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEFkYXB0ZXIgYWRhcHRJU0VJQ2hpbGRMaXN0KGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCWZvcihBZGFwdGVyIGFkYXB0ZXIgOiB3c1Byb2plY3QuZUFkYXB0ZXJzKCkpDQotCQl7DQotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpIHsNCi0JCQkJcmV0dXJuIGFkYXB0ZXI7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlmaW5hbCBBZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVJU0VJQ2hpbGRMaXN0QWRhcHRlcih3c1Byb2plY3QpOw0KLQkJYXNzb2NpYXRlKGFkYXB0ZXIsIHdzUHJvamVjdCk7DQotCQkNCi0JCXJldHVybiBhZGFwdGVyOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgQWRhcHRlciBhZGFwdElXZWJTZXJ2aWNlQ2hpbGRMaXN0KGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCWZvcihBZGFwdGVyIGFkYXB0ZXIgOiB3c1Byb2plY3QuZUFkYXB0ZXJzKCkpDQotCQl7DQotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KSB7DQotCQkJCXJldHVybiBhZGFwdGVyOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJZmluYWwgQWRhcHRlciBhZGFwdGVyID0gY3JlYXRlSVdlYlNlcnZpY2VDaGlsZExpc3RBZGFwdGVyKHdzUHJvamVjdCk7DQotCQlhc3NvY2lhdGUoYWRhcHRlciwgd3NQcm9qZWN0KTsNCi0JCQ0KLQkJcmV0dXJuIGFkYXB0ZXI7CQkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjMGUzZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnV0aWwuUHJvamVjdEV4cGxvcmVyVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3QuSUxvYWRpbmdDYW5jZWxlZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3QuSUxvYWRpbmdEdW1teTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NUnVudGltZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5JV3NET01SdW50aW1lSW5mbzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LldzRE9NUnVudGltZVJlZ2lzdHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzLkZhY2V0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vblZpZXdlcjsNCi0NCi0vKiogDQotICogQ29udGVudCBwcm92aWRlciBmb3IgRE9NIHJlbGF0ZWQgb2JqZWN0cw0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXINCi17DQotCXByaXZhdGUgTWFwPElXc0RPTVJ1bnRpbWVFeHRlbnNpb24sIElXc0RvbUxvYWRMaXN0ZW5lcj4gbG9hZExpc3RlbmVycyA9IG5ldyBIYXNoTWFwPElXc0RPTVJ1bnRpbWVFeHRlbnNpb24sIElXc0RvbUxvYWRMaXN0ZW5lcj4oKTsgDQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpDQotCXsNCi0JCXRoaXMoQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5DQotCSAqLw0KLQlwdWJsaWMgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpDQotCXsNCi0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihmaW5hbCBPYmplY3QgY29udGV4dCkNCi0Jew0KLQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQ0KLQkJew0KLQkJCXJldHVybiBnZXRXc1Byb2plY3QoKElQcm9qZWN0KSgoSUFkYXB0YWJsZSkgY29udGV4dCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcykpOw0KLQkJfQ0KLQkJZWxzZSBpZihjb250ZXh0IGluc3RhbmNlb2YgSUxvYWRpbmdXc1Byb2plY3QpIA0KLQkJew0KLQkJCXJldHVybiBuZXcgT2JqZWN0W10geyAoKElMb2FkaW5nV3NQcm9qZWN0KWNvbnRleHQpLmlzTG9hZENhbmNlbGVkKCkgPyBuZXcgSUxvYWRpbmdDYW5jZWxlZCgpe30gOiBuZXcgSUxvYWRpbmdEdW1teSgpe30gfTsNCi0JCX0NCi0JCWVsc2UgaWYoY29udGV4dCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlUHJvamVjdCkNCi0JCXsNCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdeyBhZGFwdGVyRmFjdG9yeS5hZGFwdChjb250ZXh0LCBJU0VJQ2hpbGRMaXN0LmNsYXNzKSwNCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNvbnRleHQsIElXZWJTZXJ2aWNlQ2hpbGRMaXN0LmNsYXNzKSB9Ow0KLQkJfQ0KLQkJZWxzZSBpZihjb250ZXh0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQl7DQotCQkJT2JqZWN0W10gd2ViU2VydmljZXMgPSAoKElXZWJTZXJ2aWNlQ2hpbGRMaXN0KWNvbnRleHQpLmdldFdTQ2hpbGRMaXN0KCkudG9BcnJheSgpOw0KLQkJCQ0KLQkJCWZvcihpbnQgaWk9MDsgaWk8d2ViU2VydmljZXMubGVuZ3RoOyBpaSsrKQ0KLQkJCXsNCi0JCQkJYWRhcHRlckZhY3RvcnkuYWRhcHQod2ViU2VydmljZXNbaWldLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gd2ViU2VydmljZXM7DQotCQl9DQotCQllbHNlIGlmKGNvbnRleHQgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCU9iamVjdFtdIHNFSXMgPSAoKElTRUlDaGlsZExpc3QpY29udGV4dCkuZ2V0U0VJQ2hpbGRMaXN0KCkudG9BcnJheSgpOw0KLQkJCQ0KLQkJCWZvcihpbnQgaWk9MDsgaWk8c0VJcy5sZW5ndGg7IGlpKyspDQotCQkJew0KLQkJCQlhZGFwdGVyRmFjdG9yeS5hZGFwdChzRUlzW2lpXSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCQl9DQotCQkJDQotCQkJcmV0dXJuIHNFSXM7DQotCQl9DQotCQllbHNlIGlmKGNvbnRleHQgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkNCi0JCXsNCi0JCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9ICgoSVdlYlNlcnZpY2UpY29udGV4dCkuZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQkJaWYgKHNlaSA9PSBudWxsKSB7DQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOw0KLQkJCX0NCi0JCQkNCi0JCQlhZGFwdGVyRmFjdG9yeS5hZGFwdChzZWksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXXsgc2VpIH07DQotCQl9DQotCQllbHNlIGlmKGNvbnRleHQgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7DQotCQkJcmV0dXJuIGV4dHJhY3RNZXRob2RzKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSBjb250ZXh0KTsNCi0JCX0NCi0JCWVsc2UgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJV2ViTWV0aG9kKSB7DQotCQkJcmV0dXJuIGV4dHJhY3RQYXJhbXMoKElXZWJNZXRob2QpY29udGV4dCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0V3NQcm9qZWN0KGZpbmFsIElQcm9qZWN0IHByb2plY3QpIA0KLQl7DQotCQl0cnkgew0KLQkJCWZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gcnVudGltZSA9IGdldFN1cHBvcnRpbmdSdW50aW1lKHByb2plY3QpOw0KLQkJCWlmIChydW50aW1lID09IG51bGwpIHsNCi0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07DQotCQkJfQ0KLQkJCQ0KLQkJCS8vIFdTIHByb2plY3QgaXMgbG9hZGVkIGFscmVhZHkNCi0JCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gZ2V0V3NQcm9qZWN0KHJ1bnRpbWUuZ2V0RE9NKCksIHByb2plY3QpOyANCi0JCQlpZiAod3NQcm9qZWN0ICE9IG51bGwpDQotCQkJew0KLQkJCQlhZGFwdGVyRmFjdG9yeS5hZGFwdCh3c1Byb2plY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQotCQkJCXJldHVybiBuZXcgT2JqZWN0W10geyB3c1Byb2plY3QgfTsNCi0JCQl9DQotCQkJDQotCQkJYWRkUnVudGltZUxvYWRMaXN0ZW5lcihydW50aW1lKTsNCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IExvYWRpbmdXc1Byb2plY3QocHJvamVjdCwgZmFsc2UpIH07DQotCQl9IA0KLQkJY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsgLy8gJEpMLUVYQyQNCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IExvYWRpbmdXc1Byb2plY3QocHJvamVjdCwgdHJ1ZSkgfTsgDQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV3NEb21Mb2FkTGlzdGVuZXIgYWRkUnVudGltZUxvYWRMaXN0ZW5lcihmaW5hbCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIHJ1bnRpbWUpIA0KLQl7DQotCQlJV3NEb21Mb2FkTGlzdGVuZXIgbG9hZExpc3RlbmVyID0gbG9hZExpc3RlbmVycy5nZXQocnVudGltZSk7IA0KLQkJaWYgKGxvYWRMaXN0ZW5lciE9bnVsbCkgew0KLQkJCXJldHVybiBsb2FkTGlzdGVuZXI7DQotCQl9DQotCQkNCi0JCWxvYWRMaXN0ZW5lciA9IG5ldyBMb2FkTGlzdGVuZXIocnVudGltZSk7CQkNCi0JCWxvYWRMaXN0ZW5lcnMucHV0KHJ1bnRpbWUsIGxvYWRMaXN0ZW5lcik7CQkNCi0JCXJ1bnRpbWUuYWRkTG9hZExpc3RlbmVyKGxvYWRMaXN0ZW5lcik7DQotCQkNCi0JCXJldHVybiBsb2FkTGlzdGVuZXI7DQotCX0NCi0JDQotCXByb3RlY3RlZCBPYmplY3RbXSBleHRyYWN0TWV0aG9kcyhmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSkgDQotCXsNCi0JCWZpbmFsIExpc3Q8SVdlYk1ldGhvZD4gd2ViTWV0aG9kcyA9IHNlaS5nZXRXZWJNZXRob2RzKCk7DQotCQlmb3IgKElXZWJNZXRob2Qgd2ViTWV0aG9kIDogd2ViTWV0aG9kcykgew0KLQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdlYk1ldGhvZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdlYk1ldGhvZHMudG9BcnJheSgpOwkJDQotCX0NCi0JDQotCXByb3RlY3RlZCBPYmplY3RbXSBleHRyYWN0UGFyYW1zKGZpbmFsIElXZWJNZXRob2QgbWV0aG9kKSANCi0Jew0KLQkJZmluYWwgTGlzdDxJV2ViUGFyYW0+IHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7DQotCQlmb3IgKElXZWJQYXJhbSB3ZWJQYXJhbSA6IHBhcmFtcykgew0KLQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdlYlBhcmFtLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcGFyYW1zLnRvQXJyYXkoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KQ0KLQl7DQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlUHJvamVjdCkNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KSANCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiAhKChJV2ViU2VydmljZUNoaWxkTGlzdCllbGVtZW50KS5nZXRXU0NoaWxkTGlzdCgpLmlzRW1wdHkoKTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuICEoKElTRUlDaGlsZExpc3QpZWxlbWVudCkuZ2V0U0VJQ2hpbGRMaXN0KCkuaXNFbXB0eSgpOw0KLQkJfQ0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKQ0KLQkJew0KLQkJCXJldHVybiAoKElXZWJTZXJ2aWNlKSBlbGVtZW50KS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSAhPSBudWxsOyANCi0JCX0NCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKQ0KLQkJew0KLQkJCXJldHVybiAhKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWVsZW1lbnQpLmdldFdlYk1ldGhvZHMoKS5pc0VtcHR5KCk7DQotCQl9DQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdlYk1ldGhvZCkNCi0JCXsNCi0JCQlyZXR1cm4gISgoSVdlYk1ldGhvZCllbGVtZW50KS5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGdldFdzUHJvamVjdChmaW5hbCBJRE9NIGRvbSwgZmluYWwgSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJaWYgKGRvbSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA6IGRvbS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKSkgew0KLQkJCWlmKHdzUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpKSkgew0KLQkJCQlyZXR1cm4gd3NQcm9qZWN0Ow0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldFN1cHBvcnRpbmdSdW50aW1lKGZpbmFsIElQcm9qZWN0IHByb2plY3QpDQotCXsNCi0JCWZpbmFsIENvbGxlY3Rpb248SVdzRE9NUnVudGltZUluZm8+IGRvbVJ1bnRpbWVJbmZvcyA9IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKTsNCi0JCU1hcDxTdHJpbmcsIFN0cmluZz4gZmFjZXRzOw0KLQkJZm9yIChJV3NET01SdW50aW1lSW5mbyBkb21SdW50aW1lSW5mbyA6IGRvbVJ1bnRpbWVJbmZvcykgDQotCQl7DQotCQkJZmFjZXRzID0gZG9tUnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpOw0KLQkJCWlmIChoYXNGYWNldChmYWNldHMsIHByb2plY3QpKSB7DQotCQkJCXJldHVybiBnZXREb21SdW50aW1lKGRvbVJ1bnRpbWVJbmZvLmdldElkKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGYWNldChmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZhY2V0cywgZmluYWwgSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJZm9yIChTdHJpbmcgZmFjZXRJZCA6IGZhY2V0cy5rZXlTZXQoKSkgDQotCQl7DQotCQkJaWYgKGZhY2V0SWQgPT0gbnVsbCB8fCBmYWNldHMuZ2V0KGZhY2V0SWQpID09IG51bGwpIHsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCXRyeSB7DQotCQkJCWlmICgobmV3IEZhY2V0VXRpbHMoKSkuaGFzRmFjZXRXaXRoVmVyc2lvbihwcm9qZWN0LCBmYWNldHMuZ2V0KGZhY2V0SWQpLCBmYWNldElkLCB0cnVlKSl7DQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJfQ0KLQkJCX0gDQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQkobmV3IExvZ2dlcigpKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERvbVJ1bnRpbWUoU3RyaW5nIHJ1bnRpbWVJZCkgew0KLQkJcmV0dXJuIFdzRE9NUnVudGltZU1hbmFnZXIuaW5zdGFuY2UoKS5nZXRET01SdW50aW1lKHJ1bnRpbWVJZCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDbGFzcyB0aGF0IGlzIHVzZWQgdG8gbGlzdGVuIHdoZW4gdGhlIERPTSBsb2FkIHdpbGwgYmUgZmluaXNoZWQuIEFmdGVyIHRoZSBsb2FkIGhhcyBmaW5pc2hlZA0KLQkgKiB0aGlzIGNsYXNzIHRyYXZlcnNlcyB0aGUgcHJvamVjdCBleHBsb3JlcnMgdHJlZSBpbiBvcmRlciB0byBmaW5kIGFsbCBpbnN0YW5jZXMgb2YNCi0JICoge0BsaW5rIElMb2FkaW5nV3NQcm9qZWN0fSBhbmQgc3Vic3RpdHV0ZSB0aGVtIHdpdGggbG9hZGVkIHtAbGluayBJV2ViU2VydmljZVByb2plY3R9DQotCSAqIA0KLQkgKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotCSAqLw0KLQlwcm90ZWN0ZWQgY2xhc3MgTG9hZExpc3RlbmVyIGltcGxlbWVudHMgSVdzRG9tTG9hZExpc3RlbmVyDQotCXsNCi0JCXByaXZhdGUgZmluYWwgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBydW50aW1lOw0KLQkJDQotCQlwdWJsaWMgTG9hZExpc3RlbmVyKGZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gcnVudGltZSkgDQotCQl7DQotCQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHJ1bnRpbWUsICJydW50aW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCQl0aGlzLnJ1bnRpbWUgPSBydW50aW1lOw0KLQkJfQ0KLQkJCQ0KLQkJcHVibGljIHZvaWQgZmluaXNoZWQoKSANCi0JCXsNCi0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkNCi0JCQl7DQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIA0KLQkJCQl7DQotCQkJCQlmaW5hbCBJVmlld1BhcnQgdmlld1BhcnQgPSBQcm9qZWN0RXhwbG9yZXJVdGlsLklOU1RBTkNFLmZpbmRQcm9qZWN0RXhwbG9yZXIoKTsNCi0JCQkJCWlmICh2aWV3UGFydCBpbnN0YW5jZW9mIENvbW1vbk5hdmlnYXRvcikgDQotCQkJCQl7DQotCQkJCQkJZmluYWwgQ29tbW9uVmlld2VyIGNvbW1vblZpZXdlciA9ICgoQ29tbW9uTmF2aWdhdG9yKXZpZXdQYXJ0KS5nZXRDb21tb25WaWV3ZXIoKTsNCi0JCQkJCQlmb3IgKFRyZWVJdGVtIGl0ZW0gOiBjb21tb25WaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1zKCkpIHsNCi0JCQkJCQkJZXhjaGFuZ2VEdW1teShpdGVtLCBjb21tb25WaWV3ZXIpOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0pOw0KLQkJfQkJDQotDQotCQlwcm90ZWN0ZWQgdm9pZCBleGNoYW5nZUR1bW15KGZpbmFsIFRyZWVJdGVtIHRyZWVJdGVtLCBmaW5hbCBDb21tb25WaWV3ZXIgY29tbW9uVmlld2VyKSANCi0JCXsNCi0JCQlpZiAodHJlZUl0ZW0gPT0gbnVsbCB8fCB0cmVlSXRlbS5nZXREYXRhKCkgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQlpZiAodHJlZUl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgSUxvYWRpbmdXc1Byb2plY3QpIHsNCi0JCQkJZXhjaGFuZ2VUcmVlSXRlbURhdGEodHJlZUl0ZW0sIGNvbW1vblZpZXdlcik7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlmb3IgKFRyZWVJdGVtIGNoaWxkIDogdHJlZUl0ZW0uZ2V0SXRlbXMoKSkgew0KLQkJCQkJZXhjaGFuZ2VEdW1teShjaGlsZCwgY29tbW9uVmlld2VyKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCXByaXZhdGUgdm9pZCBleGNoYW5nZVRyZWVJdGVtRGF0YShmaW5hbCBUcmVlSXRlbSB0cmVlSXRlbSwgZmluYWwgQ29tbW9uVmlld2VyIGNvbW1vblZpZXdlcikgDQotCQl7DQotCQkJZmluYWwgSUxvYWRpbmdXc1Byb2plY3QgbG9hZGluZ1Byb2plY3QgPSAoSUxvYWRpbmdXc1Byb2plY3QpdHJlZUl0ZW0uZ2V0RGF0YSgpOw0KLQkJCXRyeSB7DQotCQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSBnZXRXc1Byb2plY3QocnVudGltZS5nZXRET00oKSwgbG9hZGluZ1Byb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCQkJYWRhcHRlckZhY3RvcnkuYWRhcHQod3NQcm9qZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJCQl0cmVlSXRlbS5zZXREYXRhKHdzUHJvamVjdCk7DQotDQotCQkJfSBjYXRjaCAoV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gZSkgeyAvLyAkSkwtRVhDJA0KLQkJCQl0cmVlSXRlbS5zZXREYXRhKG5ldyBMb2FkaW5nV3NQcm9qZWN0KGxvYWRpbmdQcm9qZWN0LmdldFByb2plY3QoKSwgdHJ1ZSkpOw0KLQkJCX0NCi0JCQkNCi0JCQljb21tb25WaWV3ZXIucmVmcmVzaChsb2FkaW5nUHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgdm9pZCBzdGFydGVkKCkgew0KLQkJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQ0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIGNsYXNzIExvYWRpbmdXc1Byb2plY3QgaW1wbGVtZW50cyBJTG9hZGluZ1dzUHJvamVjdA0KLQl7DQotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0Ow0KLQkJZmluYWwgYm9vbGVhbiBpc0NhbmNlbGVkOw0KLQkJDQotCQlwdWJsaWMgTG9hZGluZ1dzUHJvamVjdChmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBib29sZWFuIGlzQ2FuY2VsZWQpIHsNCi0JCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0ocHJvamVjdCwgInByb2plY3QiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7DQotCQkJdGhpcy5pc0NhbmNlbGVkID0gaXNDYW5jZWxlZDsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7DQotCQkJcmV0dXJuIHByb2plY3Q7DQotCQl9DQotDQotCQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDYW5jZWxlZCgpIHsNCi0JCQlyZXR1cm4gaXNDYW5jZWxlZDsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTQ4NGU4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luLkRvbUludGVncmF0aW9uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luLkRvbUludGVncmF0aW9uUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdC5JTG9hZGluZ0NhbmNlbGVkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdC5JTG9hZGluZ0R1bW15Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSW1hZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JRGVzY3JpcHRpb25Qcm92aWRlcjsNCi0NCi0vKioNCi0gKiBET00gYWRhcHRlciBmYWN0b3J5IHRoYXQgZXh0ZW5kcyB7QGxpbmsgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyfSBieSBwcm92aWRpbmcNCi0gKiBpY29ucyBhbmQgbGFiZWxzIGZvciBzb21lIG9iamVjdHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgRE9NIGFuZCBhbHNvIG92ZXJyaWRlcyBzb21lDQotICogbGFiZWxzDQotICogDQotICogQGF1dGhvciANCi0gKi8NCi1wdWJsaWMgY2xhc3MgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSURlc2NyaXB0aW9uUHJvdmlkZXINCi17DQotCS8qKg0KLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yIHVzZXMge0BsaW5rIEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5fSBhcyBkZWZhdWx0DQotCSAqIGFkYXB0ZXIgZmFjdG9yeSBwcm92aWRlZCB0byB0aGUgYmFzZSBjbGFzcy4NCi0JICovDQotCXB1YmxpYyBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoKQ0KLQl7DQotCQlzdXBlcihDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSk7DQotCQkNCi0JCURvbUludGVncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5zZXRMYWJlbFByb3ZpZGVyKHRoaXMpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpDQotCXsNCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlyZXR1cm4gSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfV0VCX1NFUlZJQ0VfR1JPVVApOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlyZXR1cm4gSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfU0VJX0dST1VQKTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KSANCi0JCXsNCi0JCQlyZXR1cm4gSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfRE9NX1dTX1BST1ZJREVSKTsNCi0JCX0NCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ0R1bW15IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ0NhbmNlbGVkKSANCi0JCXsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpDQotCXsNCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QgfHwgZWxlbWVudCBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9KYXhXc1dlYlNlcnZpY2VzTGFiZWw7IA0KLQkJfQ0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ0R1bW15KSANCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfTG9hZGluZ0R1bW15TGFiZWw7DQotCQl9DQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElMb2FkaW5nQ2FuY2VsZWQpIA0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9Mb2FkaW5nQ2FuY2VsZWRMYWJlbDsNCi0JCX0JCQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuIERvbUludGVncmF0aW9uTWVzc2FnZXMuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1dlYlNlcnZpY2VzTGFiZWw7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9TZWlMYWJlbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpDQotCXsNCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkNCi0JCXsNCi0JCQlyZXR1cm4gKChJV2ViU2VydmljZSllbGVtZW50KS5nZXROYW1lKCk7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKQ0KLQkJew0KLQkJCXJldHVybiAoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpZWxlbWVudCkuZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ1dzUHJvamVjdCkNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfSmF4V3NXZWJTZXJ2aWNlc0xhYmVsOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuIERvbUludGVncmF0aW9uTWVzc2FnZXMuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1dlYlNlcnZpY2VzTGFiZWw7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9TZWlMYWJlbDsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJNZXRob2QpDQotCQl7DQotCQkJcmV0dXJuICgoSVdlYk1ldGhvZCllbGVtZW50KS5nZXROYW1lKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQoT2JqZWN0IGVsZW1lbnQpIA0KLQl7DQotCQlmb3IgKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGFiZWxQcm92aWRlckxpc3RlbmVyIDogbGFiZWxQcm92aWRlckxpc3RlbmVycykgew0KLQkJCWxhYmVsUHJvdmlkZXJMaXN0ZW5lci5sYWJlbFByb3ZpZGVyQ2hhbmdlZChuZXcgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCh0aGlzLCBlbGVtZW50KSk7DQotCQl9DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGVmYXVsdEltYWdlKE9iamVjdCBvYmplY3QpDQotCXsNCi0JCS8vIE5vIGRmYXVsdCBpbWFnZXMgDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUl0ZW1WYWx1ZVByb3BlcnR5U291cmNlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01JdGVtVmFsdWVQcm9wZXJ0eVNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ0ZjYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUl0ZW1WYWx1ZVByb3BlcnR5U291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSURPTVByb3BlcnR5VmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhhdCBjcmVhdGVzIGFkYXB0ZXIgZnJvbSB7QGxpbmsgSURPTVByb3BlcnR5VmFsdWV9IHRvDQotICoge0BsaW5rIElQcm9wZXJ0eVNvdXJjZX0gaW50ZXJmYWNlLiBUaGlzIGZhY3RvcnkgaXMgcmVnaXN0ZXJlZCBpbiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMgZXh0ZW5zaW9uDQotICogcG9pbnQgYW5kIGlzIGNhbGxlZCB3aGVuIG9iamVjdCBvZiB0eXBlIHtAbGluayBJRE9NUHJvcGVydHlWYWx1ZX0gbmVlZHMgdG8gYmUNCi0gKiBkaXNwbGF5ZWQgb3IgZWRpdGVkIGluIHByb3BlcnR5IHNoZWV0Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi1wdWJsaWMgY2xhc3MgRE9NSXRlbVZhbHVlUHJvcGVydHlTb3VyY2VGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IA0KLXsNCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpDQotCSAqLw0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIA0KLQl7DQotCQlhc3NlcnQgYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSURPTVByb3BlcnR5VmFsdWU7DQotCQkNCi0JCWZpbmFsIElET01Qcm9wZXJ0eVZhbHVlIHdyYXBwZXIgPSAoSURPTVByb3BlcnR5VmFsdWUpYWRhcHRhYmxlT2JqZWN0Ow0KLQkJDQotCQlyZXR1cm4gbmV3IFByb3BlcnR5U291cmNlKHdyYXBwZXIuZ2V0RWRpdGFibGVWYWx1ZSgpLCB3cmFwcGVyKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpDQotCSAqLw0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsNCi0JCXJldHVybiBuZXcgQ2xhc3NbXSB7UHJvcGVydHlTb3VyY2UuY2xhc3N9Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2EzMzQzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSANCi17DQotCXByaXZhdGUgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWRhcHRlckZhY3Rvcnk7DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSANCi0Jew0KLSAgICAgICAgaWYgKGFkYXB0ZXJUeXBlLmlzSW5zdGFuY2UoYWRhcHRhYmxlT2JqZWN0KSkgDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkYXB0YWJsZU9iamVjdDsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGFkYXB0ZXJUeXBlID09IElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLmNsYXNzKSANCi0gICAgICAgIHsNCi0gICAgICAgIAlyZXR1cm4gZ2V0QWRhcHRlckZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgDQotCXsNCi0gICAgICAgIHJldHVybiBuZXcgQ2xhc3NbXSB7DQotICAgICAgICAJCURPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmNsYXNzLA0KLSAgICAgICAgfTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGdldEFkYXB0ZXJGYWN0b3J5KCkNCi0Jew0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsNCi0JCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JTG9hZGluZ1dzUHJvamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JTG9hZGluZ1dzUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjJlYWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSUxvYWRpbmdXc1Byb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLQ0KLQ0KLS8qKg0KLSAqIEFuIGludGVyZmFjZSBwcmVzZW50aW5nIG5vdCBsb2FkZWQgd2ViIHNlcnZpY2UgcHJvamVjdC4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCANCi0gKiB0byBiZSBhZGRlZCB0byB0aGUgcHJvamVjdCBleHBsb3JlciBXUyB0cmVlIGluIGNhc2VzIHdoZW4gdGhlIHByb2plY3QgaXMgcmVsZXZhbnQgDQotICogYnV0IGl0IGlzIG5vdCB5ZXQgbG9hZGVkIGJ5IERPTSBsb2FkZXIuIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElMb2FkaW5nV3NQcm9qZWN0IA0KLXsNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHJlbGV2YW50IHByb2plY3QNCi0JICovDQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCk7DQotCQ0KLQkvKioNCi0JICogQHJldHVybiBpZiB0aGUgRE9NIGxvYWRpbmcgaGFzIGJlZW4gY2FuY2VsZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTG9hZENhbmNlbGVkKCk7DQotCQ0KLQkvKioNCi0JICogSW50ZXJmYWNlIHVzZWQgdG8gYmUgYWRkZWQgdG8gdGhlIHRyZWUgYXMgYSBzdWIgbm9kZSBvZiBJTm90TG9hZGVkV3NQcm9qZWN0IG5vZGUNCi0JICogYW5kIGRpc3BsYXllZCB3aXRoIHRleHQgIkxvYWRpbmcuLi4iLg0KLQkgKiANCi0JICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLQkgKi8NCi0JcHVibGljIGludGVyZmFjZSBJTG9hZGluZ0R1bW15IHt9Ow0KLQkNCi0JcHVibGljIGludGVyZmFjZSBJTG9hZGluZ0NhbmNlbGVkIHt9Ow0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lTRUlDaGlsZExpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSVNFSUNoaWxkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGY2YjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSVNFSUNoaWxkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotDQotcHVibGljIGludGVyZmFjZSBJU0VJQ2hpbGRMaXN0IGV4dGVuZHMgQWRhcHRlcg0KLXsNCi0JcHVibGljIEVMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IGdldFNFSUNoaWxkTGlzdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lXZWJTZXJ2aWNlQ2hpbGRMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lXZWJTZXJ2aWNlQ2hpbGRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2MzgxZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JV2ViU2VydmljZUNoaWxkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2VDaGlsZExpc3QgZXh0ZW5kcyBBZGFwdGVyDQotew0KLQlwdWJsaWMgRUxpc3Q8SVdlYlNlcnZpY2U+IGdldFdTQ2hpbGRMaXN0KCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvV2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL1dlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OWE3N2Y2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvV2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5pbnRlcm5hbC5BcHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJvYmxlbXNMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tMlJlc291cmNlTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciBleHRlbmRzIFByb2JsZW1zTGFiZWxEZWNvcmF0b3IKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhJU19ERUNPUkFUT1JfSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuV2ViU2VydmljZURlY29yYXRvciI7IAotCQotCS8qKgotCSAqIFRoZSBBUFQgbWFya2VyIElEcwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFRfTUFSS0VSX0lEID0gQXB0UGx1Z2luLkFQVF9DT01QSUxBVElPTl9QUk9CTEVNX01BUktFUjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBUX05PTlJFQ09OQ0lMRV9NQVJLRVJfSUQgPSBBcHRQbHVnaW4uQVBUX05PTlJFQ09OQ0lMRV9DT01QSUxBVElPTl9QUk9CTEVNX01BUktFUjsKLQkKLQkvKiogRW51bSB0byByZXByZXNlbnQgZGlmZmVyZW50IG1hcmtlciB0eXBlcyAqLwotCXB1YmxpYyBlbnVtIFNldmVyaXR5IHtPSywgRVJST1IsIFdBUk5JTkd9OwotCQotCXByaXZhdGUgRG9tVXRpbCBkb21VdGlsID0gRG9tVXRpbC5JTlNUQU5DRTsKLQlwcml2YXRlIGZpbmFsIERvbTJSZXNvdXJjZU1hcHBlciBkb20yUmVzb3VyY2VNYXBwZXIgPSBEb20yUmVzb3VyY2VNYXBwZXIuSU5TVEFOQ0U7Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvcigpCi0JewotCQlhZGRMaXN0ZW5lcihuZXcgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0JCQkJewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKQotCQkJCQl7Ci0JCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS51cGRhdGUoVEhJU19ERUNPUkFUT1JfSUQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGNvbXB1dGVBZG9ybm1lbnRGbGFncyhPYmplY3Qgb2JqKSAKLQl7Ci0JCWZpbmFsIFNldmVyaXR5IHNldmVyaXR5ID0gZGVmaW5lU2V2ZXJpdHkob2JqKTsJCQotCQlpZiAoc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuRVJST1IpIHsKLQkJCXJldHVybiBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUjsKLQkJfSAKLQkJCi0JCWlmIChzZXZlcml0eSA9PSBTZXZlcml0eS5XQVJOSU5HKSB7Ci0JCQlyZXR1cm4gSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuV0FSTklORzsKLQkJfQotCi0JCXJldHVybiAwOwotCX0JCi0KLQkvKioKLQkgKiBDaGVja3MgdGhlIG9iamVjdCdzIHJlc291cmNlIGZvciBtYXJrZXJzIGFuZCBkZWZpbmVzIHRoZSBzZXZlcml0eSBvZiB0aGUKLQkgKiBwcm9ibGVtIGlmIGFueS4gCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4gdGhlIHNldmVyaXR5IGNhbGN1bGF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIFNldmVyaXR5IGRlZmluZVNldmVyaXR5KGZpbmFsIE9iamVjdCBvYmopIAotCXsKLQkJdHJ5IAotCQl7Ci0JCQkvLyBwcm9jZXNzIGFkZGl0aW9uYWwgRE9NIG9iamVjdHMgbmVlZGVkIGZvciBVSSAtIElXZWJTZXJ2aWNlQ2hpbGRMaXN0IGFuZCBJU0VJQ2hpbGRMaXN0Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpIHsKLQkJCQlyZXR1cm4gZGVmaW5lU2V2ZXJpdHlGb3JFTGlzdCgoKElXZWJTZXJ2aWNlQ2hpbGRMaXN0KW9iaikuZ2V0V1NDaGlsZExpc3QoKSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KSB7Ci0JCQkJcmV0dXJuIGRlZmluZVNldmVyaXR5Rm9yRUxpc3QoKChJU0VJQ2hpbGRMaXN0KW9iaikuZ2V0U0VJQ2hpbGRMaXN0KCkpOwotCQkJfQotCQkJCi0JCQkvLyBkbyBub3QgcHJvY2VzcyBub24gRE9NIG9iamVjdHMKLQkJCWlmKCAhKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpICkgewotCQkJCXJldHVybiBTZXZlcml0eS5PSzsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGRlZmluZVNldmVyaXR5KChFT2JqZWN0KSBvYmopOwotCQl9IAotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkobmV3IExvZ2dlcigpKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gU2V2ZXJpdHkuT0s7Ci0JfQotCQotCXByb3RlY3RlZCBTZXZlcml0eSBkZWZpbmVTZXZlcml0eUZvckVMaXN0KGZpbmFsIExpc3Q8PyBleHRlbmRzIEVPYmplY3Q+IGxpc3QpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTZXZlcml0eSBzZXZlcml0eSA9IFNldmVyaXR5Lk9LOwkJCi0JCWZvciAoRU9iamVjdCBlT2JqZWN0IDogbGlzdCkgCi0JCXsKLQkJCVNldmVyaXR5IHRlbXBTZXZlcml0eSA9IGRlZmluZVNldmVyaXR5KGVPYmplY3QpOwotCQkJaWYgKHRlbXBTZXZlcml0eSA9PSBTZXZlcml0eS5FUlJPUikgewotCQkJCXJldHVybiBTZXZlcml0eS5FUlJPUjsKLQkJCX0KLQkJCQotCQkJaWYgKHRlbXBTZXZlcml0eT09U2V2ZXJpdHkuV0FSTklORykgewotCQkJCXNldmVyaXR5ID0gU2V2ZXJpdHkuV0FSTklORzsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHNldmVyaXR5OwotCX0KLQkKLQlwcm90ZWN0ZWQgU2V2ZXJpdHkgZGVmaW5lU2V2ZXJpdHkoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQl7IAkJCi0JCWZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSA9IERvbTJSZXNvdXJjZU1hcHBlci5JTlNUQU5DRS5maW5kUmVzb3VyY2UoZU9iamVjdCk7Ci0JCWlmIChyZXNvdXJjZSE9bnVsbCkgewotCQkJcmV0dXJuIGRlZmluZVNldmVyaXR5KGVPYmplY3QsIHJlc291cmNlKTsKLQkJfQotCQkKLQkJcmV0dXJuIFNldmVyaXR5Lk9LOwotCX0KLQkJCi0JcHJvdGVjdGVkIFNldmVyaXR5IGRlZmluZVNldmVyaXR5KGZpbmFsIEVPYmplY3QgZU9iamVjdCwgZmluYWwgSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKCFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuIFNldmVyaXR5Lk9LOwotCQl9Ci0JCQotCQlmaW5hbCBpbnQgZGVwdGggPSAocmVzb3VyY2UuZ2V0VHlwZSgpPT1JUmVzb3VyY2UuUFJPSkVDVCkgPyBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUgOiBJUmVzb3VyY2UuREVQVEhfWkVSTzsKLQkJZmluYWwgQ29sbGVjdGlvbjxJTWFya2VyPiBtYXJrZXJzID0gZmluZEFwdE1hcmtlcnMocmVzb3VyY2UsIGRlcHRoKTsKLQkJU2V2ZXJpdHkgc2V2ZXJpdHkgPSBTZXZlcml0eS5PSzsKLQkJZm9yIChJTWFya2VyIG1hcmtlciA6IG1hcmtlcnMpIAotCQl7Ci0JCQlpZiAoIWlzUmVsZXZhbnRGb3IoZU9iamVjdCwgbWFya2VyKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpbnQgdGVtcFNldmVyaXR5ID0gKEludGVnZXIpbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKTsKLQkJCWlmICh0ZW1wU2V2ZXJpdHk9PUlNYXJrZXIuU0VWRVJJVFlfRVJST1IpIHsKLQkJCQlyZXR1cm4gU2V2ZXJpdHkuRVJST1I7Ci0JCQl9IAotCi0JCQlpZih0ZW1wU2V2ZXJpdHk9PUlNYXJrZXIuU0VWRVJJVFlfV0FSTklORykgewotCQkJCXNldmVyaXR5ID0gU2V2ZXJpdHkuV0FSTklORzsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHNldmVyaXR5ID09IFNldmVyaXR5Lk9LICYmIChlT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpKSAKLQkJewotCQkJLy8gZm9yIGJlYW4gd2l0aCBleHBsaWNpdCBpbnRlcmZhY2Ugd2UgbmVlZCB0byBjaGVjayB0aGUgaW50ZXJmYWNlIGFzIHdlbGwgCi0JCQkvLyBiZWNhdXNlIGl0IHJlc2lkZXMgaW4gYW5vdGhlciByZXNvdXJjZQotCQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoKElXZWJTZXJ2aWNlKWVPYmplY3QpLmdldFNlcnZpY2VFbmRwb2ludCgpOwotCQkJaWYgKHNlaSAhPSBudWxsICYmICFzZWkuaXNJbXBsaWNpdCgpKSB7Ci0JCQkJc2V2ZXJpdHkgPSBkZWZpbmVTZXZlcml0eShzZWkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogRGVmaW5lcyBpZiA8Y29kZT5tYXJrZXI8L2NvZGU+IGlzIHJlbGV2YW50IGZvciA8Y29kZT5lT2JqZWN0PC9jb2RlPi4KLQkgKiBPbmx5IGZvciB3ZWIgbWV0aG9kIGFuZCB3ZWIgcGFyYW1ldGVyIHdlIG5lZWQgdG8gZGVmaW5lIGlmIHRoZSBtYXJrZXIgaXMgcmVsZXZhbnQKLQkgKiBiZWNhdXNlIHRoZXkgYXJlIG5vdCB1bmlxdWUgaW4gdGhlIHNjb3BlIG9mIHRoZSByZXNvdXJjZS4gRm9yIGV4YW1wbGUgaWYgdGhlcmUgaXMgYQotCSAqIG1hcmtlciBzZXQgb24gdGhlIHJlc291cmNlIGNvbnRhaW5pbmcgU0VJLCB0aGUgU0VJIHNob3VsZCBiZSBtYXJrZWQgaW4gYW55IGNhc2UgCi0JICogd2hpbGUgdGhlIG1ldGhvZCBvbmx5IGluIGNhc2Ugd2hlbiB0aGUgZXJyb3IgaXMgc3BlY2lmaWNhbGx5IGZvciB0aGlzIG1ldGhvZCBvciAKLQkgKiBtZXRob2QgcGFyYW1ldGVyLiAKLQkgKiBAcGFyYW0gZU9iamVjdCB0aGUgb2JqZWN0IHRvIGJlIHZhbGlkYXRlZAotCSAqIEBwYXJhbSBtYXJrZXIgdGhlIHJlc291cmNlIG1hcmtlciAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIG1hcmtlciBpcyByZWxldmFudCBmb3IgPGNvZGU+ZU9iamVjdDwvY29kZT4gCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvcihmaW5hbCBFT2JqZWN0IGVPYmplY3QsIGZpbmFsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJc3dpdGNoIChlT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRDoKLQkJCXJldHVybiBpc1JlbGV2YW50Rm9yTWV0aG9kKChJV2ViTWV0aG9kKWVPYmplY3QsIG1hcmtlcik7Ci0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNOgotCQkJcmV0dXJuIGlzUmVsZXZhbnRGb3JQYXJhbWV0ZXIoKElXZWJQYXJhbSllT2JqZWN0LCBtYXJrZXIpOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogRGVmaW5lcyBpZiA8Y29kZT5tYXJrZXI8L2NvZGU+IGlzIHJlbGV2YW50IGZvciA8Y29kZT53ZWJNZXRob2Q8L2NvZGU+LgotCSAqIENoZWNrcyBpZiB0aGUgbWFya2VyIGlzIHNwZWNpZmljYWxseSBmb3IgdGhpcyBtZXRob2Qgb3Igc29tZSBvZiBpdCdzIHBhcmFtZXRlcnMuCi0JICogQHBhcmFtIHdlYk1ldGhvZCB0aGUgbWV0aG9kIHRvIGJlIGNoZWNrZWQKLQkgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIgdG8gYmUgY2hlY2tlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSBtYXJrZXIgaXMgcmVsZXZhbnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvck1ldGhvZChmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJVHlwZSB0eXBlID0gZG9tMlJlc291cmNlTWFwcGVyLmZpbmRUeXBlKHdlYk1ldGhvZCk7Ci0JCWZpbmFsIElNZXRob2QgamF2YU1ldGhvZCA9IGRvbVV0aWwuZmluZE1ldGhvZCh0eXBlLCB3ZWJNZXRob2QpOwotCQlmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciBhbm5vdGF0aW9uSW5zcGVjdG9yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3Rvcih0eXBlKTsKLQkJYm9vbGVhbiByZWxldmFudCA9IGlzTWFya2VyUmVsZXZhbnRGb3IoamF2YU1ldGhvZCwgbWFya2VyLCBhbm5vdGF0aW9uSW5zcGVjdG9yKTsKLQkJaWYgKCFyZWxldmFudCkKLQkJewotCQkJZm9yIChTdHJpbmcgbWV0aG9kUGFyYW1ldGVyTmFtZSA6IGphdmFNZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKSkKLQkJCXsKLQkJCQlmaW5hbCBJVHlwZVBhcmFtZXRlciBwYXJhbSA9IGphdmFNZXRob2QuZ2V0VHlwZVBhcmFtZXRlcihtZXRob2RQYXJhbWV0ZXJOYW1lKTsKLQkJCQlyZWxldmFudCA9IHJlbGV2YW50IHx8IGlzTWFya2VyUmVsZXZhbnRGb3IocGFyYW0sIG1hcmtlciwgYW5ub3RhdGlvbkluc3BlY3Rvcik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVsZXZhbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvclBhcmFtZXRlcihmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0sIGZpbmFsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVR5cGUgdHlwZSA9IGRvbTJSZXNvdXJjZU1hcHBlci5maW5kVHlwZSh3ZWJQYXJhbSk7Ci0JCWZpbmFsIElUeXBlUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgPSBmaW5kSmF2YVBhcmFtZXRlcih0eXBlLCB3ZWJQYXJhbSk7Ci0JCXJldHVybiBpc01hcmtlclJlbGV2YW50Rm9yKGphdmFQYXJhbWV0ZXIsIG1hcmtlciwgQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3Rvcih0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHtAbGluayBJVHlwZVBhcmFtZXRlcn0gaW5zdGFuY2Ugd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHdlYiBwYXJhbWV0ZXIgc3BlY2lmaWVkCi0JICovCi0JcHJpdmF0ZSBJVHlwZVBhcmFtZXRlciBmaW5kSmF2YVBhcmFtZXRlcihmaW5hbCBJVHlwZSB0eXBlLCBmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElNZXRob2QgamF2YU1ldGhvZCA9IGRvbVV0aWwuZmluZE1ldGhvZCh0eXBlLCAoSVdlYk1ldGhvZCkgd2ViUGFyYW0uZUNvbnRhaW5lcigpKTsKLQkJZm9yIChTdHJpbmcgcGFyYW1OYW1lIDogamF2YU1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpKQotCQl7Ci0JCQlmaW5hbCBJVHlwZVBhcmFtZXRlciBqYXZhUGFyYW0gPSBqYXZhTWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIocGFyYW1OYW1lKTsKLQkJCWlmICh3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhqYXZhUGFyYW0uZ2V0RWxlbWVudE5hbWUoKSkpCi0JCQl7Ci0JCQkJcmV0dXJuIGphdmFQYXJhbTsKLQkJCX0KLQkJfQotCi0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlBhcmFtZXRlciAiICsgd2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSArICIgbm90IGZvdW5kIik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTWFya2VyUmVsZXZhbnRGb3IoZmluYWwgSU1ldGhvZCBqYXZhTWV0aG9kLCBmaW5hbCBJTWFya2VyIG1hcmtlciwgZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZm9yIChJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm4gOiBpbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChqYXZhTWV0aG9kKSkKLQkJewotCQkJaWYgKGlzTWFya2VyUmVsZXZhbnRUb0Fubm90YXRpb24obWFya2VyLCBhbm4pKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc01hcmtlclJlbGV2YW50Rm9yKGZpbmFsIElUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgZmluYWwgSU1hcmtlciBtYXJrZXIsIGZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZvciAoSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubiA6IGluc3BlY3Rvci5pbnNwZWN0UGFyYW0ocGFyYW1ldGVyKSkKLQkJewotCQkJaWYgKGlzTWFya2VyUmVsZXZhbnRUb0Fubm90YXRpb24obWFya2VyLCBhbm4pKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIG1hcmtlciBpcyByZWxldmFudCBmb3IgdGhlIGFubm90YXRpb24gc3BlY2lmaWVkPGJyPgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3b3VsZCByZWFkIGFsbCB0aGUgYW5ub3RhdGlvbnMgcmVsZXZhbnQgZm9yIHRoZSBqYXZhIGVsZW1lbnQgYW5kIGNoZWNrIHdoZXRoZXIgdGhlIG1hcmtlciBzdGFydC9lbmQgcG9zaXRpb24gaXMgYmV0d2VlbiBhbm5vdGF0aW9uIHN0YXJ0L2VuZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc01hcmtlclJlbGV2YW50VG9Bbm5vdGF0aW9uKGZpbmFsIElNYXJrZXIgbWFya2VyLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm4pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBpbnQgYW5uU3RhcnRQb3MgPSBhbm4uZ2V0TG9jYXRvcigpLmdldFN0YXJ0UG9zaXRpb24oKTsKLQkJZmluYWwgaW50IGFubkVuZFBvcyA9IGFublN0YXJ0UG9zICsgYW5uLmdldExvY2F0b3IoKS5nZXRMZW5ndGgoKSAtIDE7Ci0JCXJldHVybiAoYW5uU3RhcnRQb3MgPD0gKEludGVnZXIpIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSkgJiYgKGFubkVuZFBvcyA+PSAoSW50ZWdlcikgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYWxsIEFQVCBub25yZWNvbmNpbGUgbWFya2VycyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIHNwZWNpZmllZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxJTWFya2VyPiBmaW5kQXB0TWFya2VycyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIGludCBkZXB0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIENvbGxlY3Rpb248SU1hcmtlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxJTWFya2VyPigpOwotCQkvLyBTZWFyY2ggZm9yIGJvdGggQVBUIG1hcmtlciB0eXBlcy4gT25lIG9mIGVhY2ggSURzIGlzIHVzZWQgb24gTGludXggYW5kIFdpbmRvd3MKLQkJZm9yKGZpbmFsIElNYXJrZXIgbSA6IHJlc291cmNlLmZpbmRNYXJrZXJzKEFQVF9NQVJLRVJfSUQsIGZhbHNlLCBkZXB0aCkpCi0JCXsKLQkJCXJlc3VsdC5hZGQobSk7Ci0JCX0KLQkJCi0JCWZvcihmaW5hbCBJTWFya2VyIG0gOiByZXNvdXJjZS5maW5kTWFya2VycyhBUFRfTk9OUkVDT05DSUxFX01BUktFUl9JRCwgZmFsc2UsIGRlcHRoKSkKLQkJewotCQkJcmVzdWx0LmFkZChtKTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiZjEzNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL05hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFamJTZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLlByb2plY3RNYW5hZ2VtZW50VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbg0KLQkJaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUyIHsNCi0JcHJvdGVjdGVkIE9iamVjdCBzcmNPYmplY3Q7DQotDQotCXByaXZhdGUgSUphdmFQcm9qZWN0IHByb2plY3Q7DQotDQotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXI7DQotDQotCXByb3RlY3RlZCBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsNCi0JCXRoaXMoRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5PcGVuV1NSZXNvdXJjZUFjdGlvbl9OYW1lKTsNCi0NCi0JCXRoaXMudmlld2VyID0gdmlld2VyOw0KLQl9DQotDQotCXByb3RlY3RlZCBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oU3RyaW5nIHRleHQpIHsNCi0JCXN1cGVyKHRleHQpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKQ0KLQl7DQotCQlpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5OYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luV2ViU2VydmljZXNBcmVhQWN0aW9uOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLk5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbl9TaG93SW5FSkJBcmVhQWN0aW9uOw0KLQkJfQ0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgew0KLQkJYm9vbGVhbiBpc0VuYWJsZWQgPSBzdXBlci5pc0VuYWJsZWQoKSANCi0JCSYmIHRoaXMudmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcg0KLQkJJiYgdGhpcy5wcm9qZWN0ICE9bnVsbA0KLQkJJiYgUHJvamVjdE1hbmFnZW1lbnRVdGlscy5pc0VqYjNQcm9qZWN0KHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJcmV0dXJuIGlzRW5hYmxlZDsNCi0JCX0NCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pDQotCQl7DQotCQkJU2Vzc2lvbkJlYW4gc2Vzc2lvbkJlYW4gPSAoKFNlc3Npb25CZWFuKXNyY09iamVjdCk7DQotCQkJSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGdldFdlYlNlcnZpY2Uoc2Vzc2lvbkJlYW4pOw0KLQkJCWlmICh3ZWJTZXJ2aWNlID09IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UNCi0JCQkJJiYgKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNyY09iamVjdCkuaXNJbXBsaWNpdCgpKQ0KLQkJew0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0JCXJ1bigpOw0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcnVuKCkgew0KLQkJaWYgKCFpc0VuYWJsZWQoKSkNCi0JCQlyZXR1cm47DQotDQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gbnVsbDsNCi0NCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKQ0KLQkJew0KLQkJCVNlc3Npb25CZWFuIHNlc3Npb25CZWFuID0gKChTZXNzaW9uQmVhbilzcmNPYmplY3QpOw0KLQkJCVN0cmluZyBlamJDbGFzcyA9IHNlc3Npb25CZWFuLmdldEVqYkNsYXNzKCk7DQotCQkJSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGdldFdlYlNlcnZpY2Uoc2Vzc2lvbkJlYW4pOw0KLQkJCWlmICh3ZWJTZXJ2aWNlID09IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQ0KLQkJCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc0VJID0gd2ViU2VydmljZS5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQlib29sZWFuIGlzSW1wbGljaXQgPSBzRUkuaXNJbXBsaWNpdCgpOw0KLQkJCVN0cmluZyBzRUlDbGFzczsNCi0JCQlpZiAoIWlzSW1wbGljaXQpew0KLQkJCQlTdHJpbmcgaW1wbCA9IHNFSS5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCQlzRUlDbGFzcyA9IGltcGw7DQotCQkJfSBlbHNlIHsNCi0JCQkJc0VJQ2xhc3MgPSBlamJDbGFzczsNCi0JCQl9DQotICAgICAgICAgICAgdHJ5IHsNCi0JCQkJY3UgPSBwcm9qZWN0LmZpbmRUeXBlKHNFSUNsYXNzKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJSVJlc291cmNlIHJlc291cmNlID0gY3UuZ2V0UmVzb3VyY2UoKTsNCi0JCQkJbW92ZVRvU0VJTm9kZShyZXNvdXJjZSk7DQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5leHBlY3RlZCBleGNlcHRpb24gb2NjdXJyZWQiLCBqbWUpOyAvLyROT04tTkxTLTEkDQotCQkJCXJldHVybjsNCi0JCQl9DQotICAgICAgICAgICAgDQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdHJ5IHsNCi0JCQkJY3UgPSBwcm9qZWN0LmZpbmRUeXBlKA0KLQkJCQkJCSgoSUphdmFXZWJTZXJ2aWNlRWxlbWVudCkgc3JjT2JqZWN0KQ0KLQkJCQkJCQkJLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsNCi0JCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycmVkIiwgam1lKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCW1vdmVUb0VqYk5vZGUoY3UuZ2V0UmVzb3VyY2UoKSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgSVdlYlNlcnZpY2UgaWYgc2Vzc2lvbkJlYW4gaGFzIGJlZW4gZXhwb3NlZCBhcyB3ZWIgc2VydmljZS4NCi0JICogQHBhcmFtIHNlc3Npb25CZWFuIGEgc2Vzc2lvbiBiZWFuLg0KLQkgKiBAcmV0dXJuIElXZWJTZXJ2aWNlIGlmIHNlc3Npb25CZWFuIGhhcyBiZWVuIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2UuIElmIHRoZSBzZXNzaW9uIGJlYW4gaGFzIG5vdCBiZWVuDQotCSAqIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2UgLSByZXR1cm5zIG51bGwuDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc2Vzc2lvbkJlYW4gaXMgbnVsbC4NCi0JICovDQotCXByb3RlY3RlZCBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKGZpbmFsIFNlc3Npb25CZWFuIHNlc3Npb25CZWFuKSANCi0Jew0KLQkJZmluYWwgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lID0gZ2V0RG9tUnVudGltZSgpOw0KLQkJaWYgKGRvbVJ1bnRpbWUgPT0gbnVsbCkgew0KLQkJICAgICAgcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQl0cnkgew0KLQkJCWZpbmFsIElET00gZG9tID0gZG9tUnVudGltZS5nZXRET00oKTsNCi0JCQlpZiAoZG9tID09IG51bGwpIHsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfQ0KLQ0KLQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3ZWJTZXJ2aWNlUHJvamVjdCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFByb2plY3RCeU5hbWUoZG9tLCB0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7CQkNCi0JCQlyZXR1cm4gRG9tVXRpbC5JTlNUQU5DRS5maW5kV3NCeUltcGxOYW1lKHdlYlNlcnZpY2VQcm9qZWN0LCBzZXNzaW9uQmVhbi5nZXRFamJDbGFzcygpKTsNCi0JCX0gDQotCQljYXRjaCAoV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gZSkgeyAvLyAkSkwtRVhDJA0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERvbVJ1bnRpbWUoKSB7DQotCQlyZXR1cm4gV3NET01SdW50aW1lTWFuYWdlci5pbnN0YW5jZSgpLmdldERPTVJ1bnRpbWUoSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5JRCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb1NFSU5vZGUoSVJlc291cmNlIHJlc291cmNlKQ0KLQl7DQotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcil0aGlzLnZpZXdlcjsNCi0JCUlTZWxlY3Rpb24gc2VsID0gbnVsbDsNCi0NCi0JCU9iamVjdFtdIGV4cGFuZGVkT2JqZWN0cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOw0KLQ0KLQkJT2JqZWN0W10gcHJvamVjdEVsZW1lbnRzID0gKChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcg0KLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldENoaWxkcmVuKHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IG51bGw7DQotDQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcHJvamVjdEVsZW1lbnRzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChwcm9qZWN0RWxlbWVudHNbaWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KSB7DQotCQkJCXdzUHJvamVjdCA9IChJV2ViU2VydmljZVByb2plY3QpIHByb2plY3RFbGVtZW50c1tpaV07DQotCQkJCXRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCh3c1Byb2plY3QsIDIpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAod3NQcm9qZWN0ID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQ0KLQkJZm9yKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc0VJIDogd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCXsNCi0JCQl0cnkgew0KLQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcHJvamVjdC5maW5kVHlwZSgNCi0JCQkJCQkoKElKYXZhV2ViU2VydmljZUVsZW1lbnQpIHNFSSkNCi0JCQkJCQkJCS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJDQotCQkJCWlmKGN1LmdldFJlc291cmNlKCkuZXF1YWxzKHJlc291cmNlKSkNCi0JCQkJew0KLQkJCQkJc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc0VJKTsNCi0JCQkJCVRyZWVQYXRoIHRyZWVQYXRoID0gZ2V0VHJlZVBhdGhGb3JTRUkodHJlZVZpZXdlciwNCi0JCQkJCQkJd3NQcm9qZWN0KTsNCi0JCQkJCU9iamVjdFtdIGVsZW1lbnRzVG9FeHBhbmQgPSBuZXcgT2JqZWN0W3RyZWVQYXRoDQotCQkJCQkJCS5nZXRTZWdtZW50Q291bnQoKV07DQotDQotCQkJCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIHsNCi0JCQkJCQlpZiAobm90QWxyZWFkeUV4cGFuZGVkKHRyZWVQYXRoLmdldFNlZ21lbnQoamopLA0KLQkJCQkJCQkJZXhwYW5kZWRPYmplY3RzKSkgew0KLQkJCQkJCQllbGVtZW50c1RvRXhwYW5kW2pqXSA9IHRyZWVQYXRoLmdldFNlZ21lbnQoamopOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0NCi0JCQkJCWZvciAoaW50IGpqID0gMDsgamogPCBlbGVtZW50c1RvRXhwYW5kLmxlbmd0aDsgamorKykgew0KLQkJCQkJCWlmIChlbGVtZW50c1RvRXhwYW5kW2pqXSAhPSBudWxsKSB7DQotCQkJCQkJCU9iamVjdFtdIHRtcCA9IGV4cGFuZGVkT2JqZWN0czsNCi0JCQkJCQkJZXhwYW5kZWRPYmplY3RzID0gbmV3IE9iamVjdFtleHBhbmRlZE9iamVjdHMubGVuZ3RoICsgMV07DQotDQotCQkJCQkJCWZvciAoaW50IGtrID0gMDsga2sgPCB0bXAubGVuZ3RoOyBraysrKSB7DQotCQkJCQkJCQlleHBhbmRlZE9iamVjdHNba2tdID0gdG1wW2trXTsNCi0JCQkJCQkJfQ0KLQ0KLQkJCQkJCQlleHBhbmRlZE9iamVjdHNbZXhwYW5kZWRPYmplY3RzLmxlbmd0aCAtIDFdID0gZWxlbWVudHNUb0V4cGFuZFtqal07DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7DQotCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBvY2N1cnJlZCIsIGptZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCX0NCi0JCSBzZXRFeHBhbmRlZEVsZW1lbnRzQW5kU2VsZWN0aW9uKHRyZWVWaWV3ZXIsIGV4cGFuZGVkT2JqZWN0cywgc2VsKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb0VqYk5vZGUoSVJlc291cmNlIHJlc291cmNlKSB7DQotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcil0aGlzLnZpZXdlcjsNCi0JCUlTZWxlY3Rpb24gc2VsID0gbnVsbDsNCi0NCi0JCU9iamVjdFtdIGV4cGFuZGVkT2JqZWN0cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOw0KLQ0KLQkJT2JqZWN0W10gcHJvamVjdEVsZW1lbnRzID0gKChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcg0KLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldENoaWxkcmVuKHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJR3JvdXBFSkJQcm92aWRlciBlamJQcm92aWRlciA9IG51bGw7DQotCQlHcm91cEVqYlNlc3Npb24gZWpiU2Vzc2lvbiA9IG51bGw7DQotDQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcHJvamVjdEVsZW1lbnRzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChwcm9qZWN0RWxlbWVudHNbaWldIGluc3RhbmNlb2YgR3JvdXBFSkJQcm92aWRlcikgew0KLQkJCQllamJQcm92aWRlciA9IChHcm91cEVKQlByb3ZpZGVyKSBwcm9qZWN0RWxlbWVudHNbaWldOw0KLQkJCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZWpiUHJvdmlkZXIsIDEpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAoZWpiUHJvdmlkZXIgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotDQotCQlmb3IgKE9iamVjdCBlamJQcm92aWRlckNoaWxkIDogZWpiUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKSkgew0KLQkJCWlmIChlamJQcm92aWRlckNoaWxkIGluc3RhbmNlb2YgR3JvdXBFamJTZXNzaW9uKSB7DQotCQkJCWVqYlNlc3Npb24gPSAoR3JvdXBFamJTZXNzaW9uKSBlamJQcm92aWRlckNoaWxkOw0KLQkJCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZWpiU2Vzc2lvbiwgMik7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKGVqYlNlc3Npb24gPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCU9iamVjdFtdIGVqYnMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsNCi0NCi0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBlamJzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmICgoZWpic1tpaV0gaW5zdGFuY2VvZiBTZXNzaW9uQmVhbil8fChlamJzW2lpXSBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKSkgew0KLQkJCQ0KLQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBmaW5kSmF2YVByb2plY3QoZWpic1tpaV0pOw0KLQkJCQlJVHlwZSB0ID0gbnVsbDsNCi0JCQkJdHJ5IHsNCi0JCQkJCWlmKChlamJzW2lpXSBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKSkNCi0JCQkJCQl0ID0gamF2YVByb2plY3QuZmluZFR5cGUoKChTZXNzaW9uQmVhbillamJzW2lpXSkuZ2V0RWpiQ2xhc3MoKSk7DQotCQkJCQllbHNlDQotCQkJCQkJdCA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKCgoTWVzc2FnZURyaXZlbkJlYW4pZWpic1tpaV0pLmdldEVqYkNsYXNzKCkpOw0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJCUlSZXNvdXJjZSByID0gdC5nZXRSZXNvdXJjZSgpOw0KLQkJCQkNCi0JCQkJaWYgKHIuZXF1YWxzKHJlc291cmNlKSkgew0KLQkJCQkJc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWpic1tpaV0pOw0KLQkJCQkJVHJlZVBhdGggdHJlZVBhdGggPSBnZXRUcmVlUGF0aEZvck9iamVjdCh0cmVlVmlld2VyLA0KLQkJCQkJCQllamJzW2lpXSk7DQotCQkJCQlleHBhbmRFbGVtZW50cyhleHBhbmRlZE9iamVjdHMsIHRyZWVQYXRoKTsNCi0NCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJIHNldEV4cGFuZGVkRWxlbWVudHNBbmRTZWxlY3Rpb24odHJlZVZpZXdlciwgZXhwYW5kZWRPYmplY3RzLCBzZWwpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGZpbmRKYXZhUHJvamVjdChPYmplY3QgZWpiKQ0KLQl7DQotCQlJUHJvamVjdCBwcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVqYik7DQotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2opOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBzZXRFeHBhbmRlZEVsZW1lbnRzQW5kU2VsZWN0aW9uKFRyZWVWaWV3ZXIgdHJlZVZpZXdlciwgT2JqZWN0W10gZXhwYW5kZWRPYmplY3RzLCBJU2VsZWN0aW9uIHNlbCkNCi0Jew0KLQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZEVsZW1lbnRzKGV4cGFuZGVkT2JqZWN0cyk7DQotDQotCQlpZiAoc2VsICE9IG51bGwpIHsNCi0JCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwsIHRydWUpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgZXhwYW5kRWxlbWVudHMoT2JqZWN0W10gZXhwYW5kZWRPYmplY3RzLCBUcmVlUGF0aCB0cmVlUGF0aCkNCi0Jew0KLQkJDQotCQlPYmplY3RbXSBlbGVtZW50c1RvRXhwYW5kID0gbmV3IE9iamVjdFt0cmVlUGF0aC5nZXRTZWdtZW50Q291bnQoKV07DQotDQotCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIA0KLQkJew0KLQkJCWlmIChub3RBbHJlYWR5RXhwYW5kZWQodHJlZVBhdGguZ2V0U2VnbWVudChqaiksIGV4cGFuZGVkT2JqZWN0cykpIA0KLQkJCXsNCi0JCQkJZWxlbWVudHNUb0V4cGFuZFtqal0gPSB0cmVlUGF0aC5nZXRTZWdtZW50KGpqKTsNCi0JCQl9DQotCQl9DQotDQotCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIHsNCi0JCSAgICBpZiAoZWxlbWVudHNUb0V4cGFuZFtqal0gIT0gbnVsbCkgew0KLQkJICAgIAlPYmplY3RbXSB0bXAgPSBleHBhbmRlZE9iamVjdHM7DQotCQkgICAgICAgIGV4cGFuZGVkT2JqZWN0cyA9IG5ldyBPYmplY3RbZXhwYW5kZWRPYmplY3RzLmxlbmd0aCArIDFdOw0KLQ0KLQkJCQlmb3IgKGludCBrayA9IDA7IGtrIDwgdG1wLmxlbmd0aDsga2srKykgew0KLQkJCQkJZXhwYW5kZWRPYmplY3RzW2trXSA9IHRtcFtra107DQotCQkJCX0NCi0NCi0JCQkJZXhwYW5kZWRPYmplY3RzW2V4cGFuZGVkT2JqZWN0cy5sZW5ndGggLSAxXSA9IGVsZW1lbnRzVG9FeHBhbmRbampdOw0KLQkJICAgIH0NCi0JCX0NCi0JfQ0KLQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gbm90QWxyZWFkeUV4cGFuZGVkKE9iamVjdCBvYmosIE9iamVjdFtdIGV4cE9ianMpIHsNCi0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBleHBPYmpzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChleHBPYmpzW2lpXS5lcXVhbHMob2JqKSkgew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JcHJpdmF0ZSBUcmVlUGF0aCBnZXRUcmVlUGF0aEZvclNFSShUcmVlVmlld2VyIHRyZWVWaWV3ZXIsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCVRyZWVQYXRoW10gdHJlZVBhdGhzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZFRyZWVQYXRocygpOw0KLQ0KLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHRyZWVQYXRocy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAodHJlZVBhdGhzW2lpXS5nZXRMYXN0U2VnbWVudCgpIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdA0KLQkJCQkJJiYgY29udGFpbnModHJlZVBhdGhzW2lpXSwgd3NQcm9qZWN0KSkgew0KLQkJCQlyZXR1cm4gdHJlZVBhdGhzW2lpXTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKFRyZWVQYXRoIHRyZWVQYXRoLCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQl7DQotCQlmb3IoaW50IGlpPTA7IGlpPHRyZWVQYXRoLmdldFNlZ21lbnRDb3VudCgpOyBpaSsrKQ0KLQkJew0KLQkJCWlmKHRyZWVQYXRoLmdldFNlZ21lbnQoaWkpLmVxdWFscyh3c1Byb2plY3QpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JcHJpdmF0ZSBUcmVlUGF0aCBnZXRUcmVlUGF0aEZvck9iamVjdChUcmVlVmlld2VyIHRyZWVWaWV3ZXIsIE9iamVjdCBvYmopIHsNCi0JCVRyZWVQYXRoW10gdHJlZVBhdGhzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZFRyZWVQYXRocygpOw0KLQ0KLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHRyZWVQYXRocy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAodHJlZVBhdGhzW2lpXS5nZXRMYXN0U2VnbWVudCgpLmVxdWFscyhvYmopKSB7DQotCQkJCXJldHVybiB0cmVlUGF0aHNbaWldOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sDQotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCi0JCS8vIFRPRE8gSEFDSyENCi0JCXVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwNCi0JCQlJSmF2YVByb2plY3QgcHJvamVjdCkgew0KLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOw0KLQ0KLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhlIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGluIHRoZSB3b3JrYmVuY2guIFN1YmNsYXNzZXMgc2hvdWxkDQotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJlYWN0IHRvIHRoZSBjaGFuZ2UuIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWN0aW9uDQotCSAqIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGlzIHNlbGVjdGlvbiwgYW5kIGZhbHNlIG90aGVyd2lzZS4NCi0JICogDQotCSAqIFdoZW4gdGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiwgdGhlIHN1cGVyIG1ldGhvZCBtdXN0IGFsd2F5cyBiZSBpbnZva2VkLg0KLQkgKiBJZiB0aGUgc3VwZXIgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoaXMgbWV0aG9kIG11c3QgYWxzbyByZXR1cm4gZmFsc2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2VsDQotCSAqICAgICAgICAgICAgdGhlIG5ldyBzdHJ1Y3R1cmVkIHNlbGVjdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsNCi0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0NCi0JCXNyY09iamVjdCA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcigpIHsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi0JDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQkvLyBEaXNwb3NlDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7DQotCQkvLyBpbml0DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsNCi0JCXJ1bldpdGhFdmVudChldmVudCk7DQotDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL09wZW5XU1Jlc291cmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvT3BlbldTUmVzb3VyY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjJmODZkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvT3BlbldTUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCi0NCi1wdWJsaWMgY2xhc3MgT3BlbldTUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZTIgDQotew0KLQlwcm90ZWN0ZWQgT2JqZWN0IHNyY09iamVjdDsNCi0NCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgcHJvamVjdDsNCi0JDQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7DQotCXByaXZhdGUgRG9tVXRpbCB1dGlsID0gRG9tVXRpbC5JTlNUQU5DRTsNCi0NCi0JcHJvdGVjdGVkIE9wZW5XU1Jlc291cmNlQWN0aW9uKCkgew0KLQkJdGhpcyhEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLk9wZW5XU1Jlc291cmNlQWN0aW9uX05hbWUpOw0KLQl9DQotDQotCXByb3RlY3RlZCBPcGVuV1NSZXNvdXJjZUFjdGlvbihTdHJpbmcgdGV4dCkgew0KLQkJc3VwZXIodGV4dCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsNCi0JCWJvb2xlYW4gaXNFbmFibGVkID0gc3VwZXIuaXNFbmFibGVkKCkNCi0JCSYmIHRoaXMucHJvamVjdCE9bnVsbDsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJcmV0dXJuIGlzRW5hYmxlZDsNCi0JCX0NCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkNCi0JCXsNCi0JCQlyZXR1cm4gaXNFbmFibGVkOw0KLQkJfQ0KLQkJDQotCQlpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBJV2ViTWV0aG9kKQ0KLQkJew0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIElXZWJQYXJhbSkNCi0JCXsNCi0JCQlyZXR1cm4gaXNFbmFibGVkOw0KLQkJfQkJDQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsNCi0JCXJ1bigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcnVuKCkgew0KLQkJaWYgKCFpc0VuYWJsZWQoKSkNCi0JCQlyZXR1cm47DQotDQotCQlJQ29tcGlsYXRpb25Vbml0IGN1Ow0KLQkJSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSBudWxsOw0KLQkJSVdlYlBhcmFtIHdlYlBhcmFtID0gbnVsbDsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYk1ldGhvZCkNCi0JCXsNCi0JCQl3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZClzcmNPYmplY3Q7DQotCQkJc3JjT2JqZWN0ID0gc2VpOw0KLQkJfQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlBhcmFtKQ0KLQkJew0KLQkJCXdlYlBhcmFtID0gKElXZWJQYXJhbSlzcmNPYmplY3Q7DQotCQkJd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOw0KLQkJCXNyY09iamVjdCA9IHNlaTsNCi0JCX0NCi0JCQ0KLQkJdHJ5IHsNCi0NCi0JCQljdSA9IHByb2plY3QuZmluZFR5cGUoKChJSmF2YVdlYlNlcnZpY2VFbGVtZW50KSBzcmNPYmplY3QpLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQ0KLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7DQotDQotCQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzYyA9IGdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihjdS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSk7DQotCQkNCi0JCQljdSA9IGdldENVVG9PcGVuKGN1LCB3ZWJNZXRob2QpOwkJDQotCQkJaWYgKGN1ID09IG51bGwpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIGxvY2F0ZSBjb250YWluaW5nIENVIHRvIG9wZW4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJDQotCQkJSUZpbGUgZmlsZSA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihjdS5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkpWzBdOyANCi0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZGVzYy5nZXRJZCgpKTsNCi0JCQkNCi0JCQlJTWFya2VyIG1hcmtlciA9IGZpbGUuY3JlYXRlTWFya2VyKElNYXJrZXIuVEVYVCk7DQotCQkJSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsNCi0JCQkNCi0JCQltYXAucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgZ2V0TWFya2VyUG9zaXRpb24oY3UsIHdlYk1ldGhvZCwgZmFsc2UpKTsNCi0JCQltYXAucHV0KElNYXJrZXIuQ0hBUl9FTkQsIGdldE1hcmtlclBvc2l0aW9uKGN1LCB3ZWJNZXRob2QsIHRydWUpKTsNCi0JCQkNCi0JCQltYXJrZXIuc2V0QXR0cmlidXRlcyhtYXApOw0KLQkJCQ0KLQkJCUlERS5nb3RvTWFya2VyKGVkaXRvciwgbWFya2VyKTsNCi0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gb3BlbiBwYXJ0IGVkaXRvciIsIHBpZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKGNlLmdldE1lc3NhZ2UoKSwgY2UpOyANCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIGludCBnZXRNYXJrZXJQb3NpdGlvbihJQ29tcGlsYXRpb25Vbml0IGN1LCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgYm9vbGVhbiBlbmRQb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7DQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgdHlwZXMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmICh3ZWJNZXRob2QgPT0gbnVsbCkNCi0JCQl7DQotCQkJCXJldHVybiBnZXRQb3NpdGlvbih0eXBlc1tpaV0sIGVuZFBvcyk7DQotCQkJfQ0KLQ0KLQkJCWZpbmFsIElNZXRob2QgbWV0aG9kID0gdXRpbC5maW5kTWV0aG9kKHR5cGVzW2lpXSwgd2ViTWV0aG9kKTsNCi0JCQlpZiAobWV0aG9kPT1udWxsKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gZ2V0UG9zaXRpb24obWV0aG9kLCBlbmRQb3MpOw0KLQkJfQ0KLQkJCQkNCi0JCXJldHVybiAwOw0KLQl9DQotCQ0KLQlwcml2YXRlIGludCBnZXRQb3NpdGlvbihJTWVtYmVyIG1lbWJlciwgYm9vbGVhbiBlbmRQb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCXJldHVybiBtZW1iZXIuZ2V0TmFtZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgKyAoKGVuZFBvcykgPyBtZW1iZXIuZ2V0TmFtZVJhbmdlKCkuZ2V0TGVuZ3RoKCkgOiAwKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGdldENVVG9PcGVuKElDb21waWxhdGlvblVuaXQgY3UsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlpZiAod2ViTWV0aG9kID09IG51bGwpIA0KLQkJew0KLQkJCXJldHVybiBjdTsNCi0JCX0NCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJZmluYWwgSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7CQkJDQotCQkJZm9yKGludCBpaT0wOyBpaTx0eXBlcy5sZW5ndGg7IGlpKyspDQotCQkJew0KLQkJCQlJTWV0aG9kIG1ldGhvZCA9IHV0aWwuZmluZE1ldGhvZCh0eXBlc1tpaV0sIHdlYk1ldGhvZCk7DQotCQkJCWlmIChtZXRob2QgIT0gbnVsbCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHR5cGVzW2lpXS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlmb3IoaW50IGlpPTA7IGlpPHR5cGVzLmxlbmd0aDsgaWkrKykNCi0JCQl7DQotCQkJCUlUeXBlW10gc3VwZXJJbnRmVHlwZXMgPSB0eXBlc1tpaV0ubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldFN1cGVySW50ZXJmYWNlcyh0eXBlc1tpaV0pOw0KLQkJCQkNCi0JCQkJZm9yKGludCBqaj0wOyBqajxzdXBlckludGZUeXBlcy5sZW5ndGg7IGpqKyspDQotCQkJCXsNCi0JCQkJCUlDb21waWxhdGlvblVuaXQgY3VUb09wZW4gPSBnZXRDVVRvT3BlbihzdXBlckludGZUeXBlc1tqal0uZ2V0Q29tcGlsYXRpb25Vbml0KCksIHdlYk1ldGhvZCk7DQotCQkJCQkNCi0JCQkJCWlmKGN1VG9PcGVuIT1udWxsKQ0KLQkJCQkJew0KLQkJCQkJCXJldHVybiBjdVRvT3BlbjsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJSVR5cGUgc3VwZXJDbGFzc1R5cGUgPSB0eXBlc1tpaV0ubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldFN1cGVyY2xhc3ModHlwZXNbaWldKTsNCi0JCQkJDQotCQkJCUlDb21waWxhdGlvblVuaXQgY3VUb09wZW4gPSBnZXRDVVRvT3BlbihzdXBlckNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgd2ViTWV0aG9kKTsNCi0JCQkJCQ0KLQkJCQlpZihjdVRvT3BlbiE9bnVsbCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGN1VG9PcGVuOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcihqbWUuZ2V0TWVzc2FnZSgpLCBqbWUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KLQkJdXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSUphdmFQcm9qZWN0IHByb2plY3QsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKSB7DQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7DQotDQotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0Ow0KLQkJdGhpcy5zZWkgPSBzZWk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoZSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCBpbiB0aGUgd29ya2JlbmNoLiBTdWJjbGFzc2VzIHNob3VsZA0KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZWFjdCB0byB0aGUgY2hhbmdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGFjdGlvbg0KLQkgKiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBzZWxlY3Rpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuDQotCSAqIA0KLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIHRoZSBzdXBlciBtZXRob2QgbXVzdCBhbHdheXMgYmUgaW52b2tlZC4NCi0JICogSWYgdGhlIHN1cGVyIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGlzIG1ldGhvZCBtdXN0IGFsc28gcmV0dXJuIGZhbHNlLg0KLQkgKiANCi0JICogQHBhcmFtIHNlbA0KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RydWN0dXJlZCBzZWxlY3Rpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7DQotCQlpZiAoIXN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlzcmNPYmplY3QgPSBzLmdldEZpcnN0RWxlbWVudCgpOw0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQkvLyBEaXNwb3NlDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7DQotCQkvLyBpbml0DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsNCi0JCXJ1bldpdGhFdmVudChldmVudCk7DQotDQotCX0NCi0JDQotCXByaXZhdGUgSUxvZ2dlciBsb2dnZXIoKSB7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotDQotCXByaXZhdGUgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7DQotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgew0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL1dTQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRmOGRkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTWVudUNvbnN0YW50czsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgV1NBY3Rpb25Qcm92aWRlciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIA0KLXsNCi0JcHJpdmF0ZSBPcGVuV1NSZXNvdXJjZUFjdGlvbiBvcGVuQWN0aW9uOw0KLQ0KLQlwcml2YXRlIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbiBuYXZpZ2F0ZUFjdGlvbjsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSANCi0Jew0KLQkJaWYob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkgDQotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTiwgb3BlbkFjdGlvbik7DQotCQkNCi0JCWlmKG5hdmlnYXRlQWN0aW9uLmlzRW5hYmxlZCgpKQ0KLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSwgbmF2aWdhdGVBY3Rpb24pOwkNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSANCi0Jew0KLQkJaWYgKGdldENvbnRleHQoKT09bnVsbCB8fCBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQ0KLQkJCXJldHVybjsNCi0JCQ0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7DQotCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCW5hdmlnYXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCW5hdmlnYXRlQWN0aW9uLnNldFRleHQobmF2aWdhdGVBY3Rpb24uZ2V0VGV4dCgpKTsNCi0JCQ0KLQkJaWYgKG9wZW5BY3Rpb24uaXNFbmFibGVkKCkpDQotCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBvcGVuQWN0aW9uKTsNCi0JCQ0KLQkJaWYobmF2aWdhdGVBY3Rpb24uaXNFbmFibGVkKCkpDQotCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOX1dJVEgsIG5hdmlnYXRlQWN0aW9uKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBzaXRlKSB7DQotCQlzdXBlci5pbml0KHNpdGUpOw0KLQkJDQotCQlvcGVuQWN0aW9uID0gbmV3IE9wZW5XU1Jlc291cmNlQWN0aW9uKCk7DQotCQluYXZpZ2F0ZUFjdGlvbiA9IGluaXROYXZpZ2F0ZUFjdGlvbihzaXRlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbiBpbml0TmF2aWdhdGVBY3Rpb24oSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgc2l0ZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oc2l0ZS5nZXRTdHJ1Y3R1cmVkVmlld2VyKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEFjdGlvbkNvbnRleHQgY29udGV4dCkgew0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIA0KLQkJew0KLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29udGV4dC5nZXRTZWxlY3Rpb24oKTsNCi0JCQkNCi0JCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbikNCi0JCQl7DQotCQkJCVRyZWVQYXRoW10gcGF0aHMgPSAoKElUcmVlU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0UGF0aHNGb3Ioc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsNCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7DQotCQkJCQ0KLQkJCQlmb3IoaW50IGlpPTA7IGlpPHBhdGhzLmxlbmd0aDsgaWkrKykNCi0JCQkJew0KLQkJCQkJVHJlZVBhdGggcGF0aCA9IHBhdGhzW2lpXTsNCi0JCQkJCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gbnVsbDsNCi0JCQkJCQ0KLQkJCQkJZm9yKGludCBqaj0wOyBqajxwYXRoLmdldFNlZ21lbnRDb3VudCgpOyBqaisrKQ0KLQkJCQkJew0KLQkJCQkJCWlmKHBhdGguZ2V0U2VnbWVudChqaikgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKQ0KLQkJCQkJCXsNCi0JCQkJCQkJc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpcGF0aC5nZXRTZWdtZW50KGpqKTsNCi0JCQkJCQkJYnJlYWs7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCQlmb3IoaW50IGpqPTA7IGpqPHBhdGguZ2V0U2VnbWVudENvdW50KCk7IGpqKyspDQotCQkJCQl7DQotCQkJCQkJaWYocGF0aC5nZXRTZWdtZW50KGpqKSBpbnN0YW5jZW9mIElQcm9qZWN0KQ0KLQkJCQkJCXsNCi0JCQkJCQkJcHJvamVjdCA9IChJUHJvamVjdClwYXRoLmdldFNlZ21lbnQoamopOw0KLQkJCQkJCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uLCBnZXRKYXZhUHJvamVjdChwcm9qZWN0KSwgc2VpKTsNCi0JCQkJCQkJbmF2aWdhdGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24sIGdldEphdmFQcm9qZWN0KHByb2plY3QpKTsNCi0JCQkJCQkJc3VwZXIuc2V0Q29udGV4dChjb250ZXh0KTsNCi0JCQkJCQkJcmV0dXJuOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCQluYXZpZ2F0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7DQotCQl9DQotCQkNCi0JCXN1cGVyLnNldENvbnRleHQoY29udGV4dCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxYTQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTM4NzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNNb24gSnVsIDIwIDE1OjI1OjMxIEVFU1QgMjAwOQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGNkNDRmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjANCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lO3NpbmdsZXRvbjo9dHJ1ZQ0KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXINCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZVBsdWdpbg0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMsDQotIG9yZy5lY2xpcHNlLnVpLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywNCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMiLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMiLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucHJvdmlkZXIsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxMGFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAxNSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWFlMjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyNWI3MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTGFuZ3VhZ2UgRmlsZSBmb3IgdGhpcyBQbHVnaW4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBHZW5lcmljIExhYmVsIGFuZCBEZXNjcmlwdGlvbg0KLUJ1bmRsZS1OYW1lLjA9SkFYLVdTIERPTSBSdW50aW1lDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQotDQotRG9tUnVudGltZXNFeHRlbnNpb25fTmFtZSA9IERPTSBSdW50aW1lcw0KLUV4dGVuc2lvblBvaW50LU5hbWUuMyA9IEpFRTUgRE9NIGNvbnRyaWJ1dGlvbg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NzQ2YTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4NCi08IS0tDQotICAgIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICANCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIC0tPg0KLQ0KLTxwbHVnaW4+DQotDQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZG9tcnVudGltZXMiIG5hbWU9IiVEb21SdW50aW1lc0V4dGVuc2lvbl9OYW1lIiBzY2hlbWE9InNjaGVtYS9ydW50aW1lcy5leHNkIi8+DQotICAgICAgDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+DQotICAgICAgPHN0YXJ0dXAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudCIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+DQotICAgCTxwYWNrYWdlIA0KLSAgICAgICB1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIiANCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlIiAvPg0KLSAgCTwvZXh0ZW5zaW9uPg0KLQ0KLQ0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5qZWU1IiANCi0gICAgICAgICBuYW1lPSIlRXh0ZW5zaW9uUG9pbnQtTmFtZS4zIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuZG9tcnVudGltZXMiPg0KLSAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24iLz4NCi0gICAgICA8cHJvamVjdF9mYWNldCBpZD0ianN0LmVqYiIgdmVyc2lvbj0iMy4wIi8+DQotICAgICAgPHByb2plY3RfZmFjZXQgaWQ9ImpzdC53ZWIiIHZlcnNpb249IjIuNSIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NjaGVtYS9ydW50aW1lcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc2NoZW1hL3J1bnRpbWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5M2ViMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc2NoZW1hL3J1bnRpbWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIiBpZD0ic3VwcG9ydGVkcnVudGltZXMiIG5hbWU9IlN1cHBvcnRlZCBSdW50aW1lcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBVc2UgdGhpcyBleHRlbnNpb24gcG9pbnQgdG8gYWRkIHN1cHBvcnQgZm9yIGEgcnVudGltZSBpbiB0aGUgV1MgRE9NIFRyZWUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvamVjdF9mYWNldCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImltcGxlbWVudGF0aW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb24iLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InByb2plY3RfZmFjZXQiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9Eb21VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0RvbVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjdkMThjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0RvbVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb21Td2l0Y2g7DQotDQotDQotcHVibGljIGNsYXNzIERvbVV0aWwNCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG9tVXRpbCBJTlNUQU5DRSA9IG5ldyBEb21VdGlsKCk7DQotCQ0KLQlwcml2YXRlIGZpbmFsIERvbVN3aXRjaDxTdHJpbmc+IGltcGxTd2l0Y2g7DQotCQ0KLQlwdWJsaWMgRG9tVXRpbCgpIHsNCi0JCWltcGxTd2l0Y2ggPSBjcmVhdGVJbXBsRmluZGVyU3dpdGNoKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVWYWx1ZShmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgaW50IGZlYXR1cmVJZCwgZmluYWwgT2JqZWN0IHZhbHVlKQ0KLQl7DQotCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IG9iamVjdC5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZUlkKTsNCi0JCW9iamVjdC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmVWYWx1ZShmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgaW50IGZlYXR1cmVJZCkNCi0Jew0KLQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmVJZCk7DQotCQlyZXR1cm4gb2JqZWN0LmVHZXQoZmVhdHVyZSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgYWRkVG9Db2xsZWN0aW9uRmVhdHVyZShmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgaW50IGZlYXR1cmVJZCwgZmluYWwgT2JqZWN0IHZhbHVlKQ0KLQl7DQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JCWZpbmFsIENvbGxlY3Rpb248T2JqZWN0PiBvbGRWYWx1ZSA9IChDb2xsZWN0aW9uPE9iamVjdD4pIGdldEZlYXR1cmVWYWx1ZShvYmplY3QsIGZlYXR1cmVJZCk7DQotCQlvbGRWYWx1ZS5hZGQodmFsdWUpOw0KLQl9DQotDQotCXB1YmxpYyBJV2ViU2VydmljZVByb2plY3QgZmluZFByb2plY3RCeU5hbWUoSURPTSBkb20sIFN0cmluZyBuYW1lKQ0KLQl7DQotCQlmb3IgKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgOiBkb20uZ2V0V2ViU2VydmljZVByb2plY3RzKCkpDQotCQl7DQotCQkJaWYgKHdzUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHdzUHJvamVjdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVdlYlNlcnZpY2UgZmluZFdzQnlJbXBsTmFtZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJZm9yIChJV2ViU2VydmljZSB3cyA6IHdzUHJvamVjdC5nZXRXZWJTZXJ2aWNlcygpKQ0KLQkJew0KLQkJCWlmICh3cy5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiB3czsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBmaW5kU2VpQnlJbXBsTmFtZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJZm9yIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkpDQotCQl7DQotCQkJaWYgKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiBzZWk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCQ0KLQlwdWJsaWMgSVdlYk1ldGhvZCBmaW5kV2ViTWV0aG9kQnlJbXBsKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpLCBTdHJpbmcgaW1wbCkNCi0Jew0KLQkJZm9yIChJV2ViTWV0aG9kIHdtIDogc2VpLmdldFdlYk1ldGhvZHMoKSkNCi0JCXsNCi0JCQlpZiAod20uZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbCkpDQotCQkJew0KLQkJCQlyZXR1cm4gd207DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBJTWV0aG9kIGZpbmRNZXRob2QoZmluYWwgSVR5cGUgc2VpVHlwZSwgZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IHNlaVR5cGUuZ2V0TWV0aG9kcygpKSANCi0JCXsNCi0JCQlpZiAod2ViTWV0aG9kLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKSkgew0KLQkJCQlyZXR1cm4gbWV0aG9kOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JDQotDQotCXB1YmxpYyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IGZpbmRKYXZhV2ViU2VydmljZUVsZW1CeUltcGxOYW1lKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIFN0cmluZyBuYW1lKQ0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IGZpbmRXc0J5SW1wbE5hbWUod3NQcm9qZWN0LCBuYW1lKTsNCi0JCXJldHVybiB3cyA9PSBudWxsID8gZmluZFNlaUJ5SW1wbE5hbWUod3NQcm9qZWN0LCBuYW1lKSA6IHdzOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ2FsY3VsYXRlcyB0aGUgbWV0aG9kIHNpZ25hdHVyZSB0byBiZSB1c2VkIGFzIGltcGxlbWVudGF0aW9uIGluIHtAbGluayBJV2ViTWV0aG9kfQ0KLQkgKiBAcGFyYW0gbWV0aG9kDQotCSAqIEByZXR1cm4gY2FsY3VsYXRlZCBzdHJpbmcNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgY2FsY0ltcGxlbWVudGF0aW9uKGZpbmFsIElNZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsJCQ0KLQkJcmV0dXJuIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpICsgbWV0aG9kLmdldFNpZ25hdHVyZSgpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRXh0cmFjdCB7QGxpbmsgSVdlYlNlcnZpY2VQcm9qZWN0fSBvdXQgb2YgRE9NIG9iamVjdCBieSByZWN1cnNpdmVseQ0KLQkgKiBpdGVyYXRpbmcgcGFyZW50IG9iamVjdHMuDQotCSAqIEBwYXJhbSBlT2JqZWN0DQotCSAqIEByZXR1cm4gdGhlIGZvdW5kIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZSBub3QgZm91bmQNCi0JICovDQotCXB1YmxpYyBJV2ViU2VydmljZVByb2plY3QgZmluZFdzUHJvamVjdChFT2JqZWN0IGVPYmplY3QpDQotCXsNCi0JCUVPYmplY3QgcGFyZW50ID0gZU9iamVjdDsNCi0JCXdoaWxlIChwYXJlbnQhPW51bGwpIA0KLQkJew0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpIHsNCi0JCQkJcmV0dXJuIChJV2ViU2VydmljZVByb2plY3QpcGFyZW50Ow0KLQkJCX0NCi0JCQkNCi0JCQlwYXJlbnQgPSBwYXJlbnQuZUNvbnRhaW5lcigpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQkJDQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyBpZiB0aGlzIFNFSSBpcyBwYXJ0IG9mIG91dHNpZGUtaW4gd2ViIHNlcnZpY2UNCi0JICogQHBhcmFtIHNlaQ0KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSB3ZWIgc2VydmljZSB3aXRoIHdzZGxMb2NhdGlvbiBzZXQgdG8gc29tZXRoaW5nIGRpZmZlcmVudCB0aGFuIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc091dHNpZGVJbldlYlNlcnZpY2UoZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpDQotCXsNCi0JCWlmIChzZWkgPT0gbnVsbCkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJZm9yIChJV2ViU2VydmljZSB3ZWJTZXJ2aWNlIDogc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkpIHsNCi0JCQlpZiAod2ViU2VydmljZS5nZXRXc2RsTG9jYXRpb24oKSE9bnVsbCkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBDYWxjdWxhdGVzIHVuaXF1ZSBpbXBsZW1lbnRhdGlvbiBmb3IgRE9NIG9iamVjdCBpbiB0aGUgc2NvcGUgb2YgdGhlIHJlc291cmNlIGluIHdoaWNoDQotCSAqIHRoZXkgZXhpc3QuIFVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IERPTSBvYmplY3QuIA0KLQkgKiANCi0JICogQHBhcmFtIGVPYmplY3QNCi0JICogQHJldHVybiBjYWxjdWxhdGVkIGltcGxlbWVudGF0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNVbmlxdWVJbXBsKGZpbmFsIEVPYmplY3QgZU9iamVjdCkNCi0Jew0KLQkJaWYgKGVPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkgPT0gRG9tUGFja2FnZS5JV0VCX1BBUkFNKSANCi0JCXsNCi0JCQlmaW5hbCBJV2ViUGFyYW0gd3AgPSAoSVdlYlBhcmFtKSBlT2JqZWN0Ow0KLQkJCXJldHVybiAoKElXZWJNZXRob2Qpd3AuZUNvbnRhaW5lcigpKS5nZXRJbXBsZW1lbnRhdGlvbigpICsgIlsiICsgd3AuZ2V0SW1wbGVtZW50YXRpb24oKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCQkNCi0JCXJldHVybiBleHRyYWN0SW1wbGVtZW50YXRpb24oZU9iamVjdCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBFeHRyYWN0cyB0aGUgaW1wbGVtZW50YXRpb24gcHJvcGVydHkgZm9yIERPTSBvYmplY3Qgd2l0aG91dCBjYXN0aW5nIDotRC4NCi0JICoNCi0JICogQHBhcmFtIGVPYmplY3QNCi0JICogQHJldHVybiB0aGUgaW1wbGVtZW50YXRpb24gDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3RJbXBsZW1lbnRhdGlvbihmaW5hbCBFT2JqZWN0IGVPYmplY3QpIHsNCi0JCXJldHVybiBpbXBsU3dpdGNoLmRvU3dpdGNoKGVPYmplY3QpOw0KLQl9DQotCQ0KLQlwcml2YXRlIERvbVN3aXRjaDxTdHJpbmc+IGNyZWF0ZUltcGxGaW5kZXJTd2l0Y2goKQ0KLQl7DQotCQlyZXR1cm4gbmV3IERvbVN3aXRjaDxTdHJpbmc+KCkNCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViU2VydmljZShJV2ViU2VydmljZSB3cykgew0KLQkJCQlyZXR1cm4gd3MuZ2V0SW1wbGVtZW50YXRpb24oKTsNCi0JCQl9DQotCQkJDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIFN0cmluZyBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSkgew0KLQkJCQlyZXR1cm4gc2VpLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlXZWJNZXRob2QoSVdlYk1ldGhvZCB3bSkgew0KLQkJCQlyZXR1cm4gd20uZ2V0SW1wbGVtZW50YXRpb24oKTsNCi0JCQl9CQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlXZWJQYXJhbShJV2ViUGFyYW0gd3ApIHsNCi0JCQkJcmV0dXJuIHdwLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlXZWJTZXJ2aWNlUHJvamVjdChJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KSB7DQotCQkJCXJldHVybiB3c1Byb2plY3QuZ2V0TmFtZSgpOw0KLQkJCX0NCi0JCX07DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9HZW5lcmFsVHlwZXNOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9HZW5lcmFsVHlwZXNOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzRiZGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvR2VuZXJhbFR5cGVzTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lOw0KLQ0KLS8qKg0KLSAqIENsYXNzIGNvbnRhaW5pbmcgY29uc3RhdG5zIHdpdGggbmFtZXMgb2Ygc29tZSBnZW5lcmFsIHR5cGVzIHVzZWQgb2Z0ZW4gaW4gdmFsaWRhdGlvbi4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICogDQotICovDQotDQotcHVibGljIGludGVyZmFjZSBHZW5lcmFsVHlwZXNOYW1lcw0KLXsNCi0JLyoqIGphdmEubGFuZy5PYmplY3QgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9MQU5HX09CSkVDVCA9ICJqYXZhLmxhbmcuT2JqZWN0IjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogamF2YS5pby5TZXJpYWxpemFibGUgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9JT19TRVJJQUxJWkFCTEUgPSAiamF2YS5pby5TZXJpYWxpemFibGUiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiBqYXZhLnJtaS5SZW1vdGUgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9STUlfUkVNT1RFID0gImphdmEucm1pLlJlbW90ZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqIGphdmEubGFuZy5UaHJvd2FibGUgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9MQU5HX1RIUk9XQUJMRSA9ICJqYXZhLmxhbmcuVGhyb3dhYmxlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogamF2YS5sYW5nLkV4Y2VwdGlvbiAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xBTkdfRVhDRVBUSU9OID0gImphdmEubGFuZy5FeGNlcHRpb24iOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiBqYXZhLmxhbmcuQ2xvbmVhYmxlICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTEFOR19DTE9ORUFCTEUgPSAiamF2YS5sYW5nLkNsb25lYWJsZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqIGphdmEubGFuZy5Db21wYXJhYmxlICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTEFOR19DT01QQVJBQkxFID0gImphdmEubGFuZy5Db21wYXJhYmxlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogamF2YS51dGlsLk1hcCAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1VUSUxfTUFQID0gImphdmEudXRpbC5NYXAiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1VUSUxfQ09MTEVDVElPTiA9ICJqYXZhLnV0aWwuQ29sbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lOYW1lZEV4dGVuc2lvbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2U1MDlhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lOYW1lZEV4dGVuc2lvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSByZXByZXNlbnRpZyBhbmQgZXh0ZW50aW9uLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSU5hbWVkRXh0ZW5zaW9uSW5mbw0KLXsNCi0NCi0JLyoqDQotCSAqIFRoZSB1bmlxdWUgSUQgdG8gaWRlbnRpZnkgdGhpcyBjb25zdW1lciB0eXBlIHdoZW4gY2FsbGluZyB0aGUgPGNvZGU+UHJveHlHZW5lcmF0b3JGYWN0b3J5PC9jb2RlPiwgZS5nLiA8Y29kZT5qZWUvamF4d3M8L2NvZGU+DQotCSAqIA0KLQkgKiBAcmV0dXJuIG5vbi1lbXB0eSBzdHJpbmcgY29udGFpbmluZyB0aGUgSUQNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SWQoKTsNCi0NCi0JLyoqDQotCSAqIEEgdmVyYm9zZSBuYW1lIGZvciB0aGUgdHlwZSBvZiBjb25zdW1lciwgZS5nLiA8Y29kZT5KQVgtV1M8L2NvZGU+DQotCSAqIA0KLQkgKiBAcmV0dXJuIGxvY2FsaXplZCBzdHJpbmcgdXNlZCBmb3IgdGhlIFVJDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsNCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Y2JjZDEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5RGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSB0aGF0IHByb3ZpZGVzIGRlZmF1bHQgdmFsdWVzIGZvciBET00gb2JqZWN0J3MgcHJvcGVydGllcy4NCi0gKiBVc3VhbGx5IHRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSB1c2VkIGJ5IGNsaWVudHMgdGhhdCBuZWVkIHRvIHJldmVydCBzb21lDQotICogcHJvcGVydHkgdmFsdWUgdG8gdGhlIGRlZmF1bHQgb25lLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eURlZmF1bHRzIA0KLXsNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgPGNvZGU+ZmVhdHVyZTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gZmVhdHVyZSB0aGUgZmVhdHVyZSByZXByZXNlbnRpbmcgdGhlIG9iamVjdHMgcHJvcGVydHkgdHlwZQ0KLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLiBJbiBjYXNlIDxjb2RlPm51bGw8L2NvZGU+IGlzIHBvc3NpYmxlIHByb3BlcnR5IHZhbHVlDQotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG1pZ2h0IGJlIHJldHVybmVkDQotCSAqLw0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eVN0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eVN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4YzRlOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBjaGVja2luZyB0aGUgc3RhdGUgb2Ygc29tZSBwcm9wZXJ0eSBmb3IgY29uY3JldGUgRE9NIG9iamVjdC4NCi0gKiBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgdXNlZCBieSBET00gY2xpZW50cyB0aGF0IG5lZWQgdG8ga25vdyBpZiBzb21lIHByb3BlcnR5IA0KLSAqIGNhbiBiZSBjaGFuZ2VkIC0gZm9yIGV4YW1wbGUgVUkgZWRpdG9yIHRoYXQgbmVlZHMgdG8ga25vdyBpZiB0aGUgcHJvcGVydHkgc2hvdWxkDQotICogYmUgZW5hYmxlZCBmb3IgZWRpdCBvciBkaXNhYmxlZC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJUHJvcGVydHlTdGF0ZSANCi17DQotCS8qKg0KLQkgKiBEZWZpbmVzIGlmIHByb3BlcnR5IGlzIGNoYW5nZWFibGUuDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSBwcm9wZXJ0eSBjYW4gYmUgY2hhbmdlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNDaGFuZ2VhYmxlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9QcmltaXRpdmVUeXBlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9QcmltaXRpdmVUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTEyN2IyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvUHJpbWl0aXZlVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogVXRpbGl0eSBjbGFzcyB1c2VkIGZvciBzb21lIGdlbmVyYWwgcHJpbWl0aXZlIHR5cGUgY2hlY2tzL29wZXJhdGlvbnMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqIA0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVUeXBlSGFuZGxlcg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSUkFZX01BUksgPSAiW10iOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEID0gInZvaWQiOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJpbWl0aXZlVHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0Jc3RhdGljDQotCXsNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiYm9vbGVhbiIsICJqYXZhLmxhbmcuQm9vbGVhbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiamF2YS5sYW5nLkJvb2xlYW4iLCAiamF2YS5sYW5nLkJvb2xlYW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImJ5dGUiLCAiamF2YS5sYW5nLkJ5dGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5CeXRlIiwgImphdmEubGFuZy5CeXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJjaGFyIiwgImphdmEubGFuZy5DaGFyYWN0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5DaGFyYWN0ZXIiLCAiamF2YS5sYW5nLkNoYXJhY3RlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiZG91YmxlIiwgImphdmEubGFuZy5Eb3VibGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5Eb3VibGUiLCAiamF2YS5sYW5nLkRvdWJsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiZmxvYXQiLCAiamF2YS5sYW5nLkZsb2F0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuRmxvYXQiLCAiamF2YS5sYW5nLkZsb2F0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJpbnQiLCAiamF2YS5sYW5nLkludGVnZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5JbnRlZ2VyIiwgImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuU3RyaW5nIiwgImphdmEubGFuZy5TdHJpbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImxvbmciLCAiamF2YS5sYW5nLkxvbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5Mb25nIiwgImphdmEubGFuZy5Mb25nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJzaG9ydCIsICJqYXZhLmxhbmcuU2hvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5TaG9ydCIsICJqYXZhLmxhbmcuU2hvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG9iamVjdCB0eXBlIGZvciBwcmltaXRpdmUgdHlwZS4gTWFwcGluZyBiZXR3ZWVuIHR5cGVzOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogICZxdW90O2Jvb2xlYW4sICAgICAgICAgICAgICAmcXVvdDtqYXZhLmxhbmcuQm9vbGVhbiZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLkJvb2xlYW4mcXVvdDssICAgJnF1b3Q7amF2YS5sYW5nLkJvb2xlYW4mcXVvdDsNCi0JICogICZxdW90O2J5dGUmcXVvdDssICAgICAgICAgICAgICAgICZxdW90O2phdmEubGFuZy5CeXRlJnF1b3Q7DQotCSAqICAmcXVvdDtqYXZhLmxhbmcuQnl0ZSZxdW90OywgICAgICAmcXVvdDtqYXZhLmxhbmcuQnl0ZSZxdW90Ow0KLQkgKiAgJnF1b3Q7Y2hhciZxdW90OywgICAgICAgICAgICAgICAgJnF1b3Q7amF2YS5sYW5nLkNoYXJhY3RlciZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLkNoYXJhY3RlciZxdW90OywgJnF1b3Q7amF2YS5sYW5nLkNoYXJhY3RlciZxdW90Ow0KLQkgKiAgJnF1b3Q7ZG91YmxlJnF1b3Q7LCAgICAgICAgICAgICAgJnF1b3Q7amF2YS5sYW5nLkRvdWJsZSZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLkRvdWJsZSZxdW90OywgICAgJnF1b3Q7amF2YS5sYW5nLkRvdWJsZSZxdW90Ow0KLQkgKiAgJnF1b3Q7ZmxvYXQmcXVvdDssICAgICAgICAgICAgICAgJnF1b3Q7amF2YS5sYW5nLkZsb2F0JnF1b3Q7DQotCSAqICAmcXVvdDtqYXZhLmxhbmcuRmxvYXQmcXVvdDssICAgICAmcXVvdDtqYXZhLmxhbmcuRmxvYXQmcXVvdDsNCi0JICogICZxdW90O2ludCZxdW90OywgICAgICAgICAgICAgICAgICZxdW90O2phdmEubGFuZy5JbnRlZ2VyJnF1b3Q7DQotCSAqICAmcXVvdDtqYXZhLmxhbmcuSW50ZWdlciZxdW90OywgICAmcXVvdDtqYXZhLmxhbmcuSW50ZWdlciZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLlN0cmluZyZxdW90OywgICAgJnF1b3Q7amF2YS5sYW5nLlN0cmluZyZxdW90Ow0KLQkgKiAgJnF1b3Q7bG9uZyZxdW90OywgICAgICAgICAgICAgICAgJnF1b3Q7amF2YS5sYW5nLkxvbmcmcXVvdDsNCi0JICogICZxdW90O2phdmEubGFuZy5Mb25nJnF1b3Q7LCAgICAgICZxdW90O2phdmEubGFuZy5Mb25nJnF1b3Q7DQotCSAqICAmcXVvdDtzaG9ydCZxdW90OywgICAgICAgICAgICAgICAmcXVvdDtqYXZhLmxhbmcuU2hvcnQmcXVvdDsNCi0JICogICZxdW90O2phdmEubGFuZy5TaG9ydCZxdW90OywgICAgICZxdW90O2phdmEubGFuZy5TaG9ydCZxdW90Ow0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcmV0dXJuIHdyYXBwZXIgY2xhc3MgbmFtZSBmb3IgPHR0PnR5cGVOYW1lPC90dD4uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPYmplY3RUeXBlRm9yUHJpbWl0aXZlVHlwZShTdHJpbmcgdHlwZU5hbWUpDQotCXsNCi0JCXJldHVybiBwcmltaXRpdmVUeXBlcy5nZXQodHlwZU5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHJldHVybiB0cnVlIGlmIDx0dD50eXBlTmFtZTwvdHQ+IGlzIGphdmEgcHJpbWl0aXZlIHR5cGUuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhUHJpbWl0aXZlVHlwZShTdHJpbmcgdHlwZU5hbWUpDQotCXsNCi0JCXJldHVybiAocHJpbWl0aXZlVHlwZXMuZ2V0KHR5cGVOYW1lKSAhPSBudWxsKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHRoZSA8dHQ+dHlwZU5hbWU8L3R0PiByZXByZXNlbnRzIGFuIGFycmF5IHR5cGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHJldHVybiB0cnVlIGlmIDx0dD50eXBlTmFtZTwvdHQ+IGlzIGFycmF5IHR5cGUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FycmF5VHlwZShTdHJpbmcgdHlwZU5hbWUpDQotCXsNCi0JCXJldHVybiB0eXBlTmFtZS50cmltKCkuZW5kc1dpdGgoQVJSQVlfTUFSSyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrcyBpZiA8dHQ+dHlwZU5hbWU8L3R0PiBpcyB2b2lkLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEByZXR1cm4gdHJ1ZSBpZiA8dHQ+dHlwZU5hbWU8L3R0PiBpcyB2b2lkLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVm9pZFR5cGUoU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gdHlwZU5hbWUudHJpbSgpLmVxdWFscyhWT0lEKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIHRoZSByZWFsIHR5cGUgbmFtZSBmcm9tIGFycmF5IHR5cGUuIEV4YW1wbGU6DQotCSAqIA0KLQkgKiA8cHJlPg0KLQkgKiAgIEZvciB0eXBlICdpbnRbXScgcmV0dXJucyAnaW50Jw0KLQkgKiAgIEZvciB0eXBlICdTdHJpbmdbXVtdJyByZXR1cm5zICdTdHJpbmcnDQotCSAqIDwvcHJlPg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEByZXR1cm4gcmVhbCB0eXBlIG5hbWUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVGcm9tQXJyYXlUeXBlKFN0cmluZyB0eXBlTmFtZSkNCi0Jew0KLQkJU3RyaW5nIG5hbWUgPSB0eXBlTmFtZS50cmltKCkucmVwbGFjZUFsbCgiICIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl3aGlsZSAobmFtZS5lbmRzV2l0aChBUlJBWV9NQVJLKSkNCi0JCXsNCi0JCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIEFSUkFZX01BUksubGVuZ3RoKCkpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG5hbWU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9UeXBlUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvVHlwZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyNDE4ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9UeXBlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsNCi0NCi0vKioNCi0gKiBVdGlsaXR5IGNsYXNzIGNvbnRhaW5pbmcgbG9naWMgZm9yIHJlc29sdmluZyB0eXBlIG5hbWVzIGZyb20gSVR5cGUgb2JqZWN0Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgVHlwZVJlc29sdmVyDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UID0gIi4iOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9URSA9ICI/IjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogUmVzb2x2ZXMgPHR0PnR5cGVOYW1lPC90dD4gdXNpbmcgPHR0PnR5cGU8L3R0Pi4gSW4gY2FzZSB3aGVuIDx0dD50eXBlTmFtZTwvdHQ+IGNvbnRhaW5zIGdlbmVyaWNzIGRlY2xhcmF0aW9uIGFsbCB0eXBlcyB1c2VkIGluDQotCSAqIGRlY2xhcmFpb24gYXJlIHJldHVybmVkLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEByZXR1cm4gbGlzdCBvZiByZXNvbHZlZCB0eXBlcw0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcmVzb2x2ZVR5cGVzKFN0cmluZyB0eXBlTmFtZSwgSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSk7DQotCQlTdHJpbmcgcmVhbFR5cGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKHR5cGVOYW1lKTsNCi0NCi0JCWlmIChoYXNHZW5lcmljcyhyZWFsVHlwZU5hbWUpKQ0KLQkJew0KLQkJCW5hbWVzID0gZ2V0VHlwZXNGcm9tR2VuZXJpY3MocmVhbFR5cGVOYW1lLCB0eXBlKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCW5hbWVzLmFkZChyZWFsVHlwZU5hbWUpOw0KLQkJfQ0KLQ0KLQkJTGlzdDxTdHJpbmc+IHJlc29sdmVkTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obmFtZXMuc2l6ZSgpKTsNCi0JCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcykNCi0JCXsNCi0JCQlTdHJpbmcgcmVzb2x2ZWROYW1lID0gcmVzb2x2ZVR5cGUobmFtZSwgdHlwZSk7DQotDQotCQkJaWYgKCFyZXNvbHZlZE5hbWUuZXF1YWxzKFFVT1RFKSkNCi0JCQl7DQotCQkJCXJlc29sdmVkTmFtZXMuYWRkKHJlc29sdmVkTmFtZSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlc29sdmVkTmFtZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyByZWFsIHR5cGUgaW4gY2FzZSB0eXBlIGlzIHByZXNlbnQgYnkgZ2VuZXJpY3MuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHBhcmFtIGRlY2xhcmluZ1R5cGUNCi0JICogQHJldHVybiB0aGUgcmVhbCB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGlmIDx0dD50eXBlTmFtZTwvdHQ+IGlzIGFuIGV4cHJlc3Npb24gb3RoZXJ3aXNlIDx0dD50eXBlTmFtZTwvdHQ+DQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShTdHJpbmcgdHlwZU5hbWUsIElUeXBlIGRlY2xhcmluZ1R5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHR5cGVOYW1lLmluZGV4T2YoJz8nKSA+IC0xKQ0KLQkJew0KLQkJCWludCBwb3MgPSB0eXBlTmFtZS50cmltKCkubGFzdEluZGV4T2YoJyAnKTsNCi0JCQlpZiAocG9zID4gLTEpDQotCQkJew0KLQkJCQlyZXR1cm4gVHlwZVJlc29sdmVyLnJlc29sdmVUeXBlKHR5cGVOYW1lLnN1YnN0cmluZyhwb3MgKyAxKSwgZGVjbGFyaW5nVHlwZSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHR5cGVOYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXRzIHRoZSB0eXBlcyB1c2VkIGluIGdlbmVyaWNzIGRlY2xhcmF0aW9uLg0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgY29udGFpbmluZyByZXNvbHZlZCB0eXBlDQotCSAqIEByZXR1cm4gbGlzdCBvZiB0eXBlIG5hbWVzLg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldFR5cGVzRnJvbUdlbmVyaWNzKFN0cmluZyB0eXBlTmFtZSwgSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgbmFtZSA9IHR5cGVOYW1lOwkJCQ0KLQkJTGlzdDxTdHJpbmc+IG5hbWVzPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0JCQ0KLQkJaW50IGx0UG9zID0gLTE7CQkNCi0JCWludCBndFBvcyA9IC0xOw0KLQkJd2hpbGUgKChsdFBvcyA9IG5hbWUuaW5kZXhPZignPCcpKSA+IC0xKQ0KLQkJewkJCQ0KLQkJCWlmICgoZ3RQb3MgPSBuYW1lLmxhc3RJbmRleE9mKCc+JykpID09IC0xKQ0KLQkJCXsNCi0JCQkJZ3RQb3MgPSBuYW1lLmxlbmd0aCgpLTI7DQotCQkJfQ0KLQkJCQ0KLQkJCVN0cmluZyBmaXJzdE5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBsdFBvcykgKyBuYW1lLnN1YnN0cmluZyhndFBvcysxKTsNCi0JCQluYW1lID0gbmFtZS5zdWJzdHJpbmcobHRQb3MrMSwgZ3RQb3MpOw0KLQkJCQ0KLQkJCWFkZE5hbWUoZmlyc3ROYW1lLCBuYW1lcywgdHlwZSk7DQotCQkJaWYgKG5hbWUuaW5kZXhPZignPCcpID09IC0xKSANCi0JCQl7DQotCQkJCWFkZE5hbWUobmFtZSwgbmFtZXMsIHR5cGUpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG5hbWVzOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGFkZE5hbWUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiBuYW1lcywgZmluYWwgSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpbnQgY29tYVBvcyA9IG5hbWUuaW5kZXhPZignLCcpOw0KLQkJaWYoIGNvbWFQb3MgPiAtMSkNCi0JCXsNCi0JCQluYW1lcy5hZGQobmFtZS5zdWJzdHJpbmcoMCwgY29tYVBvcykpOw0KLQkJCW5hbWVzLmFkZChuYW1lLnN1YnN0cmluZyhjb21hUG9zKzEpKTsNCi0JCX0gDQotCQllbHNlIHsNCi0JCQluYW1lcy5hZGQoZ2V0VHlwZShuYW1lLCB0eXBlKSk7DQotCQl9CQkNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVzb2x2ZXMgdHlwZS4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcGFyYW0gdHlwZQ0KLQkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCB0eXBlIG5hbWUuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlVHlwZShmaW5hbCBTdHJpbmcgdHlwZU5hbWUsIGZpbmFsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIHJlYWxUeXBlTmFtZSA9IHR5cGVOYW1lOw0KLQkJaWYgKFByaW1pdGl2ZVR5cGVIYW5kbGVyLmlzQXJyYXlUeXBlKHR5cGVOYW1lKSkNCi0JCXsNCi0JCQlyZXR1cm4gcmVzb2x2ZVR5cGUoUHJpbWl0aXZlVHlwZUhhbmRsZXIuZ2V0VHlwZUZyb21BcnJheVR5cGUodHlwZU5hbWUpLCB0eXBlKTsNCi0JCX0NCi0NCi0JCWlmIChQcmltaXRpdmVUeXBlSGFuZGxlci5pc0phdmFQcmltaXRpdmVUeXBlKHJlYWxUeXBlTmFtZSkgfHwgUHJpbWl0aXZlVHlwZUhhbmRsZXIuaXNWb2lkVHlwZShyZWFsVHlwZU5hbWUpKQ0KLQkJew0KLQkJCXJldHVybiByZWFsVHlwZU5hbWU7DQotCQl9DQotDQotCQlpZiAocmVhbFR5cGVOYW1lLmluZGV4T2YoRE9UKSA+IC0xKQ0KLQkJew0KLQkJCXJldHVybiByZWFsVHlwZU5hbWU7DQotCQl9DQotDQotCQlTdHJpbmdbXVtdIHN0ID0gdHlwZS5yZXNvbHZlVHlwZShyZWFsVHlwZU5hbWUpOw0KLQkJaWYgKHN0ICE9IG51bGwpDQotCQl7DQotCQkJaWYgKHN0WzBdWzBdLmxlbmd0aCgpID09IDApDQotCQkJew0KLQkJCQlyZXR1cm4gc3RbMF1bMV07DQotCQkJfQ0KLQ0KLQkJCXJldHVybiBzdFswXVswXSArIERPVCArIHN0WzBdWzFdOw0KLQkJfQ0KLQ0KLQkJaWYgKHJlYWxUeXBlTmFtZS5zdGFydHNXaXRoKG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7IFNpZ25hdHVyZS5DX1VOUkVTT0xWRUQgfSkpKQ0KLQkJew0KLQkJCXJldHVybiByZXNvbHZlVHlwZShyZWFsVHlwZU5hbWUuc3Vic3RyaW5nKDEsIHJlYWxUeXBlTmFtZS5sZW5ndGgoKSksIHR5cGUpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlYWxUeXBlTmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIHdoZXRoZXIgPGNvZGU+dHlwZU5hbWU8L2NvZGU+IHVzZXMgZ2VuZXJpY3MgZGVjbGFyYXRpb24uIEV4YW1wbGU6IGZvciAnamF2YS51dGlsLkxpc3Q8U3Rybmc+JyB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHJldHVybiB0cnVlIGlzIDx0dD50eXBlTmFtZTwvdHQ+IGNvbnRhaW5zIGdlbmVyaWNzIGRlY2xhcmF0aW9uLg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNHZW5lcmljcyhTdHJpbmcgdHlwZU5hbWUpDQotCXsNCi0JCXJldHVybiAodHlwZU5hbWUuaW5kZXhPZignPCcpID4gLTEpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvV3NEb21TdGFydHVwUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvV3NEb21TdGFydHVwUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmEyMTAwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL1dzRG9tU3RhcnR1cFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsNCi0NCi0vKioNCi0gKiBTdGFydHVwIHBhcnRpY2lwYW50IHJlZ2lzdGVyZWQgb24gSURFIHN0YXJ0dXAgZXh0ZW5zaW9uIHBvaW50DQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudCBpbXBsZW1lbnRzIElTdGFydHVwIA0KLXsNCi0JDQotCS8qKg0KLQkgKiBDYWxsZWQgYnkgdGhlIEVjbGlwc2Ugb24gd29ya2JlbmNoIHN0YXJ0dXAuDQotCSAqIFN0YXJ0cyBsb2FkIGZvciByZWdpc3RlcmVkIHdlYiBzZXJ2aWNlIHJ1bnRpbWVzIA0KLQkgKi8NCi0gICAgcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkNCi0gICAgew0KLQkJSm9iIGpvYiA9IG5ldyBKb2IoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuV3NEb21TdGFydHVwUGFydGljaXBhbnRfU3RhcnR1cF9Kb2JfTWVzc2FnZSkNCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCXsNCi0JCSAgICAJV3NET01SdW50aW1lTWFuYWdlci5pbnN0YW5jZSgpLmNyZWF0ZURPTVJ1bnRpbWVzKG1vbml0b3IpOw0KLQkJICAgIAlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JCQl9DQotCQl9Ow0KLQkJDQotCQlqb2Iuc2V0VXNlcihmYWxzZSk7DQotCQlqb2Iuc2V0UHJpb3JpdHkoSm9iLkxPTkcpOw0KLQkJam9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7DQotCQlqb2Iuc2NoZWR1bGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhODc2MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5Ow0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuDQotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGludGVyZmFjZSBEb21GYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnkgew0KLQkvKioNCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCURvbUZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tRmFjdG9yeUltcGwuaW5pdCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJRE9NIGNyZWF0ZUlET00oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSUphdmFXZWJTZXJ2aWNlRWxlbWVudCBjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBNZXRob2Q8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJV2ViTWV0aG9kIGNyZWF0ZUlXZWJNZXRob2QoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVdlYlBhcmFtIGNyZWF0ZUlXZWJQYXJhbSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2U8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVdlYlNlcnZpY2UgY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJV2ViU2VydmljZVByb2plY3QgY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgVHlwZTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBUeXBlPC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJV2ViVHlwZSBjcmVhdGVJV2ViVHlwZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5Lg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlEb21QYWNrYWdlIGdldERvbVBhY2thZ2UoKTsNCi0NCi19IC8vRG9tRmFjdG9yeQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDZhYWIwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLg0KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQNCi0gKiA8dWw+DQotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPg0KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+DQotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+DQotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4NCi0gKiA8L3VsPg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5DQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgRG9tUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsNCi0JLyoqDQotCSAqIFRoZSBwYWNrYWdlIG5hbWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTdHJpbmcgZU5BTUUgPSAiZG9tIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2RvbS5lY29yZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCURvbVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwuaW5pdCgpOw0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JRE9NSW1wbCA8ZW0+SURPTTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklET01JbXBsDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SURPTSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJRE9NID0gMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgU2VydmljZSBQcm9qZWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMgPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklET008L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSURPTV9GRUFUVVJFX0NPVU5UID0gMTsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwgPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVCA9IDE7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiA9IDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUgPSAxOw0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMjsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwgPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgPSAyOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRBVElPTiA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUyA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0UgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1Ow0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2Ow0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRkVBVFVSRV9DT1VOVCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsIDxlbT5JV2ViIE1ldGhvZDwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYk1ldGhvZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRCA9IDM7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRF9fSU1QTEVNRU5UQVRJT04gPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0RfX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19QQVJBTUVURVJTID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19FWENMVURFRCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklXZWIgTWV0aG9kPC9lbT4nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1Ow0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsIDxlbT5JV2ViIFBhcmFtPC9lbT59JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlBhcmFtSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJQYXJhbSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNID0gNDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX0lNUExFTUVOVEFUSU9OID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT047DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19LSU5EID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19UWVBFX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX1BBUlRfTkFNRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX0hFQURFUiA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7DQotDQotCS8qKg0KLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBQYXJhbTwvZW0+JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1Ow0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwgPGVtPklXZWIgU2VydmljZTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJTZXJ2aWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRSA9IDU7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfX0lNUExFTUVOVEFUSU9OID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT047DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9fTkFNRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX19QT1JUX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04gPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOw0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklXZWIgU2VydmljZTwvZW0+JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfRkVBVFVSRV9DT1VOVCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlUHJvamVjdEltcGwgPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT59JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VQcm9qZWN0SW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJTZXJ2aWNlUHJvamVjdCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfUFJPSkVDVCA9IDY7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTID0gMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMgPSAxOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRSA9IDI7DQotDQotCS8qKg0KLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX1BST0pFQ1RfRkVBVFVSRV9DT1VOVCA9IDM7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJUeXBlSW1wbCA8ZW0+SVdlYiBUeXBlPC9lbT59JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlR5cGVJbXBsDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYlR5cGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSVdFQl9UWVBFID0gNzsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfVFlQRV9fSU1QTEVNRU5UQVRJT04gPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9UWVBFX19OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRTsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIFR5cGU8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOw0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZCA8ZW0+V2ViIFBhcmFtIEtpbmQ8L2VtPn0nIGVudW0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0V2ViUGFyYW1LaW5kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IFdFQl9QQVJBTV9LSU5EID0gODsNCi0NCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlIDxlbT5TT0FQIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGVudW0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgU09BUF9CSU5ESU5HX1NUWUxFID0gOTsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZSA8ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+fScgZW51bS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nVXNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IFNPQVBfQklORElOR19VU0UgPSAxMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBlbnVtLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSAxMTsNCi0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTSA8ZW0+SURPTTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SURPTSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTSNnZXRXZWJTZXJ2aWNlUHJvamVjdHMgPGVtPldlYiBTZXJ2aWNlIFByb2plY3RzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00jZ2V0V2ViU2VydmljZVByb2plY3RzKCkNCi0JICogQHNlZSAjZ2V0SURPTSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVSZWZlcmVuY2UgZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCA8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQjZ2V0SW1wbGVtZW50YXRpb24gPGVtPkltcGxlbWVudGF0aW9uPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW1wbGVtZW50YXRpb248L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50I2dldEltcGxlbWVudGF0aW9uKCkNCi0JICogQHNlZSAjZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9JbXBsZW1lbnRhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50I2dldE5hbWUoKQ0KLQkgKiBAc2VlICNnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X05hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUNsYXNzIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2lzSW1wbGljaXQgPGVtPkltcGxpY2l0PC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW1wbGljaXQ8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2lzSW1wbGljaXQoKQ0KLQkgKiBAc2VlICNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxpY2l0KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzIDxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpDQotCSAqIEBzZWUgI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGVtZW50aW5nV2ViU2VydmljZXMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0V2ViTWV0aG9kcyA8ZW0+V2ViIE1ldGhvZHM8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldlYiBNZXRob2RzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRXZWJNZXRob2RzKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVSZWZlcmVuY2UgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9XZWJNZXRob2RzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAc2VlICNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1RhcmdldE5hbWVzcGFjZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFNvYXBCaW5kaW5nVXNlKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAc2VlICNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCA8ZW0+SVdlYiBNZXRob2Q8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVdlYiBNZXRob2Q8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJV2ViTWV0aG9kKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFBhcmFtZXRlcnMgPGVtPlBhcmFtZXRlcnM8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBhcmFtZXRlcnM8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFBhcmFtZXRlcnMoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRVJlZmVyZW5jZSBnZXRJV2ViTWV0aG9kX1BhcmFtZXRlcnMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2lzRXhjbHVkZWQgPGVtPkV4Y2x1ZGVkPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZWQ8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2lzRXhjbHVkZWQoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX0V4Y2x1ZGVkKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nVXNlIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBzZWUgI2dldElXZWJNZXRob2QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0gPGVtPklXZWIgUGFyYW08L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SVdlYlBhcmFtKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LaW5kPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldEtpbmQoKQ0KLQkgKiBAc2VlICNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJQYXJhbV9LaW5kKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldFR5cGVOYW1lIDxlbT5UeXBlIE5hbWU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlIE5hbWU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0VHlwZU5hbWUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJQYXJhbV9UeXBlTmFtZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRQYXJ0TmFtZSA8ZW0+UGFydCBOYW1lPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFydCBOYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldFBhcnROYW1lKCkNCi0JICogQHNlZSAjZ2V0SVdlYlBhcmFtKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fUGFydE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAc2VlICNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJQYXJhbV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jaXNIZWFkZXIgPGVtPkhlYWRlcjwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhlYWRlcjwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNpc0hlYWRlcigpDQotCSAqIEBzZWUgI2dldElXZWJQYXJhbSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX0hlYWRlcigpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSA8ZW0+SVdlYiBTZXJ2aWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJV2ViU2VydmljZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFNlcnZpY2VFbmRwb2ludCA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRTZXJ2aWNlRW5kcG9pbnQoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVSZWZlcmVuY2UgZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBzZWUgI2dldElXZWJTZXJ2aWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9ydCBOYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0UG9ydE5hbWUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYlNlcnZpY2VfUG9ydE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRXc2RsTG9jYXRpb24gPGVtPldzZGwgTG9jYXRpb248L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIExvY2F0aW9uPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0V3NkbExvY2F0aW9uKCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QgPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJV2ViU2VydmljZVByb2plY3QoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCNnZXRXZWJTZXJ2aWNlcyA8ZW0+V2ViIFNlcnZpY2VzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XZWIgU2VydmljZXM8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QjZ2V0V2ViU2VydmljZXMoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZVByb2plY3QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9XZWJTZXJ2aWNlcygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlczwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZVByb2plY3QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldE5hbWUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZVByb2plY3QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9OYW1lKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlIDxlbT5JV2ViIFR5cGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVdlYiBUeXBlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGUNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUNsYXNzIGdldElXZWJUeXBlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kIDxlbT5XZWIgUGFyYW0gS2luZDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPldlYiBQYXJhbSBLaW5kPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVFbnVtIGdldFdlYlBhcmFtS2luZCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUgPGVtPlNPQVAgQmluZGluZyBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlNPQVAgQmluZGluZyBTdHlsZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUVudW0gZ2V0U09BUEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlIDxlbT5TT0FQIEJpbmRpbmcgVXNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVFbnVtIGdldFNPQVBCaW5kaW5nVXNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVFbnVtIGdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCURvbUZhY3RvcnkgZ2V0RG9tRmFjdG9yeSgpOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudA0KLQkgKiA8dWw+DQotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4NCi0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4NCi0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+DQotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+DQotCSAqIDwvdWw+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgew0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSURPTUltcGwgPGVtPklET008L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JRE9NSW1wbA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJRE9NKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElET00gPSBlSU5TVEFOQ0UuZ2V0SURPTSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVSZWZlcmVuY2UgSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMgPSBlSU5TVEFOQ0UuZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIDxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiA9IGVJTlNUQU5DRS5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X0ltcGxlbWVudGF0aW9uKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FID0gZUlOU1RBTkNFLmdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfTmFtZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwgPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgY2xhc3MuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQ2xhc3MgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGljaXQoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGluZyBXZWIgU2VydmljZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVSZWZlcmVuY2UgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGVtZW50aW5nV2ViU2VydmljZXMoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMgPSBlSU5TVEFOQ0UuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9XZWJNZXRob2RzKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0UgPSBlSU5TVEFOQ0UuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwgPGVtPklXZWIgTWV0aG9kPC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYk1ldGhvZCgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJV0VCX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElXRUJfTUVUSE9EX19QQVJBTUVURVJTID0gZUlOU1RBTkNFLmdldElXZWJNZXRob2RfUGFyYW1ldGVycygpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfTUVUSE9EX19FWENMVURFRCA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kX0V4Y2x1ZGVkKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwgPGVtPklXZWIgUGFyYW08L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJQYXJhbSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJV0VCX1BBUkFNID0gZUlOU1RBTkNFLmdldElXZWJQYXJhbSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9QQVJBTV9fS0lORCA9IGVJTlNUQU5DRS5nZXRJV2ViUGFyYW1fS2luZCgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1BBUkFNX19UWVBFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX1R5cGVOYW1lKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfUEFSQU1fX1BBUlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRJV2ViUGFyYW1fUGFydE5hbWUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1BBUkFNX19IRUFERVIgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX0hlYWRlcigpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsIDxlbT5JV2ViIFNlcnZpY2U8L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYlNlcnZpY2UoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQ2xhc3MgSVdFQl9TRVJWSUNFID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRVJlZmVyZW5jZSBJV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50KCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VfVGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfU0VSVklDRV9fUE9SVF9OQU1FID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlX1BvcnROYW1lKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VfV3NkbExvY2F0aW9uKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsIDxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+fScgY2xhc3MuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlUHJvamVjdEltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElXRUJfU0VSVklDRV9QUk9KRUNUID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlUHJvamVjdCgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1dlYlNlcnZpY2VzKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVSZWZlcmVuY2UgSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUyA9IGVJTlNUQU5DRS5nZXRJV2ViU2VydmljZVByb2plY3RfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X05hbWUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJUeXBlSW1wbCA8ZW0+SVdlYiBUeXBlPC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlR5cGVJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJUeXBlKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElXRUJfVFlQRSA9IGVJTlNUQU5DRS5nZXRJV2ViVHlwZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQgPGVtPldlYiBQYXJhbSBLaW5kPC9lbT59JyBlbnVtLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRXZWJQYXJhbUtpbmQoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFRW51bSBXRUJfUEFSQU1fS0lORCA9IGVJTlNUQU5DRS5nZXRXZWJQYXJhbUtpbmQoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZSA8ZW0+U09BUCBCaW5kaW5nIFN0eWxlPC9lbT59JyBlbnVtLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0U09BUEJpbmRpbmdTdHlsZSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVFbnVtIFNPQVBfQklORElOR19TVFlMRSA9IGVJTlNUQU5DRS5nZXRTT0FQQmluZGluZ1N0eWxlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlIDxlbT5TT0FQIEJpbmRpbmcgVXNlPC9lbT59JyBlbnVtLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nVXNlKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUVudW0gU09BUF9CSU5ESU5HX1VTRSA9IGVJTlNUQU5DRS5nZXRTT0FQQmluZGluZ1VzZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBlbnVtLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVFbnVtIFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQ0KLQl9DQotDQotfSAvL0RvbVBhY2thZ2UNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5NGE4OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SURPTTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICoNCi0gKiA8cD4NCi0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00jZ2V0V2ViU2VydmljZVByb2plY3RzIDxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJRE9NKCkNCi0gKiBAbW9kZWwNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGludGVyZmFjZSBJRE9NIGV4dGVuZHMgRU9iamVjdCB7DQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWIgU2VydmljZSBQcm9qZWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKQ0KLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFTGlzdDxJV2ViU2VydmljZVByb2plY3Q+IGdldFdlYlNlcnZpY2VQcm9qZWN0cygpOw0KLQ0KLX0gLy8gSURPTQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjEyMDBmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqICAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhV2ViU2VydmljZUVsZW1lbnQgZXh0ZW5kcyBFT2JqZWN0DQotew0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjZ2V0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1ODlkMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLQ0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50DQotew0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdCgpOw0KLQ0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgY29udGFpbm1lbnQ9ImZhbHNlIiBtYW55PSJ0cnVlIiB0eXBlPSJJV2ViU2VydmljZSIgb3Bwb3NpdGU9InNlcnZpY2VFbmRwb2ludCINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElXZWJTZXJ2aWNlPiBnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpOw0KLQkNCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiBtYW55PSJ0cnVlIiB0eXBlPSJJV2ViTWV0aG9kIg0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYk1ldGhvZD4gZ2V0V2ViTWV0aG9kcygpOw0KLQkNCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iRE9DVU1FTlQiPC9jb2RlPi4NCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQHNlZSAjc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAbW9kZWwgZGVmYXVsdD0iRE9DVU1FTlQiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1N0eWxlIGdldFNvYXBCaW5kaW5nU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlDQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJMSVRFUkFMIjwvY29kZT4uDQotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2V9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlICNzZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZSkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJMSVRFUkFMIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU09BUEJpbmRpbmdVc2UgZ2V0U29hcEJpbmRpbmdVc2UoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UgdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iV1JBUFBFRCI8L2NvZGU+Lg0KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGV9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCSAqIEBzZWUgI3NldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQG1vZGVsIGRlZmF1bHQ9IldSQVBQRUQiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIHZhbHVlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMzljYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLQ0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSVdTRE9NUnVudGltZU1hbmFnZXINCi17DQotCS8qKg0KLQkgKiBJbnN0YW50aWF0ZXMgdGhlIERPTSBSdW50aW1lcyBpZiBub3QgYWxyZWFkeS4NCi0JICogQHBhcmFtIHByb2dyZXNzIG1vbml0b3IgdG8gdHJhY2sgcHJvZ3Jlc3MgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjcmVhdGVET01SdW50aW1lcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOw0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJ1bnRpbWUgaWQNCi0JICogYW5kIGluc3RhbnRpYXRlIHN1Y2ggRE9NIHJ1bnRpbWUgaW5zdGFuY2UgaWYgbm9uIGV4aXN0ZW50IGF0IHRoZSANCi0JICogbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuDQotCSAqIA0KLQkgKiBAcGFyYW0gcnVudGltZUlkIC0gc3RyaW5nIGlkZW50aWZpZXIgb2YgdGhlIHJ1bnRpbWUgDQotCSAqIEByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlLiBOdWxsIGlmIHJ1bnRpbWUgd2l0aCBzdWNoIGlkIGlzIG5vdCByZWdpc3RlcmVkDQotCSAqLw0KLQlwdWJsaWMgIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZ2V0RE9NUnVudGltZShTdHJpbmcgcnVudGltZUlkKTsNCi0JDQotCS8qKg0KLQkgKiANCi0JICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIERPTSBSdW50aW1lcyBjdXJyZW50bHkgaW5zdGFudGlhdGVkDQotCSAqLw0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJV3NET01SdW50aW1lRXh0ZW5zaW9uPiBnZXRET01SdW50aW1lcygpOw0KLQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJlbG9hZCBhbGwgaW5zdGFuY2VzIG9mIERPTSBSdW50aW1lcy4NCi0JICoNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbG9hZERPTVJ1bnRpbWVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDcwZDM4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotDQotDQotLyoqDQotICogQG1vZGVsDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJNZXRob2QgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50DQotew0KLQkvKioNCi0JICogQG1vZGVsIHR5cGU9IklXZWJQYXJhbSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIG1hbnk9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JRUxpc3Q8SVdlYlBhcmFtPiBnZXRQYXJhbWV0ZXJzKCk7DQotCQ0KLQkvKioNCi0JICogQG1vZGVsIHR5cGU9ImJvb2xlYW4iIG1hbnk9ImZhbHNlIiBjaGFuZ2VhYmxlPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICovDQotCWJvb2xlYW4gaXNFeGNsdWRlZCgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2lzRXhjbHVkZWQgPGVtPkV4Y2x1ZGVkPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlZDwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2lzRXhjbHVkZWQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldEV4Y2x1ZGVkKGJvb2xlYW4gdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJET0NVTUVOVCI8L2NvZGU+Lg0KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGV9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZQ0KLQkgKiBAc2VlICNzZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElXZWJNZXRob2RfU29hcEJpbmRpbmdTdHlsZSgpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJET0NVTUVOVCIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVNPQVBCaW5kaW5nU3R5bGUgZ2V0U29hcEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nU3R5bGUgPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkxJVEVSQUwiPC9jb2RlPi4NCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlDQotCSAqIEBzZWUgI3NldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlKCkNCi0JICogQG1vZGVsIGRlZmF1bHQ9IkxJVEVSQUwiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1VzZSBnZXRTb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nVXNlIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlDQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nVXNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZSB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJXUkFQUEVEIjwvY29kZT4uDQotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JICogQHNlZSAjc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAbW9kZWwgZGVmYXVsdD0iV1JBUFBFRCIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZQ0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgdmFsdWUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzY5NmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi0NCi0vKioNCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICogQG1vZGVsDQotICovDQotcHVibGljIGludGVyZmFjZSBJV2ViUGFyYW0gZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50DQotew0KLQkvKioNCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBtYW55PSJmYWxzZSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiDQotCSAqIEByZXR1cm4NCi0JICovDQotCVN0cmluZyBnZXRUeXBlTmFtZSgpOw0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNzZXRQYXJ0TmFtZShTdHJpbmcpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElXZWJQYXJhbV9QYXJ0TmFtZSgpDQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU3RyaW5nIGdldFBhcnROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRQYXJ0TmFtZSA8ZW0+UGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRQYXJ0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0UGFydE5hbWUoU3RyaW5nIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViUGFyYW1fVGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGVhZGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IZWFkZXI8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNzZXRIZWFkZXIoYm9vbGVhbikNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVdlYlBhcmFtX0hlYWRlcigpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWJvb2xlYW4gaXNIZWFkZXIoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2lzSGVhZGVyIDxlbT5IZWFkZXI8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhlYWRlcjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2lzSGVhZGVyKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRIZWFkZXIoYm9vbGVhbiB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBAbW9kZWwgdHlwZT0iV2ViUGFyYW1LaW5kIiByZXF1aXJlZD0idHJ1ZSIgbWFueT0iZmFsc2UiDQotCSAqLw0KLQlXZWJQYXJhbUtpbmQgZ2V0S2luZCgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQNCi0JICogQHNlZSAjZ2V0S2luZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0S2luZChXZWJQYXJhbUtpbmQgdmFsdWUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjAxMWZlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudCANCi17DQotCS8qKg0KLQkgKiBAbW9kZWwgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIG9wcG9zaXRlPSJpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyIgdHlwZT0iSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQ0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKTsNCi0JDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBAbW9kZWwgY2hhbmdlYWJsZT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCk7DQotCQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSINCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbExvY2F0aW9uKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFdzZGxMb2NhdGlvbiA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2dldFdzZGxMb2NhdGlvbigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0V3NkbExvY2F0aW9uKFN0cmluZyB2YWx1ZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0MWQ1ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotDQotDQotLyoqDQotICogQG1vZGVsDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlUHJvamVjdCBleHRlbmRzIEVPYmplY3QNCi17DQotCS8qKg0KLQkgKiBAbW9kZWwgdHlwZT0iSVdlYlNlcnZpY2UiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiBtYW55PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElXZWJTZXJ2aWNlPiBnZXRXZWJTZXJ2aWNlcygpOw0KLQkNCi0JDQotCS8qKg0KLQkgKiBAbW9kZWwgdHlwZT0iSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIG1hbnk9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIg0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTsNCi0JDQotCS8qKg0KLQkgKiBAbW9kZWwgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MzRkYTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotDQotLyoqDQotICogQG1vZGVsDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJUeXBlICBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnQgew0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMmI4MDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotDQotDQotLyoqDQotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGFsbCBydW50aW1lIHdoaWNoIHdhbnQgdG8gaGF2ZSBET00gVHJlZSANCi0gKiByZXByZXNlbnRhdGlvbiBvbiB0b3Agb2YgdGhlbS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBIcmlzdG92IEkwMzYyMDENCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gDQotew0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGluc3RhbnRpYXRlIHRoZSBET00gaW5zdGFuY2UgZm9yIHRoZSBydW50aW1lIGFuZCBsb2FkcyB0aGUNCi0JICogZGF0YSBpbnRvIGl0LiBUaGUgbWV0aG9kIGxvY2tzIHRoZSB3b3Jrc3BhY2Ugcm9vdCBkdXJpbmcgZXhlY3V0aW9uLiBJZiB5b3UgY2FsbCB0aGlzDQotCSAqIG1ldGhvZCBkdXJpbmcgbG9hZGluZyAoaS5lLiBzb21lYm9keSBhbHJlYWR5IGNhbGxlZCBpdCBpbiBkaWZmZXJlbnQgdGhyZWFkKSB0aGUgbWV0aG9kIA0KLQkgKiB3aWxsIGJsb2NrIHVudGlsIHRoZSBsb2FkIGZpbmlzaGVzIGluc3RlYWQgb2YgdHJpZ2dlcmluZyBET00gcmVsb2FkLiANCi0JICogDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZCBkdXJpbmcgbG9hZGluZywgY2FuY2VsbGluZyB0aGUgbG9hZCB2aWEgbW9uaXRvciBpcyBzdXBwb3J0ZWQNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpbiBjYXNlIHRoZSBET00gbG9hZGluZyBpcyBub3QgYWJsZSB0byByZWFkIHJlcXVpcmVkIGRhdGENCi0JICogQHRocm93cyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBsb2FkaW5nIHdhcyBjYW5jZWxsZWQgdmlhIHByb3ZpZGVkIA0KLQkgKiA8Y29kZT5tb25pdG9yPC9jb2RlPi4NCi0JICovDQotCXB1YmxpYyB2b2lkIGNyZWF0ZURPTShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotCQ0KLQkvKioNCi0JICogQWRkcyBhIGxvYWQgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgaW4gbG9hZCBldmVudHMuIEluIGNhc2UgdGhlIGxvYWRpbmcgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkIA0KLQkgKiB0aGlzIGxpc3RlbmVyJ3MgbWV0aG9kcyBhcmUgY2FsbGVkIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbG9hZC4NCi0JICoge0BsaW5rIElXc0RvbUxvYWRMaXN0ZW5lciNmaW5pc2hlZCgpfSBtZXRob2QgaXMgY2FsbGVkIGluIGFueSBjYXNlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBsb2FkaW5nDQotCSAqIGhhcyBiZWVuIGNhbmNlbGxlZCBvciBub3QuIA0KLQkgKiBAcGFyYW0gbGlzdGVuZXINCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZExvYWRMaXN0ZW5lcihJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIpOw0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gRE9NIGxvYWRpbmcgbGlzdGVuZXJzIGxpc3QNCi0JICogDQotCSAqIEBwYXJhbSBsaXN0ZW5lcg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9hZExpc3RlbmVyKElXc0RvbUxvYWRMaXN0ZW5lciBsaXN0ZW5lcik7DQotCQ0KLQkvKioNCi0JICogVG8gZ2V0IGEgaGFuZGxlIHRvIHRoZSBET00gaW5zdGFuY2UgYXZhaWxhYmxlIGZvciB0aGlzIHJ1bnRpbWUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBET00gaW5zdGFuY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZSB0aGUgbG9hZGluZyB3YXMgbm90IHN0YXJ0ZWQgeWV0IG9yDQotCSAqIGlzIG5vdCBmaW5pc2hlZCB5ZXQuDQotCSAqIEB0aHJvd3MgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gaW4gY2FzZSBsb2FkaW5nIGhhcyBiZWVuIGNhbGxlZCBhbHJlYWR5IGJ1dCB0aGUgbG9hZA0KLQkgKiBoYXMgYmVlbiBjYW5jZWxsZWQNCi0JICovDQotCXB1YmxpYyBJRE9NIGdldERPTSgpIHRocm93cyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODc5YjA0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi0NCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgaW50ZXJlc3RlZCBpbiBET00gbG9hZCBwcm9jZXNzLiBJbXBsZW1lbnRvcnMgY2FuIGJlIGFkZGVkIHRvDQotICogdGhlIHtAbGluayBJV3NET01SdW50aW1lRXh0ZW5zaW9ufSB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgb24gbG9hZCBzdGFydHVwL2ZpbmlzaCAgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVdzRG9tTG9hZExpc3RlbmVyIA0KLXsNCi0JLyoqDQotCSAqIENhbGxlZCBieSB7QGxpbmsgSVdzRE9NUnVudGltZUV4dGVuc2lvbn0ganVzdCBiZWZvcmUgdGhlIERPTSBsb2FkIHN0YXJ0IA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnRlZCgpOw0KLQkNCi0JLyoqDQotCSAqIENhbGxlZCBieSB7QGxpbmsgSVdzRE9NUnVudGltZUV4dGVuc2lvbn0gd2hlbiB0aGUgRE9NIGxvYWQgaGFzIGZpbmlzaGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpOwkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTY4NTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicsDQotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotICogQG1vZGVsDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBlbnVtIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsNCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPldSQVBQRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjV1JBUFBFRF9WQUxVRQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlXUkFQUEVEKDAsICJXUkFQUEVEIiwgIldSQVBQRUQiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5CQVJFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0JBUkVfVkFMVUUNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JQkFSRSgxLCAiQkFSRSIsICJCQVJFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+V1JBUFBFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+V1JBUFBFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjV1JBUFBFRA0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JBUFBFRF9WQUxVRSA9IDA7DQotDQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5CQVJFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CQVJFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNCQVJFDQotCSAqIEBtb2RlbA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVJFX1ZBTFVFID0gMTsNCi0NCi0JLyoqDQotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVbXSBWQUxVRVNfQVJSQVkgPQ0KLQkJbmV3IFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVbXQ0KLQkJew0KLQkJCVdSQVBQRUQsDQotCQkJQkFSRSwNCi0JCX07DQotDQotCS8qKg0KLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGdldChTdHJpbmcgbGl0ZXJhbCkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQ0KLQkJew0KLQkJCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBnZXQoaW50IHZhbHVlKSB7DQotCQlzd2l0Y2ggKHZhbHVlKQ0KLQkJew0KLQkJCWNhc2UgV1JBUFBFRF9WQUxVRTogcmV0dXJuIFdSQVBQRUQ7DQotCQkJY2FzZSBCQVJFX1ZBTFVFOiByZXR1cm4gQkFSRTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOw0KLQ0KLQkvKioNCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCQl0aGlzLm5hbWUgPSBuYW1lOw0KLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7DQotCSAgcmV0dXJuIHZhbHVlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkgIHJldHVybiBuYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgew0KLQkgIHJldHVybiBsaXRlcmFsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlyZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQkNCi19IC8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA4MjI1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlNPQVAgQmluZGluZyBTdHlsZTwvYj48L2VtPicsDQotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0U09BUEJpbmRpbmdTdHlsZSgpDQotICogQG1vZGVsDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBlbnVtIFNPQVBCaW5kaW5nU3R5bGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsNCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPkRPQ1VNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0RPQ1VNRU5UX1ZBTFVFDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCURPQ1VNRU5UKDAsICJET0NVTUVOVCIsICJET0NVTUVOVCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPlJQQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNSUENfVkFMVUUNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JUlBDKDEsICJSUEMiLCAiUlBDIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+RE9DVU1FTlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRPQ1VNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNET0NVTUVOVA0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9DVU1FTlRfVkFMVUUgPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+UlBDPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SUEM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI1JQQw0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlBDX1ZBTFVFID0gMTsNCi0NCi0JLyoqDQotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdTdHlsZVtdIFZBTFVFU19BUlJBWSA9DQotCQluZXcgU09BUEJpbmRpbmdTdHlsZVtdDQotCQl7DQotCQkJRE9DVU1FTlQsDQotCQkJUlBDLA0KLQkJfTsNCi0NCi0JLyoqDQotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFNPQVBCaW5kaW5nU3R5bGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1N0eWxlIGdldChTdHJpbmcgbGl0ZXJhbCkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdTdHlsZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1N0eWxlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdTdHlsZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFNPQVBCaW5kaW5nU3R5bGUgZ2V0KGludCB2YWx1ZSkgew0KLQkJc3dpdGNoICh2YWx1ZSkNCi0JCXsNCi0JCQljYXNlIERPQ1VNRU5UX1ZBTFVFOiByZXR1cm4gRE9DVU1FTlQ7DQotCQkJY2FzZSBSUENfVkFMVUU6IHJldHVybiBSUEM7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsNCi0NCi0JLyoqDQotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgU09BUEJpbmRpbmdTdHlsZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQkJdGhpcy5uYW1lID0gbmFtZTsNCi0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgew0KLQkgIHJldHVybiB2YWx1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JICByZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsNCi0JICByZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0JDQotfSAvL1NPQVBCaW5kaW5nU3R5bGUNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjM1YjE4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7DQotDQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TT0FQIEJpbmRpbmcgVXNlPC9iPjwvZW0+JywNCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRTT0FQQmluZGluZ1VzZSgpDQotICogQG1vZGVsDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBlbnVtIFNPQVBCaW5kaW5nVXNlIGltcGxlbWVudHMgRW51bWVyYXRvciB7DQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5MSVRFUkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0xJVEVSQUxfVkFMVUUNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JTElURVJBTCgwLCAiTElURVJBTCIsICJMSVRFUkFMIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+RU5DT0RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNFTkNPREVEX1ZBTFVFDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCUVOQ09ERUQoMSwgIkVOQ09ERUQiLCAiRU5DT0RFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPkxJVEVSQUw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxJVEVSQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0xJVEVSQUwNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJVEVSQUxfVkFMVUUgPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+RU5DT0RFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RU5DT0RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjRU5DT0RFRA0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RFRF9WQUxVRSA9IDE7DQotDQotCS8qKg0KLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1VzZVtdIFZBTFVFU19BUlJBWSA9DQotCQluZXcgU09BUEJpbmRpbmdVc2VbXQ0KLQkJew0KLQkJCUxJVEVSQUwsDQotCQkJRU5DT0RFRCwNCi0JCX07DQotDQotCS8qKg0KLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8U09BUEJpbmRpbmdVc2U+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdVc2UgZ2V0KFN0cmluZyBsaXRlcmFsKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlTT0FQQmluZGluZ1VzZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdVc2UgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlTT0FQQmluZGluZ1VzZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1VzZSBnZXQoaW50IHZhbHVlKSB7DQotCQlzd2l0Y2ggKHZhbHVlKQ0KLQkJew0KLQkJCWNhc2UgTElURVJBTF9WQUxVRTogcmV0dXJuIExJVEVSQUw7DQotCQkJY2FzZSBFTkNPREVEX1ZBTFVFOiByZXR1cm4gRU5DT0RFRDsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOw0KLQ0KLQkvKioNCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBTT0FQQmluZGluZ1VzZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQkJdGhpcy5uYW1lID0gbmFtZTsNCi0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgew0KLQkgIHJldHVybiB2YWx1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JICByZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsNCi0JICByZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0JDQotfSAvL1NPQVBCaW5kaW5nVXNlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDkyNjQzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgZW51bSBXZWJQYXJhbUtpbmQgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsvKipAbW9kZWwqL0lOKDAsICJJTiIsICJJTiIpLCAvKipAbW9kZWwqL0lOT1VUKDEsICJJTk9VVCIsICJJTk9VVCIpLCAvKipAbW9kZWwqL09VVCgyLCAiT1VUIiwgIk9VVCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JA0KLQ0KLS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0lODQotCSAqIEBtb2RlbA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9WQUxVRSA9IDA7DQotLyoqDQotCSAqIFRoZSAnPGVtPjxiPklOT1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjSU5PVVQNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOT1VUX1ZBTFVFID0gMTsNCi0vKioNCi0JICogVGhlICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI09VVA0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUX1ZBTFVFID0gMjsNCi0vKioNCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFdlYlBhcmFtS2luZFtdIFZBTFVFU19BUlJBWSA9DQotCQluZXcgV2ViUGFyYW1LaW5kW10NCi0JCXsNCi0JCQlJTiwNCi0JCQlJTk9VVCwNCi0JCQlPVVQsDQotCQl9Ow0KLS8qKg0KLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFdlYlBhcmFtS2luZD4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOw0KLQ0KLS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBXZWJQYXJhbUtpbmQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlXZWJQYXJhbUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpDQotCQkJew0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFdlYlBhcmFtS2luZCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQ0KLQkJew0KLQkJCVdlYlBhcmFtS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBXZWJQYXJhbUtpbmQgZ2V0KGludCB2YWx1ZSkgew0KLQkJc3dpdGNoICh2YWx1ZSkNCi0JCXsNCi0JCQljYXNlIElOX1ZBTFVFOiByZXR1cm4gSU47DQotCQkJY2FzZSBJTk9VVF9WQUxVRTogcmV0dXJuIElOT1VUOw0KLQkJCWNhc2UgT1VUX1ZBTFVFOiByZXR1cm4gT1VUOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOw0KLS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7DQotDQotLyoqDQotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgV2ViUGFyYW1LaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCQl0aGlzLm5hbWUgPSBuYW1lOw0KLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRWYWx1ZSgpIHsNCi0JICByZXR1cm4gdmFsdWU7DQotCX0NCi0NCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JICByZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgew0KLQkgIHJldHVybiBsaXRlcmFsOw0KLQl9DQotDQotLyoqDQotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiBsaXRlcmFsOw0KLQl9fQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzEwNDdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotDQotDQotLyoqDQotICogRXhjZXB0aW9uIHRocm93biBpbiBjYXNlIHRoZSBsb2FkaW5nIG9mIFdTIERPTSBoYXMgYmVlbiBjYW5jZWxsZWQNCi0gKiAgDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiANCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0cyBleGNlcHRpb24gd2l0aCBhYmlsaXR5IHRvIHByb3ZpZGUgbG9jYWxpemVkIG1lc3NhZ2UNCi0JICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgZGV0YWlsIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwNCi0gICAgICogICAgICAgICBieSB0aGUge0BsaW5rICNnZXRNZXNzYWdlKCl9IG1ldGhvZCkNCi0JICogQHBhcmFtIGxvY2FsaXplZE1lc3NhZ2UgLSB0aGUgbG9jYWxpemVkIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwNCi0gICAgICogICAgICAgICBieSB0aGUge0BsaW5rICNnZXRMb2NhbGl6ZWRNZXNzYWdlKCl9IG1ldGhvZCkNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIC0gaW4gY2FzZSBsb2NhbGlzZWQgbWVzc2FnZSBpcyBudWxsDQotCSAqICovDQotCXB1YmxpYyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UpIHsNCi0JCXN1cGVyKG1lc3NhZ2UpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGxvY2FsaXplZE1lc3NhZ2UsICJsb2NhbGl6ZWRNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQNCi0JCXRoaXMubG9jYWxpemVkTWVzc2FnZSA9IGxvY2FsaXplZE1lc3NhZ2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIGxvY2FsaXplZCBtZXNzYWdlIHdpdGggd2hpY2ggdGhlIGV4Y2VwdGlvbiB3YXMgY29uc3RydWN0ZWQuKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsNCi0JCXJldHVybiBsb2NhbGl6ZWRNZXNzYWdlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZkNGE2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkuSVdzRE9NUnVudGltZUluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5Xc0RPTVJ1bnRpbWVSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgY2xhc3MgZm9yIGluc3RhbnRpYXRpbmcgRE9NIFJ1bnRpbWVzIGFuZCBtYW5hZ2luZyB0aG9zZSBpbnN0YW5jZXMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgSHJpc3Rvdg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFdzRE9NUnVudGltZU1hbmFnZXIgaW1wbGVtZW50cyBJV1NET01SdW50aW1lTWFuYWdlcg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgV3NET01SdW50aW1lTWFuYWdlciBpbnN0YW5jZSA9IG5ldyBXc0RPTVJ1bnRpbWVNYW5hZ2VyKCk7DQotDQotCXByaXZhdGUgTWFwPFN0cmluZyxJV3NET01SdW50aW1lRXh0ZW5zaW9uPiBkb21SdW50aW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJV3NET01SdW50aW1lRXh0ZW5zaW9uPigpOw0KLQ0KLQlwcm90ZWN0ZWQgV3NET01SdW50aW1lTWFuYWdlcigpDQotCXsNCi0JCS8vIHNpbmdsZXRvbg0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIElXU0RPTVJ1bnRpbWVNYW5hZ2VyIGluc3RhbmNlKCkNCi0Jew0KLQkJcmV0dXJuIGluc3RhbmNlOw0KLQl9CQ0KLQkNCi0JLyoqDQotCSAqIEluc3RhbnRpYXRlcyB0aGUgRE9NIFJ1bnRpbWVzIGlmIG5vdCBhbHJlYWR5Lg0KLQkgKg0KLQkgKi8NCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNyZWF0ZURPTVJ1bnRpbWVzKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0Jew0KLQkJZm9yIChJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbyA6IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKSkgew0KLQkJCWNyZWF0ZURPTVJ1bnRpbWUocnVudGltZUluZm8sIG1vbml0b3IpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBjcmVhdGVET01SdW50aW1lKGZpbmFsIElXc0RPTVJ1bnRpbWVJbmZvIHJ1bnRpbWVJbmZvLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCXsNCi0JCWZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZSA9IGdldERPTVJ1bnRpbWUocnVudGltZUluZm8pOwkJDQotCQlpZiAoZG9tUnVudGltZSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCXRyeSB7DQotCQkJZG9tUnVudGltZS5jcmVhdGVET00obW9uaXRvcik7DQotCQl9IA0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiB1bmV4cGVjdGVkKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uISBEb20gZnJvbSBydW50aW1lICIgKyBydW50aW1lSW5mby5nZXROYW1lKCkgKyAiIHdpbGwgbm90IGJlIHByb2Nlc3NlZCEiLCB1bmV4cGVjdGVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCQkNCi0JCXJldHVybiBkb21SdW50aW1lOw0KLQl9DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgZGVzY3JpcHRvciBvYmplY3QNCi0JICogb2YgdHlwZSBJUnVudGltZUluZm8gYW5kIGluc3RhbnRpYXRlIHN1Y2ggRE9NIHJ1bnRpbWUgaW5zdGFuY2UgaWYgbm9uIGV4aXN0ZW50IGF0IHRoZSANCi0JICogbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuDQotCSAqIA0KLQkgKiBAcGFyYW0gcnVudGltZUluZm8gLSBkZXNjcmlwdG9yIG9mIHRoZSBET00gcnVudGltZSB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHJldHVybmVkIA0KLQkgKiBAcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZ2V0RE9NUnVudGltZShmaW5hbCBJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbykNCi0Jew0KLQkJaWYgKHJ1bnRpbWVJbmZvID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lID0gZG9tUnVudGltZXMuZ2V0KHJ1bnRpbWVJbmZvLmdldElkKCkpOwkJDQotCQlpZiAoZG9tUnVudGltZSA9PSBudWxsKQ0KLQkJew0KLQkJCWRvbVJ1bnRpbWUgPSBXc0RPTVJ1bnRpbWVSZWdpc3RyeS5pbnN0YW50aWF0ZVJ1bnRpbWUocnVudGltZUluZm8pOw0KLQkJCWlmIChkb21SdW50aW1lICE9IG51bGwpIHsNCi0JCQkJc3luY2hyb25pemVkKGRvbVJ1bnRpbWVzKSB7DQotCQkJCQlkb21SdW50aW1lcy5wdXQocnVudGltZUluZm8uZ2V0SWQoKSwgZG9tUnVudGltZSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBkb21SdW50aW1lOw0KLQl9DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgcnVudGltZSBpZA0KLQkgKiBhbmQgaW5zdGFudGlhdGUgc3VjaCBET00gcnVudGltZSBpbnN0YW5jZSBpZiBub24gZXhpc3RlbnQgYXQgdGhlIA0KLQkgKiBtb21lbnQgb2YgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZC4NCi0JICogDQotCSAqIEBwYXJhbSBydW50aW1lSWQgLSBzdHJpbmcgaWRlbnRpZmllciBvZiB0aGUgcnVudGltZSANCi0JICogQHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERPTVJ1bnRpbWUoZmluYWwgU3RyaW5nIHJ1bnRpbWVJZCkNCi0Jew0KLQkJcmV0dXJuIGdldERPTVJ1bnRpbWUoV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8ocnVudGltZUlkKSk7DQotCX0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIGluc3RhbnRpYXRlZCBET00gUnVudGltZXMNCi0gICAgICovDQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPElXc0RPTVJ1bnRpbWVFeHRlbnNpb24+IGdldERPTVJ1bnRpbWVzKCkNCi0gICAgew0KLSAgICAJaWYgKGRvbVJ1bnRpbWVzLnNpemUoKSA9PSAwKSANCi0gICAgCXsNCi0JICAgIAlmaW5hbCBDb2xsZWN0aW9uPElXc0RPTVJ1bnRpbWVJbmZvPiBydEluZm9zID0gV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzSW5mbygpOw0KLQkgICAgCWZvciAoSVdzRE9NUnVudGltZUluZm8gcnVudGltZUluZm8gOiBydEluZm9zKSB7DQotCQkJCWdldERPTVJ1bnRpbWUocnVudGltZUluZm8pOw0KLQkJCX0NCi0gICAgCX0NCi0gICAgCQ0KLSAgICAJcmV0dXJuIGRvbVJ1bnRpbWVzLnZhbHVlcygpOw0KLSAgICB9DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJlbG9hZCBhbGwgaW5zdGFuY2VzIG9mIERPTSBSdW50aW1lcy4NCi0JICoNCi0JICovDQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxvYWRET01SdW50aW1lcyhmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCXsNCi0JCXN5bmNocm9uaXplZChkb21SdW50aW1lcykgew0KLQkJCWRvbVJ1bnRpbWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLElXc0RPTVJ1bnRpbWVFeHRlbnNpb24+KCk7DQotCQl9DQotCQkNCi0JCWNyZWF0ZURPTVJ1bnRpbWVzKG1vbml0b3IpOw0KLQl9DQotDQotCXByaXZhdGUgSUxvZ2dlciBsb2dnZXIoKSB7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwNDFlZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iZG9tIgotICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklET00iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJTZXJ2aWNlUHJvamVjdHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSVdlYlNlcnZpY2VQcm9qZWN0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGxlbWVudGF0aW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGxpY2l0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGxlbWVudGluZ1dlYlNlcnZpY2VzIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0lXZWJTZXJ2aWNlIiBlT3Bwb3NpdGU9IiMvL0lXZWJTZXJ2aWNlL3NlcnZpY2VFbmRwb2ludCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYk1ldGhvZHMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vSVdlYk1ldGhvZCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1N0eWxlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU09BUEJpbmRpbmdTdHlsZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iRE9DVU1FTlQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcEJpbmRpbmdVc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TT0FQQmluZGluZ1VzZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iTElURVJBTCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iV1JBUFBFRCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJV2ViTWV0aG9kIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmFtZXRlcnMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vSVdlYlBhcmFtIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZWQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvYXBCaW5kaW5nU3R5bGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TT0FQQmluZGluZ1N0eWxlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJET0NVTUVOVCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1VzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NPQVBCaW5kaW5nVXNlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJMSVRFUkFMIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJXUkFQUEVEIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklXZWJQYXJhbSIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJraW5kIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vV2ViUGFyYW1LaW5kIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVOYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFydE5hbWUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhlYWRlciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklXZWJTZXJ2aWNlIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZpY2VFbmRwb2ludCIgZVR5cGU9IiMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS9pbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3J0TmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsTG9jYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVdlYlNlcnZpY2VQcm9qZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViU2VydmljZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSVdlYlNlcnZpY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVdlYlR5cGUiIGVTdXBlclR5cGVzPSIjLy9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJXZWJQYXJhbUtpbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU4iLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOT1VUIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1VUIiB2YWx1ZT0iMiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlNPQVBCaW5kaW5nU3R5bGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRE9DVU1FTlQiIGxpdGVyYWw9IkRPQ1VNRU5UIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSUEMiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iU09BUEJpbmRpbmdVc2UiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTElURVJBTCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRU5DT0RFRCIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IldSQVBQRUQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkJBUkUiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLndzLmdlbm1vZGVsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20ud3MuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0MjY5YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20ud3MuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMiIGVkaXRvckRpcmVjdG9yeT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIiBtb2RlbE5hbWU9IkRvbSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbi5Eb21VaSIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5uYXZpZ2F0b3IuZ2VuZXJhdGVkLkRvbUVkaXRvclBsdWdpbiIKLSAgICBub25OTFNNYXJrZXJzPSJ0cnVlIiB0ZXN0c0RpcmVjdG9yeT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYyIKLSAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIuamF2YSIgY29tcGxpYW5jZUxldmVsPSI1LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiCi0gICAgcHJvdmlkZXJSb290RXh0ZW5kc0NsYXNzPSIiPgotICA8Zm9yZWlnbk1vZGVsPkBtb2RlbDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJEb20iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBpbnRlcmZhY2VQYWNrYWdlU3VmZml4PSJydW50aW1lLmFwaSIgbWV0YURhdGFQYWNrYWdlU3VmZml4PSJydW50aW1lLmFwaSIgY2xhc3NQYWNrYWdlU3VmZml4PSJydW50aW1lLmludGVybmFsLmltcGwiCi0gICAgICB1dGlsaXR5UGFja2FnZVN1ZmZpeD0icnVudGltZS51dGlsIiBwcm92aWRlclBhY2thZ2VTdWZmaXg9InVpIiBnZW5lcmF0ZUV4YW1wbGVDbGFzcz0iZmFsc2UiCi0gICAgICBlY29yZVBhY2thZ2U9ImRvbS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZG9tLmVjb3JlIy8vV2ViUGFyYW1LaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vV2ViUGFyYW1LaW5kL0lOIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1dlYlBhcmFtS2luZC9JTk9VVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJkb20uZWNvcmUjLy9XZWJQYXJhbUtpbmQvT1VUIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdTdHlsZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nU3R5bGUvRE9DVU1FTlQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdTdHlsZS9SUEMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJkb20uZWNvcmUjLy9TT0FQQmluZGluZ1VzZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nVXNlL0xJVEVSQUwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdVc2UvRU5DT0RFRCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJkb20uZWNvcmUjLy9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlL1dSQVBQRUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS9CQVJFIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkb20uZWNvcmUjLy9JRE9NIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSURPTS93ZWJTZXJ2aWNlUHJvamVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudC9pbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL2ltcGxpY2l0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS9pbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3dlYk1ldGhvZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Uvc29hcEJpbmRpbmdTdHlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Uvc29hcEJpbmRpbmdVc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVdlYk1ldGhvZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lXZWJNZXRob2QvcGFyYW1ldGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJNZXRob2QvZXhjbHVkZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViTWV0aG9kL3NvYXBCaW5kaW5nU3R5bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViTWV0aG9kL3NvYXBCaW5kaW5nVXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYk1ldGhvZC9zb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRvbS5lY29yZSMvL0lXZWJQYXJhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlBhcmFtL2tpbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViUGFyYW0vdHlwZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViUGFyYW0vcGFydE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViUGFyYW0vdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlBhcmFtL2hlYWRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkb20uZWNvcmUjLy9JV2ViU2VydmljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2Uvc2VydmljZUVuZHBvaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2UvdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2UvcG9ydE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViU2VydmljZS93c2RsTG9jYXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2VQcm9qZWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2VQcm9qZWN0L3dlYlNlcnZpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlUHJvamVjdC9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2VQcm9qZWN0L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVdlYlR5cGUiLz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9Eb21GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MWQzYTc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9Eb21GYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotDQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb21GYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIERvbUZhY3Rvcnkgew0KLQkvKioNCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBEb21GYWN0b3J5IGluaXQoKSB7DQotCQl0cnkNCi0JCXsNCi0JCQlEb21GYWN0b3J5IHRoZURvbUZhY3RvcnkgPSAoRG9tRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgDQotCQkJaWYgKHRoZURvbUZhY3RvcnkgIT0gbnVsbCkNCi0JCQl7DQotCQkJCXJldHVybiB0aGVEb21GYWN0b3J5Ow0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQ0KLQkJew0KLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KLQkJfQ0KLQkJcmV0dXJuIG5ldyBEb21GYWN0b3J5SW1wbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIERvbUZhY3RvcnlJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgew0KLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET006IHJldHVybiBjcmVhdGVJRE9NKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQ6IHJldHVybiBjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRTogcmV0dXJuIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0Q6IHJldHVybiBjcmVhdGVJV2ViTWV0aG9kKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU06IHJldHVybiBjcmVhdGVJV2ViUGFyYW0oKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFOiByZXR1cm4gY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1Q6IHJldHVybiBjcmVhdGVJV2ViU2VydmljZVByb2plY3QoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9UWVBFOiByZXR1cm4gY3JlYXRlSVdlYlR5cGUoKTsNCi0JCQlkZWZhdWx0Og0KLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLldFQl9QQVJBTV9LSU5EOg0KLQkJCQlyZXR1cm4gY3JlYXRlV2ViUGFyYW1LaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLlNPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIGNyZWF0ZVNPQVBCaW5kaW5nU3R5bGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJcmV0dXJuIGNyZWF0ZVNPQVBCaW5kaW5nVXNlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLlNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXJldHVybiBjcmVhdGVTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQotCQkJZGVmYXVsdDoNCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsNCi0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5XRUJfUEFSQU1fS0lORDoNCi0JCQkJcmV0dXJuIGNvbnZlcnRXZWJQYXJhbUtpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXJldHVybiBjb252ZXJ0U09BUEJpbmRpbmdTdHlsZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLlNPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBjb252ZXJ0U09BUEJpbmRpbmdVc2VUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlyZXR1cm4gY29udmVydFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KLQkJCWRlZmF1bHQ6DQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElET00gY3JlYXRlSURPTSgpIHsNCi0JCUlET01JbXBsIGlkb20gPSBuZXcgSURPTUltcGwoKTsNCi0JCXJldHVybiBpZG9tOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElKYXZhV2ViU2VydmljZUVsZW1lbnQgY3JlYXRlSUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpIHsNCi0JCUlKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGlKYXZhV2ViU2VydmljZUVsZW1lbnQgPSBuZXcgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwoKTsNCi0JCXJldHVybiBpSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsIGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBuZXcgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwoKTsNCi0JCXJldHVybiBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJNZXRob2QgY3JlYXRlSVdlYk1ldGhvZCgpIHsNCi0JCUlXZWJNZXRob2RJbXBsIGlXZWJNZXRob2QgPSBuZXcgSVdlYk1ldGhvZEltcGwoKTsNCi0JCXJldHVybiBpV2ViTWV0aG9kOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJQYXJhbSBjcmVhdGVJV2ViUGFyYW0oKSB7DQotCQlJV2ViUGFyYW1JbXBsIGlXZWJQYXJhbSA9IG5ldyBJV2ViUGFyYW1JbXBsKCk7DQotCQlyZXR1cm4gaVdlYlBhcmFtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJTZXJ2aWNlIGNyZWF0ZUlXZWJTZXJ2aWNlKCkgew0KLQkJSVdlYlNlcnZpY2VJbXBsIGlXZWJTZXJ2aWNlID0gbmV3IElXZWJTZXJ2aWNlSW1wbCgpOw0KLQkJcmV0dXJuIGlXZWJTZXJ2aWNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJTZXJ2aWNlUHJvamVjdCBjcmVhdGVJV2ViU2VydmljZVByb2plY3QoKSB7DQotCQlJV2ViU2VydmljZVByb2plY3RJbXBsIGlXZWJTZXJ2aWNlUHJvamVjdCA9IG5ldyBJV2ViU2VydmljZVByb2plY3RJbXBsKCk7DQotCQlyZXR1cm4gaVdlYlNlcnZpY2VQcm9qZWN0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJUeXBlIGNyZWF0ZUlXZWJUeXBlKCkgew0KLQkJSVdlYlR5cGVJbXBsIGlXZWJUeXBlID0gbmV3IElXZWJUeXBlSW1wbCgpOw0KLQkJcmV0dXJuIGlXZWJUeXBlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFdlYlBhcmFtS2luZCBjcmVhdGVXZWJQYXJhbUtpbmRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsNCi0JCVdlYlBhcmFtS2luZCByZXN1bHQgPSBXZWJQYXJhbUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7DQotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRXZWJQYXJhbUtpbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgew0KLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU09BUEJpbmRpbmdTdHlsZSBjcmVhdGVTT0FQQmluZGluZ1N0eWxlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7DQotCQlTT0FQQmluZGluZ1N0eWxlIHJlc3VsdCA9IFNPQVBCaW5kaW5nU3R5bGUuZ2V0KGluaXRpYWxWYWx1ZSk7DQotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTT0FQQmluZGluZ1N0eWxlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsNCi0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nVXNlIGNyZWF0ZVNPQVBCaW5kaW5nVXNlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7DQotCQlTT0FQQmluZGluZ1VzZSByZXN1bHQgPSBTT0FQQmluZGluZ1VzZS5nZXQoaW5pdGlhbFZhbHVlKTsNCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgY29udmVydFNPQVBCaW5kaW5nVXNlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsNCi0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgY3JlYXRlU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KLQkJU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSByZXN1bHQgPSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmdldChpbml0aWFsVmFsdWUpOw0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7DQotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBEb21QYWNrYWdlIGdldERvbVBhY2thZ2UoKSB7DQotCQlyZXR1cm4gKERvbVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBkZXByZWNhdGVkDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBEZXByZWNhdGVkDQotCXB1YmxpYyBzdGF0aWMgRG9tUGFja2FnZSBnZXRQYWNrYWdlKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuZUlOU1RBTkNFOw0KLQl9DQotDQotfSAvL0RvbUZhY3RvcnlJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0RvbVBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzk1ODhhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIERvbVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgRG9tUGFja2FnZSB7DQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaWRvbUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYk1ldGhvZEVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYlBhcmFtRUNsYXNzID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIEVDbGFzcyBpV2ViU2VydmljZUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIEVDbGFzcyBpV2ViVHlwZUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFRW51bSB3ZWJQYXJhbUtpbmRFRW51bSA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFRW51bSBzb2FwQmluZGluZ1N0eWxlRUVudW0gPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUVudW0gc29hcEJpbmRpbmdVc2VFRW51bSA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFRW51bSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW0gPSBudWxsOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aA0KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQ0KLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4NCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYw0KLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3Jtcw0KLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLA0KLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNlTlNfVVJJDQotCSAqIEBzZWUgI2luaXQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIERvbVBhY2thZ2VJbXBsKCkgew0KLQkJc3VwZXIoZU5TX1VSSSwgRG9tRmFjdG9yeS5lSU5TVEFOQ0UpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzDQotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlDQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsDQotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcw0KLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsDQotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuDQotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gNCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkDQotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoNCi0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkNCi0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8NCi0JICogdGhvc2Ugb2YgYW5vdGhlci4NCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQ0KLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNlTlNfVVJJDQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpDQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIERvbVBhY2thZ2UgaW5pdCgpIHsNCi0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChEb21QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERvbVBhY2thZ2UuZU5TX1VSSSk7DQotDQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlDQotCQlEb21QYWNrYWdlSW1wbCB0aGVEb21QYWNrYWdlID0gKERvbVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIERvbVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgRG9tUGFja2FnZUltcGwoKSk7DQotDQotCQlpc0luaXRlZCA9IHRydWU7DQotDQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cw0KLQkJdGhlRG9tUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsNCi0NCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGENCi0JCXRoZURvbVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOw0KLQ0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZA0KLQkJdGhlRG9tUGFja2FnZS5mcmVlemUoKTsNCi0NCi0JCXJldHVybiB0aGVEb21QYWNrYWdlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJRE9NKCkgew0KLQkJcmV0dXJuIGlkb21FQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJRE9NX1dlYlNlcnZpY2VQcm9qZWN0cygpIHsNCi0JCXJldHVybiAoRVJlZmVyZW5jZSlpZG9tRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUNsYXNzIGdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKSB7DQotCQlyZXR1cm4gaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfSW1wbGVtZW50YXRpb24oKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9OYW1lKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsNCi0JCXJldHVybiBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsaWNpdCgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkgew0KLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFUmVmZXJlbmNlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfV2ViTWV0aG9kcygpIHsNCi0JCXJldHVybiAoRVJlZmVyZW5jZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1RhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJV2ViTWV0aG9kKCkgew0KLQkJcmV0dXJuIGlXZWJNZXRob2RFQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJV2ViTWV0aG9kX1BhcmFtZXRlcnMoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9FeGNsdWRlZCgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViTWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViTWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJV2ViUGFyYW0oKSB7DQotCQlyZXR1cm4gaVdlYlBhcmFtRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX0tpbmQoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fVHlwZU5hbWUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fUGFydE5hbWUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fVGFyZ2V0TmFtZXNwYWNlKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX0hlYWRlcigpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViUGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVdlYlNlcnZpY2UoKSB7DQotCQlyZXR1cm4gaVdlYlNlcnZpY2VFQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJV2ViU2VydmljZV9TZXJ2aWNlRW5kcG9pbnQoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1RhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViU2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlNlcnZpY2VfUG9ydE5hbWUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViU2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJV2ViU2VydmljZVByb2plY3QoKSB7DQotCQlyZXR1cm4gaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1dlYlNlcnZpY2VzKCkgew0KLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlXZWJTZXJ2aWNlUHJvamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZVByb2plY3RfTmFtZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViU2VydmljZVByb2plY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVdlYlR5cGUoKSB7DQotCQlyZXR1cm4gaVdlYlR5cGVFQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUVudW0gZ2V0V2ViUGFyYW1LaW5kKCkgew0KLQkJcmV0dXJuIHdlYlBhcmFtS2luZEVFbnVtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVFbnVtIGdldFNPQVBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdTdHlsZUVFbnVtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVFbnVtIGdldFNPQVBCaW5kaW5nVXNlKCkgew0KLQkJcmV0dXJuIHNvYXBCaW5kaW5nVXNlRUVudW07DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUVudW0gZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW07DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRG9tRmFjdG9yeSBnZXREb21GYWN0b3J5KCkgew0KLQkJcmV0dXJuIChEb21GYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcw0KLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7DQotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47DQotCQlpc0NyZWF0ZWQgPSB0cnVlOw0KLQ0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzDQotCQlpZG9tRUNsYXNzID0gY3JlYXRlRUNsYXNzKElET00pOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpZG9tRUNsYXNzLCBJRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUyk7DQotDQotCQlpSmF2YVdlYlNlcnZpY2VFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpSmF2YVdlYlNlcnZpY2VFbGVtZW50RUNsYXNzLCBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTik7DQotCQljcmVhdGVFQXR0cmlidXRlKGlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3MsIElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpOw0KLQ0KLQkJaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUyk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFKTsNCi0NCi0JCWlXZWJNZXRob2RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVdFQl9NRVRIT0QpOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpV2ViTWV0aG9kRUNsYXNzLCBJV0VCX01FVEhPRF9fUEFSQU1FVEVSUyk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJNZXRob2RFQ2xhc3MsIElXRUJfTUVUSE9EX19FWENMVURFRCk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJNZXRob2RFQ2xhc3MsIElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViTWV0aG9kRUNsYXNzLCBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJNZXRob2RFQ2xhc3MsIElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFKTsNCi0NCi0JCWlXZWJQYXJhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJV0VCX1BBUkFNKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlBhcmFtRUNsYXNzLCBJV0VCX1BBUkFNX19LSU5EKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlBhcmFtRUNsYXNzLCBJV0VCX1BBUkFNX19UWVBFX05BTUUpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViUGFyYW1FQ2xhc3MsIElXRUJfUEFSQU1fX1BBUlRfTkFNRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJQYXJhbUVDbGFzcywgSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJQYXJhbUVDbGFzcywgSVdFQl9QQVJBTV9fSEVBREVSKTsNCi0NCi0JCWlXZWJTZXJ2aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElXRUJfU0VSVklDRSk7DQotCQljcmVhdGVFUmVmZXJlbmNlKGlXZWJTZXJ2aWNlRUNsYXNzLCBJV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViU2VydmljZUVDbGFzcywgSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlNlcnZpY2VFQ2xhc3MsIElXRUJfU0VSVklDRV9fUE9SVF9OQU1FKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlNlcnZpY2VFQ2xhc3MsIElXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTik7DQotDQotCQlpV2ViU2VydmljZVByb2plY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVdFQl9TRVJWSUNFX1BST0pFQ1QpOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpV2ViU2VydmljZVByb2plY3RFQ2xhc3MsIElXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMpOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpV2ViU2VydmljZVByb2plY3RFQ2xhc3MsIElXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViU2VydmljZVByb2plY3RFQ2xhc3MsIElXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FKTsNCi0NCi0JCWlXZWJUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElXRUJfVFlQRSk7DQotDQotCQkvLyBDcmVhdGUgZW51bXMNCi0JCXdlYlBhcmFtS2luZEVFbnVtID0gY3JlYXRlRUVudW0oV0VCX1BBUkFNX0tJTkQpOw0KLQkJc29hcEJpbmRpbmdTdHlsZUVFbnVtID0gY3JlYXRlRUVudW0oU09BUF9CSU5ESU5HX1NUWUxFKTsNCi0JCXNvYXBCaW5kaW5nVXNlRUVudW0gPSBjcmVhdGVFRW51bShTT0FQX0JJTkRJTkdfVVNFKTsNCi0JCXNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVFRW51bSA9IGNyZWF0ZUVFbnVtKFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzDQotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgew0KLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsNCi0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOw0KLQ0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlDQotCQlzZXROYW1lKGVOQU1FKTsNCi0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOw0KLQkJc2V0TnNVUkkoZU5TX1VSSSk7DQotDQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzDQotDQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMNCi0NCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMNCi0JCWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQkJaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKSk7DQotCQlpV2ViUGFyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQkJaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQkJaVdlYlR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQ0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMNCi0JCWluaXRFQ2xhc3MoaWRvbUVDbGFzcywgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NLmNsYXNzLCAiSURPTSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKSwgdGhpcy5nZXRJV2ViU2VydmljZVByb2plY3QoKSwgbnVsbCwgIndlYlNlcnZpY2VQcm9qZWN0cyIsIG51bGwsIDAsIC0xLCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWluaXRFQ2xhc3MoaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcywgSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcywgIklKYXZhV2ViU2VydmljZUVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfSW1wbGVtZW50YXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImltcGxlbWVudGF0aW9uIiwgbnVsbCwgMSwgMSwgSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaW5pdEVDbGFzcyhpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAiSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsaWNpdCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImltcGxpY2l0IiwgbnVsbCwgMSwgMSwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLCB0aGlzLmdldElXZWJTZXJ2aWNlKCksIHRoaXMuZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50KCksICJpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyIsIG51bGwsIDEsIC0xLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RVJlZmVyZW5jZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1dlYk1ldGhvZHMoKSwgdGhpcy5nZXRJV2ViTWV0aG9kKCksIG51bGwsICJ3ZWJNZXRob2RzIiwgbnVsbCwgMSwgLTEsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfVGFyZ2V0TmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YXJnZXROYW1lc3BhY2UiLCBudWxsLCAxLCAxLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGUoKSwgdGhpcy5nZXRTT0FQQmluZGluZ1N0eWxlKCksICJzb2FwQmluZGluZ1N0eWxlIiwgIkRPQ1VNRU5UIiwgMSwgMSwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nVXNlKCksIHRoaXMuZ2V0U09BUEJpbmRpbmdVc2UoKSwgInNvYXBCaW5kaW5nVXNlIiwgIkxJVEVSQUwiLCAxLCAxLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCWluaXRFQXR0cmlidXRlKGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpLCB0aGlzLmdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSwgInNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiLCAiV1JBUFBFRCIsIDEsIDEsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkJaW5pdEVDbGFzcyhpV2ViTWV0aG9kRUNsYXNzLCBJV2ViTWV0aG9kLmNsYXNzLCAiSVdlYk1ldGhvZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SVdlYk1ldGhvZF9QYXJhbWV0ZXJzKCksIHRoaXMuZ2V0SVdlYlBhcmFtKCksIG51bGwsICJwYXJhbWV0ZXJzIiwgbnVsbCwgMSwgLTEsIElXZWJNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJNZXRob2RfRXhjbHVkZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJleGNsdWRlZCIsIG51bGwsIDEsIDEsIElXZWJNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdTdHlsZSgpLCB0aGlzLmdldFNPQVBCaW5kaW5nU3R5bGUoKSwgInNvYXBCaW5kaW5nU3R5bGUiLCAiRE9DVU1FTlQiLCAxLCAxLCBJV2ViTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdVc2UoKSwgdGhpcy5nZXRTT0FQQmluZGluZ1VzZSgpLCAic29hcEJpbmRpbmdVc2UiLCAiTElURVJBTCIsIDEsIDEsIElXZWJNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCksIHRoaXMuZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpLCAic29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIsICJXUkFQUEVEIiwgMSwgMSwgSVdlYk1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCQlpbml0RUNsYXNzKGlXZWJQYXJhbUVDbGFzcywgSVdlYlBhcmFtLmNsYXNzLCAiSVdlYlBhcmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViUGFyYW1fS2luZCgpLCB0aGlzLmdldFdlYlBhcmFtS2luZCgpLCAia2luZCIsIG51bGwsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX1R5cGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlTmFtZSIsIG51bGwsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJ0TmFtZSIsIG51bGwsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFyZ2V0TmFtZXNwYWNlIiwgbnVsbCwgMSwgMSwgSVdlYlBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViUGFyYW1fSGVhZGVyKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaGVhZGVyIiwgImZhbHNlIiwgMSwgMSwgSVdlYlBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JCWluaXRFQ2xhc3MoaVdlYlNlcnZpY2VFQ2xhc3MsIElXZWJTZXJ2aWNlLmNsYXNzLCAiSVdlYlNlcnZpY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElXZWJTZXJ2aWNlX1NlcnZpY2VFbmRwb2ludCgpLCB0aGlzLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgdGhpcy5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCksICJzZXJ2aWNlRW5kcG9pbnQiLCBudWxsLCAwLCAxLCBJV2ViU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlNlcnZpY2VfVGFyZ2V0TmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YXJnZXROYW1lc3BhY2UiLCBudWxsLCAxLCAxLCBJV2ViU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlNlcnZpY2VfUG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnROYW1lIiwgbnVsbCwgMSwgMSwgSVdlYlNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbExvY2F0aW9uIiwgbnVsbCwgMCwgMSwgSVdlYlNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWluaXRFQ2xhc3MoaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLCBJV2ViU2VydmljZVByb2plY3QuY2xhc3MsICJJV2ViU2VydmljZVByb2plY3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElXZWJTZXJ2aWNlUHJvamVjdF9XZWJTZXJ2aWNlcygpLCB0aGlzLmdldElXZWJTZXJ2aWNlKCksIG51bGwsICJ3ZWJTZXJ2aWNlcyIsIG51bGwsIDAsIC0xLCBJV2ViU2VydmljZVByb2plY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElXZWJTZXJ2aWNlUHJvamVjdF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCksIHRoaXMuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCBudWxsLCAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyIsIG51bGwsIDAsIC0xLCBJV2ViU2VydmljZVByb2plY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJTZXJ2aWNlUHJvamVjdF9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotDQotCQlpbml0RUNsYXNzKGlXZWJUeXBlRUNsYXNzLCBJV2ViVHlwZS5jbGFzcywgIklXZWJUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkDQotDQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscw0KLQkJaW5pdEVFbnVtKHdlYlBhcmFtS2luZEVFbnVtLCBXZWJQYXJhbUtpbmQuY2xhc3MsICJXZWJQYXJhbUtpbmQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJYWRkRUVudW1MaXRlcmFsKHdlYlBhcmFtS2luZEVFbnVtLCBXZWJQYXJhbUtpbmQuSU4pOw0KLQkJYWRkRUVudW1MaXRlcmFsKHdlYlBhcmFtS2luZEVFbnVtLCBXZWJQYXJhbUtpbmQuSU5PVVQpOw0KLQkJYWRkRUVudW1MaXRlcmFsKHdlYlBhcmFtS2luZEVFbnVtLCBXZWJQYXJhbUtpbmQuT1VUKTsNCi0NCi0JCWluaXRFRW51bShzb2FwQmluZGluZ1N0eWxlRUVudW0sIFNPQVBCaW5kaW5nU3R5bGUuY2xhc3MsICJTT0FQQmluZGluZ1N0eWxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1N0eWxlRUVudW0sIFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQpOw0KLQkJYWRkRUVudW1MaXRlcmFsKHNvYXBCaW5kaW5nU3R5bGVFRW51bSwgU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQ0KLQkJaW5pdEVFbnVtKHNvYXBCaW5kaW5nVXNlRUVudW0sIFNPQVBCaW5kaW5nVXNlLmNsYXNzLCAiU09BUEJpbmRpbmdVc2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJYWRkRUVudW1MaXRlcmFsKHNvYXBCaW5kaW5nVXNlRUVudW0sIFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwpOw0KLQkJYWRkRUVudW1MaXRlcmFsKHNvYXBCaW5kaW5nVXNlRUVudW0sIFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQpOw0KLQ0KLQkJaW5pdEVFbnVtKHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVFRW51bSwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5jbGFzcywgIlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJYWRkRUVudW1MaXRlcmFsKHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVFRW51bSwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW0sIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSk7DQotDQotCQkvLyBDcmVhdGUgcmVzb3VyY2UNCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOw0KLQl9DQotDQotfSAvL0RvbVBhY2thZ2VJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lET01JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSURPTUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFlODY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSURPTUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SURPTTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JRE9NSW1wbCNnZXRXZWJTZXJ2aWNlUHJvamVjdHMgPGVtPldlYiBTZXJ2aWNlIFByb2plY3RzPC9lbT59PC9saT4NCi0gKiA8L3VsPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSURPTUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIElET00gew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2ViU2VydmljZVByb2plY3RzKCkgPGVtPldlYiBTZXJ2aWNlIFByb2plY3RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VQcm9qZWN0cygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJV2ViU2VydmljZVByb2plY3Q+IHdlYlNlcnZpY2VQcm9qZWN0czsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSURPTUltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSURPTTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZVByb2plY3Q+IGdldFdlYlNlcnZpY2VQcm9qZWN0cygpIHsNCi0JCWlmICh3ZWJTZXJ2aWNlUHJvamVjdHMgPT0gbnVsbCkNCi0JCXsNCi0JCQl3ZWJTZXJ2aWNlUHJvamVjdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SVdlYlNlcnZpY2VQcm9qZWN0PihJV2ViU2VydmljZVByb2plY3QuY2xhc3MsIHRoaXMsIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMpOw0KLQkJfQ0KLQkJcmV0dXJuIHdlYlNlcnZpY2VQcm9qZWN0czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0V2ViU2VydmljZVByb2plY3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCXJldHVybiBnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTOg0KLQkJCQlnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5jbGVhcigpOw0KLQkJCQlnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElXZWJTZXJ2aWNlUHJvamVjdD4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCWdldFdlYlNlcnZpY2VQcm9qZWN0cygpLmNsZWFyKCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCXJldHVybiB3ZWJTZXJ2aWNlUHJvamVjdHMgIT0gbnVsbCAmJiAhd2ViU2VydmljZVByb2plY3RzLmlzRW1wdHkoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCi0JfQ0KLQ0KLX0gLy9JRE9NSW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ4MGMxMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwjZ2V0SW1wbGVtZW50YXRpb24gPGVtPkltcGxlbWVudGF0aW9uPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IHsNCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsZW1lbnRhdGlvbigpIDxlbT5JbXBsZW1lbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0SW1wbGVtZW50YXRpb24oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRBVElPTl9FREVGQVVMVCA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsZW1lbnRhdGlvbigpIDxlbT5JbXBsZW1lbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0SW1wbGVtZW50YXRpb24oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIGltcGxlbWVudGF0aW9uID0gSU1QTEVNRU5UQVRJT05fRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXROYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvbigpIHsNCi0JCXJldHVybiBpbXBsZW1lbnRhdGlvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uKFN0cmluZyBuZXdJbXBsZW1lbnRhdGlvbikgew0KLQkJU3RyaW5nIG9sZEltcGxlbWVudGF0aW9uID0gaW1wbGVtZW50YXRpb247DQotCQlpbXBsZW1lbnRhdGlvbiA9IG5ld0ltcGxlbWVudGF0aW9uOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sIG9sZEltcGxlbWVudGF0aW9uLCBpbXBsZW1lbnRhdGlvbikpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkJcmV0dXJuIG5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7DQotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7DQotCQluYW1lID0gbmV3TmFtZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT046DQotCQkJCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOg0KLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjoNCi0JCQkJc2V0SW1wbGVtZW50YXRpb24oKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRToNCi0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOg0KLQkJCQlzZXRJbXBsZW1lbnRhdGlvbihJTVBMRU1FTlRBVElPTl9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRToNCi0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjoNCi0JCQkJcmV0dXJuIElNUExFTUVOVEFUSU9OX0VERUZBVUxUID09IG51bGwgPyBpbXBsZW1lbnRhdGlvbiAhPSBudWxsIDogIUlNUExFTUVOVEFUSU9OX0VERUZBVUxULmVxdWFscyhpbXBsZW1lbnRhdGlvbik7DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU6DQotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiIChpbXBsZW1lbnRhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoaW1wbGVtZW50YXRpb24pOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLX0gLy9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkMGU1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNpc0ltcGxpY2l0IDxlbT5JbXBsaWNpdDwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsI2dldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzIDxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwjZ2V0V2ViTWV0aG9kcyA8ZW0+V2ViIE1ldGhvZHM8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSB7DQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbXBsaWNpdCgpIDxlbT5JbXBsaWNpdDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNJbXBsaWNpdCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTVBMSUNJVF9FREVGQVVMVCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbXBsaWNpdCgpIDxlbT5JbXBsaWNpdDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNJbXBsaWNpdCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGltcGxpY2l0ID0gSU1QTElDSVRfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpIDxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIEVMaXN0PElXZWJTZXJ2aWNlPiBpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlczsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYk1ldGhvZHMoKSA8ZW0+V2ViIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0V2ViTWV0aG9kcygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJV2ViTWV0aG9kPiB3ZWJNZXRob2RzOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nU3R5bGUgU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUID0gU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFNPQVBCaW5kaW5nU3R5bGUgc29hcEJpbmRpbmdTdHlsZSA9IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1VzZSgpIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdVc2UgU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCA9IFNPQVBCaW5kaW5nVXNlLkxJVEVSQUw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1VzZSgpIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTT0FQQmluZGluZ1VzZSBzb2FwQmluZGluZ1VzZSA9IFNPQVBfQklORElOR19VU0VfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQgPSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID0gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdCgpIHsNCi0JCXJldHVybiBpbXBsaWNpdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEltcGxpY2l0KGJvb2xlYW4gbmV3SW1wbGljaXQpIHsNCi0JCWJvb2xlYW4gb2xkSW1wbGljaXQgPSBpbXBsaWNpdDsNCi0JCWltcGxpY2l0ID0gbmV3SW1wbGljaXQ7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lULCBvbGRJbXBsaWNpdCwgaW1wbGljaXQpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZT4gZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSB7DQotCQlpZiAoaW1wbGVtZW50aW5nV2ViU2VydmljZXMgPT0gbnVsbCkNCi0JCXsNCi0JCQlpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDxJV2ViU2VydmljZT4oSVdlYlNlcnZpY2UuY2xhc3MsIHRoaXMsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCk7DQotCQl9DQotCQlyZXR1cm4gaW1wbGVtZW50aW5nV2ViU2VydmljZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYk1ldGhvZD4gZ2V0V2ViTWV0aG9kcygpIHsNCi0JCWlmICh3ZWJNZXRob2RzID09IG51bGwpDQotCQl7DQotCQkJd2ViTWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJV2ViTWV0aG9kPihJV2ViTWV0aG9kLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMpOw0KLQkJfQ0KLQkJcmV0dXJuIHdlYk1ldGhvZHM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiB0YXJnZXROYW1lc3BhY2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkgew0KLQkJU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsNCi0JCXRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSwgb2xkVGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1N0eWxlIGdldFNvYXBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdTdHlsZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSBuZXdTb2FwQmluZGluZ1N0eWxlKSB7DQotCQlTT0FQQmluZGluZ1N0eWxlIG9sZFNvYXBCaW5kaW5nU3R5bGUgPSBzb2FwQmluZGluZ1N0eWxlOw0KLQkJc29hcEJpbmRpbmdTdHlsZSA9IG5ld1NvYXBCaW5kaW5nU3R5bGUgPT0gbnVsbCA/IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nU3R5bGU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRSwgb2xkU29hcEJpbmRpbmdTdHlsZSwgc29hcEJpbmRpbmdTdHlsZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nVXNlIGdldFNvYXBCaW5kaW5nVXNlKCkgew0KLQkJcmV0dXJuIHNvYXBCaW5kaW5nVXNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UgbmV3U29hcEJpbmRpbmdVc2UpIHsNCi0JCVNPQVBCaW5kaW5nVXNlIG9sZFNvYXBCaW5kaW5nVXNlID0gc29hcEJpbmRpbmdVc2U7DQotCQlzb2FwQmluZGluZ1VzZSA9IG5ld1NvYXBCaW5kaW5nVXNlID09IG51bGwgPyBTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUIDogbmV3U29hcEJpbmRpbmdVc2U7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0UsIG9sZFNvYXBCaW5kaW5nVXNlLCBzb2FwQmluZGluZ1VzZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpIHsNCi0JCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgb2xkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotCQlzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID0gbmV3U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUsIG9sZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUsIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KShJbnRlcm5hbEVMaXN0PD8+KWdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRXZWJNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDoNCi0JCQkJcmV0dXJuIGlzSW1wbGljaXQoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUzoNCi0JCQkJcmV0dXJuIGdldFdlYk1ldGhvZHMoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCQlyZXR1cm4gZ2V0U29hcEJpbmRpbmdTdHlsZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1VzZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUOg0KLQkJCQlzZXRJbXBsaWNpdCgoQm9vbGVhbiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTOg0KLQkJCQlnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmNsZWFyKCk7DQotCQkJCWdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJV2ViU2VydmljZT4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCWdldFdlYk1ldGhvZHMoKS5jbGVhcigpOw0KLQkJCQlnZXRXZWJNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJV2ViTWV0aG9kPiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlzZXRUYXJnZXROYW1lc3BhY2UoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nU3R5bGUoKFNPQVBCaW5kaW5nU3R5bGUpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJc2V0U29hcEJpbmRpbmdVc2UoKFNPQVBCaW5kaW5nVXNlKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDoNCi0JCQkJc2V0SW1wbGljaXQoSU1QTElDSVRfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzoNCi0JCQkJZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jbGVhcigpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCWdldFdlYk1ldGhvZHMoKS5jbGVhcigpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJc2V0VGFyZ2V0TmFtZXNwYWNlKFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1VzZShTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDoNCi0JCQkJcmV0dXJuIGltcGxpY2l0ICE9IElNUExJQ0lUX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVM6DQotCQkJCXJldHVybiBpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyAhPSBudWxsICYmICFpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcy5pc0VtcHR5KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCXJldHVybiB3ZWJNZXRob2RzICE9IG51bGwgJiYgIXdlYk1ldGhvZHMuaXNFbXB0eSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXJldHVybiBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID09IG51bGwgPyB0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCA6ICFUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxULmVxdWFscyh0YXJnZXROYW1lc3BhY2UpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIHNvYXBCaW5kaW5nU3R5bGUgIT0gU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBzb2FwQmluZGluZ1VzZSAhPSBTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlICE9IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQ7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiIChpbXBsaWNpdDogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoaW1wbGljaXQpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCB0YXJnZXROYW1lc3BhY2U6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBCaW5kaW5nU3R5bGU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHNvYXBCaW5kaW5nU3R5bGUpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwQmluZGluZ1VzZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoc29hcEJpbmRpbmdVc2UpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlIA0KLQlwdWJsaWMgRU9iamVjdCBlQ29udGFpbmVyKCkNCi0Jew0KLQkJaWYgKHN1cGVyLmVDb250YWluZXIoKSE9bnVsbCkgew0KLQkJCXJldHVybiBzdXBlci5lQ29udGFpbmVyKCk7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiBnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKSB7DQotCQkJaWYgKHdzLmVDb250YWluZXIoKSE9bnVsbCkgew0KLQkJCQlyZXR1cm4gd3MuZUNvbnRhaW5lcigpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi19IC8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYk1ldGhvZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViTWV0aG9kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YmJhNDlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViTWV0aG9kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIE1ldGhvZDwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCNnZXRQYXJhbWV0ZXJzIDxlbT5QYXJhbWV0ZXJzPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwjaXNFeGNsdWRlZCA8ZW0+RXhjbHVkZWQ8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJV2ViTWV0aG9kSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVdlYk1ldGhvZCB7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbWV0ZXJzKCkgPGVtPlBhcmFtZXRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UGFyYW1ldGVycygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJV2ViUGFyYW0+IHBhcmFtZXRlcnM7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlZCgpIDxlbT5FeGNsdWRlZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNFeGNsdWRlZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWENMVURFRF9FREVGQVVMVCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlZCgpIDxlbT5FeGNsdWRlZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNFeGNsdWRlZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGV4Y2x1ZGVkID0gRVhDTFVERURfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nU3R5bGUgU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUID0gU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFNPQVBCaW5kaW5nU3R5bGUgc29hcEJpbmRpbmdTdHlsZSA9IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1VzZSgpIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdVc2UgU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCA9IFNPQVBCaW5kaW5nVXNlLkxJVEVSQUw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1VzZSgpIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTT0FQQmluZGluZ1VzZSBzb2FwQmluZGluZ1VzZSA9IFNPQVBfQklORElOR19VU0VfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQgPSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID0gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZEltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9NRVRIT0Q7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYlBhcmFtPiBnZXRQYXJhbWV0ZXJzKCkgew0KLQkJaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkNCi0JCXsNCi0JCQlwYXJhbWV0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PElXZWJQYXJhbT4oSVdlYlBhcmFtLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19QQVJBTUVURVJTKTsNCi0JCX0NCi0JCXJldHVybiBwYXJhbWV0ZXJzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlZCgpIHsNCi0JCXJldHVybiBleGNsdWRlZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVkKGJvb2xlYW4gbmV3RXhjbHVkZWQpIHsNCi0JCWJvb2xlYW4gb2xkRXhjbHVkZWQgPSBleGNsdWRlZDsNCi0JCWV4Y2x1ZGVkID0gbmV3RXhjbHVkZWQ7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQsIG9sZEV4Y2x1ZGVkLCBleGNsdWRlZCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nU3R5bGUgZ2V0U29hcEJpbmRpbmdTdHlsZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1N0eWxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlIG5ld1NvYXBCaW5kaW5nU3R5bGUpIHsNCi0JCVNPQVBCaW5kaW5nU3R5bGUgb2xkU29hcEJpbmRpbmdTdHlsZSA9IHNvYXBCaW5kaW5nU3R5bGU7DQotCQlzb2FwQmluZGluZ1N0eWxlID0gbmV3U29hcEJpbmRpbmdTdHlsZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUIDogbmV3U29hcEJpbmRpbmdTdHlsZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUsIG9sZFNvYXBCaW5kaW5nU3R5bGUsIHNvYXBCaW5kaW5nU3R5bGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1VzZSBnZXRTb2FwQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1VzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlIG5ld1NvYXBCaW5kaW5nVXNlKSB7DQotCQlTT0FQQmluZGluZ1VzZSBvbGRTb2FwQmluZGluZ1VzZSA9IHNvYXBCaW5kaW5nVXNlOw0KLQkJc29hcEJpbmRpbmdVc2UgPSBuZXdTb2FwQmluZGluZ1VzZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nVXNlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UsIG9sZFNvYXBCaW5kaW5nVXNlLCBzb2FwQmluZGluZ1VzZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpIHsNCi0JCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgb2xkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotCQlzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID0gbmV3U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSwgb2xkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSwgc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQYXJhbWV0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM6DQotCQkJCXJldHVybiBnZXRQYXJhbWV0ZXJzKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19FWENMVURFRDoNCi0JCQkJcmV0dXJuIGlzRXhjbHVkZWQoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIGdldFNvYXBCaW5kaW5nU3R5bGUoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1VzZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRToNCi0JCQkJcmV0dXJuIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19QQVJBTUVURVJTOg0KLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsNCi0JCQkJZ2V0UGFyYW1ldGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVdlYlBhcmFtPiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0VYQ0xVREVEOg0KLQkJCQlzZXRFeGNsdWRlZCgoQm9vbGVhbiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJc2V0U29hcEJpbmRpbmdTdHlsZSgoU09BUEJpbmRpbmdTdHlsZSluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXNldFNvYXBCaW5kaW5nVXNlKChTT0FQQmluZGluZ1VzZSluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM6DQotCQkJCWdldFBhcmFtZXRlcnMoKS5jbGVhcigpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19FWENMVURFRDoNCi0JCQkJc2V0RXhjbHVkZWQoRVhDTFVERURfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nU3R5bGUoU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJc2V0U29hcEJpbmRpbmdVc2UoU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM6DQotCQkJCXJldHVybiBwYXJhbWV0ZXJzICE9IG51bGwgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQ6DQotCQkJCXJldHVybiBleGNsdWRlZCAhPSBFWENMVURFRF9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIHNvYXBCaW5kaW5nU3R5bGUgIT0gU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJcmV0dXJuIHNvYXBCaW5kaW5nVXNlICE9IFNPQVBfQklORElOR19VU0VfRURFRkFVTFQ7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlyZXR1cm4gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSAhPSBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFX0VERUZBVUxUOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAoZXhjbHVkZWQ6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKGV4Y2x1ZGVkKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcEJpbmRpbmdTdHlsZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoc29hcEJpbmRpbmdTdHlsZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBCaW5kaW5nVXNlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChzb2FwQmluZGluZ1VzZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpOw0KLQkJcmVzdWx0LmFwcGVuZCgnKScpOw0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KLQl9DQotDQotfSAvL0lXZWJNZXRob2RJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJQYXJhbUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViUGFyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxNTA0ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJQYXJhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIFBhcmFtPC9iPjwvZW0+Jy4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiA8cD4NCi0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCi0gKiA8dWw+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjZ2V0VHlwZU5hbWUgPGVtPlR5cGUgTmFtZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjZ2V0UGFydE5hbWUgPGVtPlBhcnQgTmFtZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlBhcmFtSW1wbCNpc0hlYWRlciA8ZW0+SGVhZGVyPC9lbT59PC9saT4NCi0gKiA8L3VsPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYlBhcmFtSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVdlYlBhcmFtIHsNCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLaW5kKCkgPGVtPktpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldEtpbmQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFdlYlBhcmFtS2luZCBLSU5EX0VERUZBVUxUID0gV2ViUGFyYW1LaW5kLklOOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRLaW5kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFdlYlBhcmFtS2luZCBraW5kID0gS0lORF9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlTmFtZSgpIDxlbT5UeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFR5cGVOYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FX0VERUZBVUxUID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVOYW1lKCkgPGVtPlR5cGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VHlwZU5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGVOYW1lID0gVFlQRV9OQU1FX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnROYW1lKCkgPGVtPlBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UGFydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUX05BTUVfRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydE5hbWUoKSA8ZW0+UGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRQYXJ0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgcGFydE5hbWUgPSBQQVJUX05BTUVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hlYWRlcigpIDxlbT5IZWFkZXI8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2lzSGVhZGVyKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEhFQURFUl9FREVGQVVMVCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIZWFkZXIoKSA8ZW0+SGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNpc0hlYWRlcigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGhlYWRlciA9IEhFQURFUl9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYlBhcmFtSW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFdlYlBhcmFtS2luZCBnZXRLaW5kKCkgew0KLQkJcmV0dXJuIGtpbmQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRLaW5kKFdlYlBhcmFtS2luZCBuZXdLaW5kKSB7DQotCQlXZWJQYXJhbUtpbmQgb2xkS2luZCA9IGtpbmQ7DQotCQlraW5kID0gbmV3S2luZCA9PSBudWxsID8gS0lORF9FREVGQVVMVCA6IG5ld0tpbmQ7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19LSU5ELCBvbGRLaW5kLCBraW5kKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgew0KLQkJcmV0dXJuIHR5cGVOYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoU3RyaW5nIG5ld1R5cGVOYW1lKSB7DQotCQlTdHJpbmcgb2xkVHlwZU5hbWUgPSB0eXBlTmFtZTsNCi0JCXR5cGVOYW1lID0gbmV3VHlwZU5hbWU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UWVBFX05BTUUsIG9sZFR5cGVOYW1lLCB0eXBlTmFtZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0TmFtZSgpIHsNCi0JCXJldHVybiBwYXJ0TmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBhcnROYW1lKFN0cmluZyBuZXdQYXJ0TmFtZSkgew0KLQkJU3RyaW5nIG9sZFBhcnROYW1lID0gcGFydE5hbWU7DQotCQlwYXJ0TmFtZSA9IG5ld1BhcnROYW1lOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fUEFSVF9OQU1FLCBvbGRQYXJ0TmFtZSwgcGFydE5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgew0KLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKSB7DQotCQlTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOw0KLQkJdGFyZ2V0TmFtZXNwYWNlID0gbmV3VGFyZ2V0TmFtZXNwYWNlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSwgb2xkVGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzSGVhZGVyKCkgew0KLQkJcmV0dXJuIGhlYWRlcjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEhlYWRlcihib29sZWFuIG5ld0hlYWRlcikgew0KLQkJYm9vbGVhbiBvbGRIZWFkZXIgPSBoZWFkZXI7DQotCQloZWFkZXIgPSBuZXdIZWFkZXI7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19IRUFERVIsIG9sZEhlYWRlciwgaGVhZGVyKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQ6DQotCQkJCXJldHVybiBnZXRLaW5kKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RZUEVfTkFNRToNCi0JCQkJcmV0dXJuIGdldFR5cGVOYW1lKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRToNCi0JCQkJcmV0dXJuIGdldFBhcnROYW1lKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXJldHVybiBnZXRUYXJnZXROYW1lc3BhY2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSEVBREVSOg0KLQkJCQlyZXR1cm4gaXNIZWFkZXIoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fS0lORDoNCi0JCQkJc2V0S2luZCgoV2ViUGFyYW1LaW5kKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UWVBFX05BTUU6DQotCQkJCXNldFR5cGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRToNCi0JCQkJc2V0UGFydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJc2V0VGFyZ2V0TmFtZXNwYWNlKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0hFQURFUjoNCi0JCQkJc2V0SGVhZGVyKChCb29sZWFuKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQ6DQotCQkJCXNldEtpbmQoS0lORF9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FOg0KLQkJCQlzZXRUeXBlTmFtZShUWVBFX05BTUVfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRToNCi0JCQkJc2V0UGFydE5hbWUoUEFSVF9OQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlzZXRUYXJnZXROYW1lc3BhY2UoVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSEVBREVSOg0KLQkJCQlzZXRIZWFkZXIoSEVBREVSX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19LSU5EOg0KLQkJCQlyZXR1cm4ga2luZCAhPSBLSU5EX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UWVBFX05BTUU6DQotCQkJCXJldHVybiBUWVBFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGVOYW1lICE9IG51bGwgOiAhVFlQRV9OQU1FX0VERUZBVUxULmVxdWFscyh0eXBlTmFtZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRToNCi0JCQkJcmV0dXJuIFBBUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcGFydE5hbWUgIT0gbnVsbCA6ICFQQVJUX05BTUVfRURFRkFVTFQuZXF1YWxzKHBhcnROYW1lKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJcmV0dXJuIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldE5hbWVzcGFjZSAhPSBudWxsIDogIVRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0hFQURFUjoNCi0JCQkJcmV0dXJuIGhlYWRlciAhPSBIRUFERVJfRURFRkFVTFQ7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiIChraW5kOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChraW5kKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZU5hbWU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHR5cGVOYW1lKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgcGFydE5hbWU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHBhcnROYW1lKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgdGFyZ2V0TmFtZXNwYWNlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXROYW1lc3BhY2UpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBoZWFkZXI6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKGhlYWRlcik7DQotCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0NCi19IC8vSVdlYlBhcmFtSW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViU2VydmljZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGU4NDVlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklXZWIgU2VydmljZTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwjZ2V0U2VydmljZUVuZHBvaW50IDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlSW1wbCNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsI2dldFdzZGxMb2NhdGlvbiA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJTZXJ2aWNlSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVdlYlNlcnZpY2Ugew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50KCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn0nIHJlZmVyZW5jZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlcnZpY2VFbmRwb2ludDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9IG51bGw7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUOw0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lKCkgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UG9ydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUVfRURFRkFVTFQgPSBudWxsOw0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWUoKSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgcG9ydE5hbWUgPSBQT1JUX05BTUVfRURFRkFVTFQ7DQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbExvY2F0aW9uKCkgPGVtPldzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdzZGxMb2NhdGlvbigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOw0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbExvY2F0aW9uKCkgPGVtPldzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdzZGxMb2NhdGlvbigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgd3NkbExvY2F0aW9uID0gV1NETF9MT0NBVElPTl9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCi0JCXJldHVybiBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNlcnZpY2VFbmRwb2ludCgpIHsNCi0JCWlmIChzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbCAmJiBzZXJ2aWNlRW5kcG9pbnQuZUlzUHJveHkoKSkNCi0JCXsNCi0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU2VydmljZUVuZHBvaW50ID0gKEludGVybmFsRU9iamVjdClzZXJ2aWNlRW5kcG9pbnQ7DQotCQkJc2VydmljZUVuZHBvaW50ID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpZVJlc29sdmVQcm94eShvbGRTZXJ2aWNlRW5kcG9pbnQpOw0KLQkJCWlmIChzZXJ2aWNlRW5kcG9pbnQgIT0gb2xkU2VydmljZUVuZHBvaW50KQ0KLQkJCXsNCi0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5ULCBvbGRTZXJ2aWNlRW5kcG9pbnQsIHNlcnZpY2VFbmRwb2ludCkpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBiYXNpY0dldFNlcnZpY2VFbmRwb2ludCgpIHsNCi0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZXJ2aWNlRW5kcG9pbnQoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBuZXdTZXJ2aWNlRW5kcG9pbnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugb2xkU2VydmljZUVuZHBvaW50ID0gc2VydmljZUVuZHBvaW50Ow0KLQkJc2VydmljZUVuZHBvaW50ID0gbmV3U2VydmljZUVuZHBvaW50Ow0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJew0KLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCwgb2xkU2VydmljZUVuZHBvaW50LCBuZXdTZXJ2aWNlRW5kcG9pbnQpOw0KLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsNCi0JCX0NCi0JCXJldHVybiBtc2dzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50KElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgbmV3U2VydmljZUVuZHBvaW50KSB7DQotCQlpZiAobmV3U2VydmljZUVuZHBvaW50ICE9IHNlcnZpY2VFbmRwb2ludCkNCi0JCXsNCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsNCi0JCQlpZiAoc2VydmljZUVuZHBvaW50ICE9IG51bGwpDQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZXJ2aWNlRW5kcG9pbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCBtc2dzKTsNCi0JCQlpZiAobmV3U2VydmljZUVuZHBvaW50ICE9IG51bGwpDQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZXJ2aWNlRW5kcG9pbnQpLmVJbnZlcnNlQWRkKHRoaXMsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCBtc2dzKTsNCi0JCQltc2dzID0gYmFzaWNTZXRTZXJ2aWNlRW5kcG9pbnQobmV3U2VydmljZUVuZHBvaW50LCBtc2dzKTsNCi0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQotCQl9DQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCwgbmV3U2VydmljZUVuZHBvaW50LCBuZXdTZXJ2aWNlRW5kcG9pbnQpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgew0KLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKSB7DQotCQlTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOw0KLQkJdGFyZ2V0TmFtZXNwYWNlID0gbmV3VGFyZ2V0TmFtZXNwYWNlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFLCBvbGRUYXJnZXROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpIHsNCi0JCXJldHVybiBwb3J0TmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBuZXdQb3J0TmFtZSkgew0KLQkJU3RyaW5nIG9sZFBvcnROYW1lID0gcG9ydE5hbWU7DQotCQlwb3J0TmFtZSA9IG5ld1BvcnROYW1lOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUUsIG9sZFBvcnROYW1lLCBwb3J0TmFtZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRXc2RsTG9jYXRpb24oKSB7DQotCQlyZXR1cm4gd3NkbExvY2F0aW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0V3NkbExvY2F0aW9uKFN0cmluZyBuZXdXc2RsTG9jYXRpb24pIHsNCi0JCVN0cmluZyBvbGRXc2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247DQotCQl3c2RsTG9jYXRpb24gPSBuZXdXc2RsTG9jYXRpb247DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04sIG9sZFdzZGxMb2NhdGlvbiwgd3NkbExvY2F0aW9uKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVDoNCi0JCQkJaWYgKHNlcnZpY2VFbmRwb2ludCAhPSBudWxsKQ0KLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlcnZpY2VFbmRwb2ludCkuZUludmVyc2VSZW1vdmUodGhpcywgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVMsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsIG1zZ3MpOw0KLQkJCQlyZXR1cm4gYmFzaWNTZXRTZXJ2aWNlRW5kcG9pbnQoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upb3RoZXJFbmQsIG1zZ3MpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCXJldHVybiBiYXNpY1NldFNlcnZpY2VFbmRwb2ludChudWxsLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UOg0KLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJCQlyZXR1cm4gYmFzaWNHZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FOg0KLQkJCQlyZXR1cm4gZ2V0UG9ydE5hbWUoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OOg0KLQkJCQlyZXR1cm4gZ2V0V3NkbExvY2F0aW9uKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVDoNCi0JCQkJc2V0U2VydmljZUVuZHBvaW50KChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXNldFRhcmdldE5hbWVzcGFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRToNCi0JCQkJc2V0UG9ydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OOg0KLQkJCQlzZXRXc2RsTG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCXNldFNlcnZpY2VFbmRwb2ludCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSludWxsKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXNldFRhcmdldE5hbWVzcGFjZShUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRToNCi0JCQkJc2V0UG9ydE5hbWUoUE9SVF9OQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT046DQotCQkJCXNldFdzZGxMb2NhdGlvbihXU0RMX0xPQ0FUSU9OX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgOiAhVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVC5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUU6DQotCQkJCXJldHVybiBQT1JUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBvcnROYW1lICE9IG51bGwgOiAhUE9SVF9OQU1FX0VERUZBVUxULmVxdWFscyhwb3J0TmFtZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTjoNCi0JCQkJcmV0dXJuIFdTRExfTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxMb2NhdGlvbiAhPSBudWxsIDogIVdTRExfTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKHdzZGxMb2NhdGlvbik7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiICh0YXJnZXROYW1lc3BhY2U6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHBvcnROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChwb3J0TmFtZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxMb2NhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQod3NkbExvY2F0aW9uKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLX0gLy9JV2ViU2VydmljZUltcGwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VQcm9qZWN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJTZXJ2aWNlUHJvamVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWIxM2YzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VQcm9qZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIFNlcnZpY2UgUHJvamVjdDwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsI2dldFdlYlNlcnZpY2VzIDxlbT5XZWIgU2VydmljZXM8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlczwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlUHJvamVjdEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJTZXJ2aWNlUHJvamVjdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlUHJvamVjdCB7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWJTZXJ2aWNlcygpIDxlbT5XZWIgU2VydmljZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZXMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRUxpc3Q8SVdlYlNlcnZpY2U+IHdlYlNlcnZpY2VzOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXROYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfUFJPSkVDVDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZT4gZ2V0V2ViU2VydmljZXMoKSB7DQotCQlpZiAod2ViU2VydmljZXMgPT0gbnVsbCkNCi0JCXsNCi0JCQl3ZWJTZXJ2aWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJV2ViU2VydmljZT4oSVdlYlNlcnZpY2UuY2xhc3MsIHRoaXMsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUyk7DQotCQl9DQotCQlyZXR1cm4gd2ViU2VydmljZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZT4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpIHsNCi0JCWlmIChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzID09IG51bGwpDQotCQl7DQotCQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPihJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMpOw0KLQkJfQ0KLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotCQlyZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsNCi0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsNCi0JCW5hbWUgPSBuZXdOYW1lOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRXZWJTZXJ2aWNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM6DQotCQkJCXJldHVybiBnZXRXZWJTZXJ2aWNlcygpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRToNCi0JCQkJcmV0dXJuIGdldE5hbWUoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM6DQotCQkJCWdldFdlYlNlcnZpY2VzKCkuY2xlYXIoKTsNCi0JCQkJZ2V0V2ViU2VydmljZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElXZWJTZXJ2aWNlPiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUzoNCi0JCQkJZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmNsZWFyKCk7DQotCQkJCWdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+KW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRToNCi0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM6DQotCQkJCWdldFdlYlNlcnZpY2VzKCkuY2xlYXIoKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuY2xlYXIoKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRToNCi0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gd2ViU2VydmljZXMgIT0gbnVsbCAmJiAhd2ViU2VydmljZXMuaXNFbXB0eSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyAhPSBudWxsICYmICFzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzLmlzRW1wdHkoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU6DQotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLX0gLy9JV2ViU2VydmljZVByb2plY3RJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MWM1OThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZTsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIFR5cGU8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYlR5cGVJbXBsIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwgaW1wbGVtZW50cyBJV2ViVHlwZSB7DQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJUeXBlSW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1RZUEU7DQotCX0NCi0NCi19IC8vSVdlYlR5cGVJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL0pheFdzRG9tUnVudGltZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0MDM0MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMgZXh0ZW5kcyBOTFMgew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV3NEb21TdGFydHVwUGFydGljaXBhbnRfU3RhcnR1cF9Kb2JfTWVzc2FnZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya3NwYWNlQ1VGaW5kZXJfTE9BRElOR19DQU5DRUxFRDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfRE9NX0xPQURJTkc7DQotCQ0KLQlzdGF0aWMgew0KLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUNCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLmNsYXNzKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzKCkgew0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL0pheFdzRG9tUnVudGltZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5ZjhmZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW47DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gew0KLQ0KLQkvLyBUaGUgcGx1Zy1pbiBJRA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIjsNCi0NCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQlwcml2YXRlIHN0YXRpYyBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4gcGx1Z2luOw0KLQkNCi0JLyoqDQotCSAqIFRoZSBjb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIEpheFdzRG9tUnVudGltZVBsdWdpbigpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7DQotCQlwbHVnaW4gPSB0aGlzOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlwbHVnaW4gPSBudWxsOw0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsNCi0JCXJldHVybiBwbHVnaW47DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2OWRlNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudF9TdGFydHVwX0pvYl9NZXNzYWdlCT1Mb2FkaW5nIFdlYiBTZXJ2aWNlIERPTS4uLg0KLVdvcmtzcGFjZUNVRmluZGVyX0xPQURJTkdfQ0FOQ0VMRUQ9SkFYLVdTIERPTSBsb2FkaW5nIGNhbmNlbGVkDQotSkFYV1NfRE9NX0xPQURJTkc9TG9hZGluZyBET00gZm9yIEpBWC1XUyBXZWIgU2VydmljZXMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvTmFtZWRFeHRlbnNpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvTmFtZWRFeHRlbnNpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3Y2E1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC91dGlsL05hbWVkRXh0ZW5zaW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklOYW1lZEV4dGVuc2lvbkluZm87DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHtAbGluayBJTmFtZWRFeHRlbnNpb25JbmZvfS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTmFtZWRFeHRlbnNpb25JbmZvIGltcGxlbWVudHMgSU5hbWVkRXh0ZW5zaW9uSW5mbw0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7DQotDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotCXByb3RlY3RlZCBOYW1lZEV4dGVuc2lvbkluZm8oZmluYWwgU3RyaW5nIHBJZCwgZmluYWwgU3RyaW5nIHBMYWJlbCkNCi0Jew0KLQkJdGhpcy5pZCA9IHBJZDsNCi0JCXRoaXMubmFtZSA9IHBMYWJlbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkNCi0Jew0KLQkJcmV0dXJuIGlkOw0KLQl9DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpDQotCXsNCi0JCXJldHVybiBuYW1lOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdXRpbC9YcFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdXRpbC9YcFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDY0MjJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvWHBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0NCi0vKioNCi0gKiBVdGlsaXR5IGNsYXNzIGZvciB3b3JraW5nIHdpdGggZXh0ZW5kaW9uIHBvaW50cy4NCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgWHBVdGlsDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEID0gIkNvbnN1bWVyVHlwZSBleHRlbnNpb24gbm90IHByb3Blcmx5IHJlZ2lzdGVyZWQgKGVycm9yIGluIHBsdWdpbi54bWwpIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhQX0lNUExFTUVOVEFUSU9OX0VMRU1FTlQgPSAiaW1wbGVtZW50YXRpb24iOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiAgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gZXh0DQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgZXh0ZW50aW9uIGltcGxlbWVudGF0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUltcGxlbWVudGF0aW9uKGZpbmFsIElFeHRlbnNpb24gZXh0KQ0KLQl7DQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbCA6IGV4dC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSkNCi0JCXsNCi0JCQlpZiAoZWwuZ2V0TmFtZSgpLmVxdWFscyhYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UKSkNCi0JCQl7DQotCQkJCXRyeQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gZWwuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UX0NMQVNTX0FUVFIpOw0KLQkJCQl9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGUpDQotCQkJCXsNCi0JCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gY3JlYXRlIGV4dGVuc2lvbiIsIGUpOyAvLyROT04tTkxTLTEkDQotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWxvZ2dlcigpLmxvZ0Vycm9yKEVYVEVOU0lPTl9OT1RfUFJPUEVSTFlfUkVHSVNURVJFRCk7DQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQpOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lBbm5vdGF0aW9uU2VyaWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQW5ub3RhdGlvblNlcmlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWM4ZWVlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lBbm5vdGF0aW9uU2VyaWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi0NCi0vKioNCi0gKiBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IGludGVuZCB0byBkbyBzZXJpYWxpemF0aW9uIGZvciANCi0gKiBET00gb2JqZWN0cy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvblNlcmlhbGl6ZXIgDQotew0KLQlwdWJsaWMgdm9pZCBzYXZlKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSUNvbXBpbGF0aW9uVW5pdEZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDY2OTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSUNvbXBpbGF0aW9uVW5pdEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRzIGEgdmlzaXRvciBwYXR0ZXJuIGZvciB0cmF2ZXJzaW5nIGNvbXBpbGF0aW9uIHVuaXQuIFRoaXMgaW50ZXJmYWNlIGRvZXMgbm90IGRlZmluZSB3aGF0IHNldCBvZiBjb21waWxhdGlvbg0KLSAqIHVuaXRzIHdpbGwgYmUgdHJhdmVyZXNlZC4gVGhpcyBjb3VsZCBiZSBhIHNpbmdsZSBqYXZhIHByb2plY3QsIHRoZSB3aG9sZSB3b3Jrc3BhY2Ugb3IganVzdCBhIGdpdmVuIHBhY2thZ2UuIFRoZSBzZXQgb2YNCi0gKiB0cmF2ZXJzZWQgY29tcGlsYXRpb24gdW5pdHMgaXMgbGVmdCB1cCB0byB0aGUgaW1wbGVtZW50YXRpb24uIE5ldmVydGhlbGVzcyBhcyB0aGVzZSBjb21waWxhdGlvbiB1bml0cyBhcmUgYWx3YXlzIGNvbnRhaW5lZA0KLSAqIGluc2lkZSBhIGphdmEgcHJvamVjdCwgdGhlIDwvYz5JQ29tcGlsYXRpb25Vbml0SGFuZGxlci5oYW5kbGVQcm9qZWN0KElKYXZhUHJvamVjdCk8L2M+IGhhcyB0byBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIHRvDQotICogbm90aWZ5IHRoZSBoYW5kbGVyIGZvciBlYWNoIHByb2plY3QgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgY29tcGlsYXRpb24gdW5pdCBoYW5kbGVyIHdpbGwgYmUgZmlyc3Qgbm90aWZpZWQgdGhhdCB0aGUgcHJvY2Vzc2luZw0KLSAqIG9mIGdpdmVuIHByb2plY3QgaGFzIGJlZ2FuIGFuZCBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGl0IHdpbGwgYmUgbm90aWZpZWQgZm9yIGFsbCBhbm5vdGF0aW9ucyBpbiB0aGlzIHByb2plY3QgZGlzY292ZXJlZCBieQ0KLSAqIHRoZSBnaXZlbiBpbXBsZW1lbnRhdGlvbi4gDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcg0KLXsNCi0JLyoqDQotCSAqIFN0YXJ0cyB0aGUgdHJhdmVyc2FsIG9mIGNvbXBpbGF0aW9uIHVuaXRzDQotCSAqIEBwYXJhbSBtb25pdG9yIC0gdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZCBmb3IgdGhlIHRyYXZlcnNhbC4NCi0JICogQHBhcmFtIGN1SGFuZGxlciAtIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlciB0byBiZSBub3RpZmllZCBmb3IgYSBnaXZlbiBwcm9qZWN0DQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAtIHRocm93biBpZiB1bmV4cGVjdGVkIHByb2JsZW0gb2NjdXJyZWQgd2hpbGUgdHJhdmVyc2luZyBhbm5vdGF0aW9ucw0KLQkgKi8NCi0JcHVibGljIHZvaWQgZmluZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElDb21waWxhdGlvblVuaXRIYW5kbGVyIGN1SGFuZGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzYTMxNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQ29tcGlsYXRpb25Vbml0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi0NCi0vKioNCi0gKiBBIGxpc3RlbmVyIGZvciBldmVudHMgaXNzZXVkIGJ5IGFuIDxjPklDb21waWxhdGlvblVuaXRGaW5kZXI8L2M+IGluc3RhbmNlIGR1cmluZyBjb21waWxhdGlvbiB1bml0IHRyYXZlcnNhbHMNCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXINCi17DQotCS8qKg0KLQkgKiBjYWxsZWQgYnkgdGhlIDxjPntAbGluayBJQ29tcGlsYXRpb25Vbml0RmluZGVyfTwvYz4gaW5zdGFuY2Ugd2hlbiBpdCBoYXMgc3RhcnRlZCB0byB0cmF2ZXJzZSB0aGUgYW5ub3RhdGlvbiBzZXQuIEFsbCBjYWxscyB0byA8Yz5oYW5kbGUoLi4uKTwvYz4NCi0JICogbWV0aG9kcyBpcyBpbnNpZGUgYSBzdGFydGVkLWZpbmlzaGVkIGJsb2NrLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnRlZCgpOw0KLQ0KLQkvKioNCi0JICogY2FsbGVkIGJ5IHRoZSA8Yz57QGxpbmsgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcn08L2M+IGluc3RhbmNlIHdoZW4gaXQgaGFzIGZpbmlzaGVkIHRvIHRyYXZlcnNlIHRoZSBhbm5vdGF0aW9uIHNldC4NCi0JICovDQotCXB1YmxpYyB2b2lkIGZpbmlzaGVkKCk7DQotDQotCS8qKg0KLQkgKiBDYWxsZWQgd2hlbiB0aGUgPGM+e0BsaW5rIElDb21waWxhdGlvblVuaXRGaW5kZXJ9PC9jPiBpbnN0YW5jZSBmb3VuZCBhIGNvbXBpbGF0aW9uIHVuaXQuIFRoaXMgbWV0aG9kIGlzIGF3bGF5cyBjYWxsZWQgYWZ0ZXIgYSBjYWxsIHRvIDxjPntAbGluayAjaGFuZGxlKEphdmFQcm9qZWN0KSBoYW5kbGUoSmF2YVByb2plY3QpfTwvYz4uDQotCSAqIFRoZSByZXBvcnRlZCBjb21waWxhdGlvbiB1bml0IGlzIGd1YXJhbnRlZWQgdG8gYmUgZm91bmQgaW5zaWRlIHRoZSA8Yz5KYXZhUHJvamVjdDwvYz4gcmVwb3J0ZWQgYnkgdGhlIGxhc3QgY2FsbCB0byA8Yz57QGxpbmsjaGFuZGxlKEphdmFQcm9qZWN0KSBoYW5kbGUoSmF2YVByb2plY3QpfTwvYz4uDQotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBmb3IgZWFjaCBjb21waWxhdGlvbiB1bml0DQotCSAqIA0KLQkgKiBAcGFyYW0gY3UgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0IGZvdW5kIGJ5IHRoZSBmaW5kZXINCi0JICovDQotCXB1YmxpYyB2b2lkIGhhbmRsZShJQ29tcGlsYXRpb25Vbml0IGN1KTsNCi0NCi0JLyoqDQotCSAqIENhbGxlZCB3aGVuIHRoZSA8Yz57QGxpbmsgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcn08L2M+IGluc3RhbmNlIGZvdW5kIGEgamF2YSBwcm9qZWN0LiBUaGlzIG1ldGhvZCBpcyBhbHdheXMgY2FsbGVkIGJlZm9yZSB0aGUgPGM+e0BsaW5rICNoYW5kbGUoSUNvbXBpbGF0aW9uVW5pdCl9PC9jPg0KLQkgKiBmb3IgYW55IGNvbXBpbGF0aW9uIHVuaXQgZm91bmQgaW4gdGhpcyBwcm9qZWN0LiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgZm9yIGVhY2ggZm91bmQgcHJvamVjdC4NCi0JICogDQotCSAqIEBwYXJhbSBqcHJqIC0NCi0JICogICAgICAgICAgICB0aGUgamF2YSBwcm9qZWN0IGZvdW5kIGJ5IHRoZSBmaW5kZXINCi0JICovDQotCXB1YmxpYyB2b2lkIGhhbmRsZShJSmF2YVByb2plY3QganByaik7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSU1vZGVsRWxlbWVudFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JTW9kZWxFbGVtZW50U3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwMGZjNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JTW9kZWxFbGVtZW50U3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcg0KLXsNCi0JcHVibGljIERvbVV0aWwgdXRpbCgpOw0KLQlwdWJsaWMgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSgpOwkNCi0JcHVibGljIElMb2dnZXIgbG9nZ2VyKCk7DQotCXB1YmxpYyBJRE9NIGdldERvbUJlaW5nTG9hZGVkKCk7DQotCXB1YmxpYyBEb21GYWN0b3J5IGRvbUZhY3RvcnkoKTsJDQotCXB1YmxpYyBJSmF2YU1vZGVsIGphdmFNb2RlbCgpOwkNCi0JcHVibGljIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JUHJvamVjdFNlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lQcm9qZWN0U2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjVhZDVmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lQcm9qZWN0U2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotDQotLyoqDQotICogU3BlY2lmaWVzIHdoYXQgamF2YSBwcm9qZWN0cyB3aWxsIGJlIHRyYXZlcnNlZCBieSBhIGdpdmVuIDxjPklDb21waWxhdGlvblVuaXRGaW5kZXI8L2M+IGluc3RhbmNlLiBJZiBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQNCi0gKiBzZWxlY3RvcnMgYXBwcm92ZWQgdGhlIHByb2plY3QgaS5lLiA8Yz5JUHJvamVjdFNlbGVjdG9yLmFwcHJvdmUoSUphdmFQcm9qZWN0KTwvYz4gcmV0dXJuZWQgdHJ1ZSwgdGhlbiB0aGlzIHByb2plY3Qgd2lsbA0KLSAqIGJlIHRyYXZlcnNlZC4gSS5lLiB0aGUgcHJvamVjdCBuZWVkcyB0byBiZSByZWplY3RlZCBieSBhbGwgdGhlIHNlbGVjdG9ycyBpbiBvcmRlciBub3QgdG8gYmUgdHJhdmVyc2VkLg0KLSAqIA0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIHNob3VsZCByZWplY3QgYSBwcm9qZWN0IHRoYXQgaXQgaGFzIG5vIGtub3dsZWRnZSBhYm91dC4NCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJUHJvamVjdFNlbGVjdG9yDQotew0KLQkvKioNCi0JICogQXBwcm92ZXMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGZvciB0cmF2ZXJzYWwNCi0JICogQHBhcmFtIHByaiAtIHRoZSBwcm9qZWN0IHRvIGFwcHJvdmUgb3IgcmVqZWN0DQotCSAqIEByZXR1cm4gLSB0cnVlIGlmIHRoZSBwcm9qZWN0IHNob3VsZCBiZSB0cmF2ZXJzZWQgYWNjb3JkaW5nIHRvIHRoaXMgc2VsZWN0b3IsIGZhbHNlIG90aGVyd2lzZS4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaik7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI5ZDc3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBDb250YWlucyB1dGlsaXR5IG1ldGhvZHMgZm9yIGNhbGN1bGF0aW5nIGRlZmF1bHQgdmFsdWVzIG9mIHNvbWUgYXR0cmlidXRlcy9wcm9wZXJ0aWVzIGluIA0KLSAqIGFubm90YXRpb25zIGFuZCBET00gb2JqZWN0cy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSRyA9ICJhcmciOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk4gPSAicmV0dXJuIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0UgPSAiUmVzcG9uc2UiOyAvLyROT04tTkxTLTEkDQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyB0aGUgU09BUEJpbmRpbmdTdHlsZS4gSWYgdGhlcmUgaXMgYSB2YWx1ZSBmb3Igc3R5bGUgYXR0cmlidXRlIGluIDxjb2RlPnNiQW5ub3RhdGlvbjwvY29kZT4gcmV0dXJucyB0aGF0IHZhbHVlDQotCSAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4NCi0JICogQHBhcmFtIHNiQW5ub3RhdGlvbg0KLQkgKiBAcmV0dXJuIHRoZSBzdHlsZQ0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nU3R5bGUgZGVmaW5lU0JTdHlsZShmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBzYkFubm90YXRpb24pDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IHNiQW5ub3RhdGlvbiE9bnVsbCA/IHNiQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNUWUxFX0FUVFJJQlVURSkgOiBudWxsOw0KLQkJaWYgKHZhbHVlIT1udWxsICYmIFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1NUWUxFX1JQQy5lbmRzV2l0aCh2YWx1ZS50cmltKCkpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nU3R5bGUuUlBDOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIFNPQVBCaW5kaW5nVXNlLiBJZiB0aGVyZSBpcyBhIHZhbHVlIGZvciB1c2UgYXR0cmlidXRlIGluIDxjb2RlPnNiQW5ub3RhdGlvbjwvY29kZT4gcmV0dXJucyB0aGF0IHZhbHVlDQotCSAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4NCi0JICogQHBhcmFtIHNiQW5ub3RhdGlvbg0KLQkgKiBAcmV0dXJuIHRoZSBzdHlsZQ0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nVXNlIGRlZmluZVNCVXNlKGZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHNiQW5ub3RhdGlvbikgew0KLQkJZmluYWwgU3RyaW5nIHZhbHVlID0gc2JBbm5vdGF0aW9uIT1udWxsID8gc2JBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoU0JBbm5vdGF0aW9uRmVhdHVyZXMuVVNFX0FUVFJJQlVURSkgOiBudWxsOw0KLQkJaWYodmFsdWUhPW51bGwgJiYgU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfVVNFX0VOQ09ERUQuZW5kc1dpdGgodmFsdWUudHJpbSgpKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1VzZS5FTkNPREVEOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gU09BUEJpbmRpbmdVc2UuTElURVJBTDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIFNPQVBCaW5kaW5nVXNlLiBJZiB0aGVyZSBpcyBhIHZhbHVlIGZvciBwYXJhbWV0ZXJTdHlsZSBhdHRyaWJ1dGUgaW4gPGNvZGU+c2JBbm5vdGF0aW9uPC9jb2RlPiANCi0JICogcmV0dXJucyB0aGF0IHZhbHVlIG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4NCi0JICogQHBhcmFtIHNiQW5ub3RhdGlvbg0KLQkgKiBAcmV0dXJuIHRoZSBzdHlsZQ0KLQkgKi8JDQotCXB1YmxpYyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGRlZmluZVNCUGFyYW1ldGVyU3R5bGUoZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gc2JBbm5vdGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFsdWUgPSBzYkFubm90YXRpb24hPW51bGwgPyBzYkFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTQkFubm90YXRpb25GZWF0dXJlcy5QQVJBTUVURVJfU1RZTEVfQVRUUklCVVRFKSA6IG51bGw7DQotCQlpZiAodmFsdWUhPW51bGwgJiYgU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfUEFSQU1FVEVSX1NUWUxFX0JBUkUuZW5kc1dpdGgodmFsdWUudHJpbSgpKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkU7DQotCQl9DQotCQkNCi0JCXJldHVybiBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQ7CQkNCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwYXJhbWV0ZXIgbmFtZSBhY2NvcmRpbmcgdG8gSlNSLTE4MSBwb2ludCA0LjQgLSBXZWJQYXJhbSBuYW1lDQotCSAqIGF0dHJpYnV0ZSAgDQotCSAqIEBwYXJhbSB3ZWJNZXRob2QgdGhlIG1ldGhvZCBob2xkaW5nIHRoZSBwYXJhbWV0ZXINCi0JICogQHBhcmFtIHBhcmFtUG9zaXRpb24gdGhlIHBhcmFtZXRlciBwb3NpdGlvbiBpbiBtZXRob2QgYXJndW1lbnRzIGxpc3Qgc3RhcnRpbmcgd2l0aCAwDQotCSAqIEByZXR1cm4gY2FsY3VsYXRlZCBuYW1lDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNXZWJQYXJhbURlZmF1bHROYW1lKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kLCBmaW5hbCBpbnQgcGFyYW1Qb3NpdGlvbikNCi0Jew0KLQkJaWYod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCAmJg0KLQkJICAgd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKT09U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFKSANCi0JCXsNCi0JCQlyZXR1cm4gd2ViTWV0aG9kLmdldE5hbWUoKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIEFSRyArIHBhcmFtUG9zaXRpb247IA0KLQl9DQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcGFyYW1ldGVyIG5hbWUgYWNjb3JkaW5nIHRvIEpTUi0xODEgcG9pbnQgNC40IC0gV2ViUGFyYW0gbmFtZQ0KLQkgKiBhdHRyaWJ1dGUgDQotCSAqIEBwYXJhbSB3ZWJQYXJhbQ0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNXZWJQYXJhbURlZmF1bHROYW1lKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkgDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOw0KLQkJcmV0dXJuIGNhbGNXZWJQYXJhbURlZmF1bHROYW1lKHdlYk1ldGhvZCwgZ2V0UGFyYW1Qb3NpdGlvbih3ZWJNZXRob2QsIHdlYlBhcmFtKSk7CQkNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENhbGN1bGF0ZXMgdGhlIHBvc2l0aW9uIG9mIDxjb2RlPnBhcmFtPC9jb2RlPiBpbiA8Y29kZT5tZXRob2Q8L2NvZGU+IHNpZ25hdHVyZSBzdGFydGluZyBmcm9tIDANCi0JICogQHBhcmFtIHdlYk1ldGhvZA0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogQHJldHVybiB0aGUgcGFyYW0gcG9zaXRpb24NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT53ZWJNZXRob2Q8L2NvZGU+IGRvZXMgbm90IGNvbnRhaW4gPGNvZGU+cGFyYW08L2NvZGU+DQotCSAqLw0KLQlwcm90ZWN0ZWQgaW50IGdldFBhcmFtUG9zaXRpb24oZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIGZpbmFsIElXZWJQYXJhbSBwYXJhbSkNCi0Jew0KLQkJaW50IHBvc2l0aW9uID0gMDsNCi0JCWZvciAoSVdlYlBhcmFtIHdlYlBhcmFtIDogd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKSkgDQotCQl7DQotCQkJaWYgKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKCJyZXR1cm4iKSkgey8vJE5PTi1OTFMtMSQNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCWlmICh3ZWJQYXJhbT09cGFyYW0pIHsNCi0JCQkJcmV0dXJuIHBvc2l0aW9uOw0KLQkJCX0NCi0JCQkNCi0JCQlwb3NpdGlvbisrOw0KLQkJfQ0KLQkJDQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQYXJhbWV0ZXJbIiArIHBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkgKyAiXSB3YXMgbm90IGZvdW5kIGluIG1ldGhvZCBbIiArIHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpICsgIl0iKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIHBhcmFtZXRlciBuYW1lIGFjY29yZGluZyB0byBKU1ItMTgxIHBvaW50IDQuNCAtIFdlYlBhcmFtIHRhcmdldCBOUy4NCi0JICogQHBhcmFtIHdlYk1ldGhvZCB0aGUgbWV0aG9kIGhvbGRpbmcgdGhlIHBhcmFtZXRlcg0KLQkgKiBAcGFyYW0gd2ViUGFyYW0NCi0JICogQHJldHVybiBjYWxjdWxhdGVkIE5TDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyhmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlpZih3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UICYmDQotCQkgICB3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQgJiYNCi0JCSAgICF3ZWJQYXJhbS5pc0hlYWRlcigpKSANCi0JCXsNCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdlYk1ldGhvZC5lQ29udGFpbmVyKCkpLmdldFRhcmdldE5hbWVzcGFjZSgpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBraW5kIGZvciB3ZWIgcGFyYW1ldGVycyAtIHJldHVybnMge0BsaW5rIFdlYlBhcmFtS2luZCNJTn0NCi0JICovDQotCXB1YmxpYyBXZWJQYXJhbUtpbmQgZ2V0RGVmYXVsdFBhcmFtS2luZCgpIHsNCi0JCXJldHVybiBXZWJQYXJhbUtpbmQuSU47CQkNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gZmFsc2UgYmVjYXVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgV2ViUGFyYW0oaGVhZGVyKSBpcyBmYWxzZQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFBhcmFtSW5IZWRhZXIoKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwYXJhbWV0ZXIgbmFtZSBhY2NvcmRpbmcgdG8gSlNSLTE4MSBwb2ludCA0LjUgLSBXZWJSZXN1bHQgbmFtZS4NCi0JICogQHBhcmFtIHdlYk1ldGhvZCB0aGUgbWV0aG9kIGhvbGRpbmcgdGhlIHBhcmFtZXRlcg0KLQkgKiBAcmV0dXJuIGNhbGN1bGF0ZWQgbmFtZQ0KLQkgKi8JDQotCXB1YmxpYyBTdHJpbmcgY2FsY1dlYlJlc3VsdERlZmF1bHROYW1lKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKSANCi0Jew0KLQkJaWYod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCAmJiANCi0JCSAgIHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk9PVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSkNCi0JCXsNCi0JCQlyZXR1cm4gd2ViTWV0aG9kLmdldE5hbWUoKSArIFJFU1BPTlNFOyANCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIFJFVFVSTjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzV29ya3NwYWNlUmVzb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDk1Y2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYy5Jbml0aWFsTW9kZWxTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jLk9uRXZlbnRNb2RlbFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5mYWNldHMuRmFjZXRVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cy5JRmFjZXRVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIFJlcHJlc2VudHMgdGhlIHJlc291cmNlIGZvciBKQVgtV1Mgd2ViIHNlcnZpY2UgRE9NIG1vZGVsLiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIHRoZSANCi0gKiBtb2RlbC4gSXQgaXMgY2FwYWJsZSB0byB1c2Uge0BsaW5rIElQcm9ncmVzc01vbml0b3J9IHRvIHRyYWNrIHByb2dyZXNzIGFuZCBjYW5jZWwgcmVxdWVzdHMuDQotICogDQotICogQGF1dGhvciANCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBleHRlbmRzIE5vblN0cmVhbVJlc291cmNlDQotew0KLQlwcml2YXRlIGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsOw0KLQlwcml2YXRlIGZpbmFsIFNlcnZpY2VNb2RlbERhdGEgc2VydmljZURhdGE7DQotCXByaXZhdGUgZmluYWwgT25FdmVudE1vZGVsU3luY2hyb25pemVyIG1vZGVsU3luY2hyb25pemVyOw0KLQlwcml2YXRlIGZpbmFsIFNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeSBzZXJpYWxpemVyRmFjdG9yeTsgDQotDQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOw0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIHNhdmVFbmFibGVkOw0KLQlwcml2YXRlIGJvb2xlYW4gbG9hZENuYWNlbGVkOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIGphdmFNb2RlbA0KLQkgKi8NCi0JcHVibGljIEpheFdzV29ya3NwYWNlUmVzb3VyY2UoZmluYWwgSUphdmFNb2RlbCBqYXZhTW9kZWwpDQotCXsNCi0JCXRoaXMuamF2YU1vZGVsID0gamF2YU1vZGVsOw0KLQkJc2VydmljZURhdGEgPSBuZXcgU2VydmljZU1vZGVsRGF0YSgpOw0KLQkJbW9kZWxTeW5jaHJvbml6ZXIgPSBuZXcgT25FdmVudE1vZGVsU3luY2hyb25pemVyKHRoaXMsIHNlcnZpY2VEYXRhKTsNCi0JCXNhdmVFbmFibGVkID0gdHJ1ZTsNCi0JCXNlcmlhbGl6ZXJGYWN0b3J5ID0gbmV3IFNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeSh0aGlzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0IHByb2dyZXNzIG1vbml0b3IgaW4gY2FzZSB0aGUgcHJvY2Vzc2luZyBwcm9ncmVzcyBzaG91bGQgYmUgdHJhY2tlZCBhbmQNCi0JICogYWxzbyBpbiBjYXNlIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHByb2Nlc3NpbmcgY2FuIGJlIGNhbmNlbGVkIA0KLQkgKiBAcGFyYW0gcG0gdGhlIG1vbml0b3IgLSBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIHBtKQ0KLQl7DQotCQl0aGlzLm1vbml0b3IgPSBwbTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgbG9hZGVkIERPTSBpbiBjYXNlIGl0IGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIGluIGNhc2UgbG9hZGluZyBoYXMgbm90IGJlZW4gc3RhcnRlZCBhdCBhbGwgb3IgaW4gY2FzZSBsb2FkaW5nIGhhcyBiZWVuIGNhbmNlbGVkLiBUbyBjaGVjayBpZiB0aGUNCi0JICogbG9hZGluZyBoYXMgYmVlbiBjYW5jZWxlZCBjYWxsIGlzTG9hZGluZ0NhbmNlbGVkKCkuDQotCSAqLw0KLQlwdWJsaWMgSURPTSBnZXRET00oKQ0KLQl7DQotCQlpZiAoZ2V0Q29udGVudHMoKS5zaXplKCkgPT0gMCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gKElET00pIGdldENvbnRlbnRzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBZGRzIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIEphdmEgZWxlbWVudHMgaW4gb3JkZXIgdG8ga2VlcCB0aGUgbW9kZWwgaW4gc3luYw0KLQkgKiB3aXRoIHRoZXNlIGNoYW5nZXMNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0U3luY2hyb25pemluZygpDQotCXsNCi0JCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIobW9kZWxTeW5jaHJvbml6ZXIsIEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9SRUNPTkNJTEUgfCBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVtb3ZlcyBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byBKYXZhIGVsZW1lbnRzLiBLZWVwIGluIG1pbmQgdGhhdCBhZnRlciBjYWxsaW5nDQotCSAqIHRoaXMgbWV0aG9kIGNoYW5nZXMgaW4gamF2YSBlbGVtZW50cyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4gRE9NIG1vZGVsDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9wU3luY2hyb25pemluZygpDQotCXsNCi0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIobW9kZWxTeW5jaHJvbml6ZXIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBsb2dnZXIgdG8gdXNlIHdoZW4gc29tZSBldmVudCBuZWVkcyB0byBiZSBsb2dnZWQNCi0JICovDQotCXB1YmxpYyBJTG9nZ2VyIGxvZ2dlcigpDQotCXsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBqYXZhIG1vZGVsDQotCSAqLw0KLQlwdWJsaWMgSUphdmFNb2RlbCBqYXZhTW9kZWwoKQ0KLQl7DQotCQlyZXR1cm4gamF2YU1vZGVsOw0KLQl9CQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKGZpbmFsIE1hcDw/LCA/PiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJbG9hZENuYWNlbGVkID0gZmFsc2U7DQotCQlnZXRDb250ZW50cygpLmNsZWFyKCk7DQotDQotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkNCi0JCXsNCi0JCQlwdWJsaWMgdm9pZCBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkJCXsNCi0JCQkJdHJ5IA0KLQkJCQl7CQkNCi0JCQkJCW5ldyBJbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS50aGlzLCBzZXJ2aWNlRGF0YSkubG9hZChvcHRpb25zLCBzdWJNb25pdG9yKTsNCi0JCQkJfSANCi0JCQkJY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsNCi0JCQkJCWxvYWRDbmFjZWxlZCA9IHRydWU7DQotCQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiSkFYIFdTIFdlYiBTZXJ2aWNlcyBET00gbG9hZGluZyBoYXMgYmVlbiBjYW5jZWxlZCBieSB0aGUgdXNlciwgc29tZSBKQVggV1MgV2ViIFNlcnZpY2VzIGZ1bmN0aW9uYWxpdGllcyB3b24ndCBiZSBhdmFpbGFibGUiLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJdHJ5IHsNCi0JCQlqYXZhTW9kZWwoKS5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG1vbml0b3IpOw0KLQkJfSANCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7DQotCQkJdGhyb3cgbmV3IElPV3JhcHBlZEV4Y2VwdGlvbihjZSk7DQotCQl9DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmUoTWFwPD8sID8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgl7DQotCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZA0KLQl9DQotDQotCXByb3RlY3RlZCBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciBnZXRTeW5jaHJvbml6aW5nTGlzdGVuZXIoKSB7DQotCQlyZXR1cm4gbW9kZWxTeW5jaHJvbml6ZXI7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBpbGF0aW9uIHVuaXQgZmluZGVyIHRoYXQgY3Jhd2xzIHRocm91Z2ggamF2YU1vZGVsIGFuZCBjYWxscyANCi0JICogY29tcGlsYXRpb24gdW5pdCBoYW5kbGVyIHRvIHByb2Nlc3MgYXZhaWxhYmxlIENVJ3MgDQotCSAqIEBwYXJhbSBqTW9kZWwNCi0JICogQHBhcmFtIHByb2plY3RTZWxlY3RvcnMNCi0JICogQHJldHVybiBub24gPGNvZGU+bnVsbDwvY29kZT4ge0BsaW5rIElDb21waWxhdGlvblVuaXRGaW5kZXJ9IGluc3RhbmNlIA0KLQkgKi8NCi0JcHVibGljIElDb21waWxhdGlvblVuaXRGaW5kZXIgbmV3Q29tcGlsYXRpb25Vbml0RmluZGVyKGZpbmFsIElKYXZhTW9kZWwgak1vZGVsLCBmaW5hbCBJUHJvamVjdFNlbGVjdG9yW10gcHJvamVjdFNlbGVjdG9ycykNCi0Jew0KLQkJcmV0dXJuIG5ldyBXb3Jrc3BhY2VDVUZpbmRlcihqTW9kZWwsIHByb2plY3RTZWxlY3RvcnMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBcHByb3ZlcyB0aGF0IDxjb2RlPnByajwvY29kZT4gaXMgSkFYLVdTIHdlYiBzZXJ2aWNlIGVuYWJsZWQgDQotCSAqIEBwYXJhbSBwcmoNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbiBjYXNlIHRoaXMgcHJvamVjdCBtaWdodCBjb250YWluIEpBWC1XUyB3ZWIgc2VydmljZXMNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGFwcHJvdmVQcm9qZWN0KGZpbmFsIElKYXZhUHJvamVjdCBwcmopDQotCXsNCi0JCWZpbmFsIElGYWNldFV0aWxzIGZhY2V0VXRpbHMgPSBuZXcgRmFjZXRVdGlscygpOw0KLQkJdHJ5IHsNCi0JCQlyZXR1cm4gZmFjZXRVdGlscy5oYXNGYWNldFdpdGhWZXJzaW9uKHByai5nZXRQcm9qZWN0KCksIEZhY2V0VXRpbHMuRUpCXzMwX0ZBQ0VUX1ZFUlNJT04sIEZhY2V0VXRpbHMuRUpCXzMwX0ZBQ0VUX0lELCB0cnVlKQ0KLQkJCQl8fCBmYWNldFV0aWxzLmhhc0ZhY2V0V2l0aFZlcnNpb24ocHJqLmdldFByb2plY3QoKSwgRmFjZXRVdGlscy5XRUJfMjVfRkFDRVRfVkVSU0lPTiwgRmFjZXRVdGlscy5XRUJfMjVfRkFDRVRfSUQsIHRydWUpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHJlYWQgZmFjZXQgb24gcHJvamVjdCAiICsgcHJqLmdldEVsZW1lbnROYW1lKCkgKyAiLiBBbnkgV2ViIFNlcnZpY2UgZWxlbWVudHMgaW4gdGhpcyBwcm9qZWN0IHdpbGwgbm90IGJlIHNob3duIGluIHRoZSBuYXZpZ2F0aW9uIHRyZWUiLCBjZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMgbmV3IGluc3RhbmNlIG9mIHtAbGluayBJQW5ub3RhdGlvbkluc3BlY3Rvcn0gZm9yIDxjb2RlPnR5cGU8L2NvZGU+DQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEByZXR1cm4gbm9uIDxjb2RlPm51bGw8L2NvZGU+IGluc3BlY3Rvcg0KLQkgKi8NCi0JcHVibGljIElBbm5vdGF0aW9uSW5zcGVjdG9yIG5ld0Fubm90YXRpb25JbnNwZWN0b3IoZmluYWwgSVR5cGUgdHlwZSkNCi0Jew0KLQkJcmV0dXJuIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IodHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gbm9uIGVtcHR5IGFycmF5IG9mIHByb2plY3RzIHNlbGVjdG9ycyByZXNwb25zaWJsZSBmb3IgZmlsdGVyaW5nIHByb2Nlc3NlZCBwcm9qZWN0cyANCi0JICovDQotCXB1YmxpYyBJUHJvamVjdFNlbGVjdG9yW10gZ2V0UHJvamVjdFNlbGVjdG9ycygpDQotCXsNCi0JCXJldHVybiBuZXcgSVByb2plY3RTZWxlY3RvcltdIHsgbmV3IElQcm9qZWN0U2VsZWN0b3IoKQ0KLQkJew0KLQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikNCi0JCQl7DQotCQkJCXJldHVybiBhcHByb3ZlUHJvamVjdChwcmopOw0KLQkJCX0NCi0JCX0gfTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgc2VyaWFsaXplciBmYWN0b3J5IHVzZWQgdG8gYWRhcHQgRE9NIG9iamVjdHMgd2l0aCBzZXJpYWxpemVyIGFkYXB0ZXJzICANCi0JICovDQotCXB1YmxpYyBTZXJpYWxpemVyQWRhcHRlckZhY3RvcnkgZ2V0U2VyaWFsaXplckZhY3RvcnkoKSB7DQotCQlyZXR1cm4gc2VyaWFsaXplckZhY3Rvcnk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNhdmluZyBpcyBlbmFibGVkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVFbmFibGVkKCkgew0KLQkJcmV0dXJuIHNhdmVFbmFibGVkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBjYWxsIHRoaXMgbWV0aG9kIHRvIGVuYWJsZSBzYXZpbmcgb2YgbW9kZWwgb2JqZWN0cyB0byB1bmRlcmx5aW5nIHJlc291cmNlcw0KLQkgKi8NCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGVuYWJsZVNhdmluZygpIHsNCi0JCXRoaXMuc2F2ZUVuYWJsZWQgPSB0cnVlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogY2FsbCB0aGlzIG1ldGhvZCB0byBkaXNhYmxlIHNhdmluZyBvZiBtb2RlbCBvYmplY3RzIHRvIHVuZGVybHlpbmcgcmVzb3VyY2VzDQotCSAqLw0KLQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgZGlzYWJsZVNhdmluZygpIHsNCi0JCXRoaXMuc2F2ZUVuYWJsZWQgPSBmYWxzZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSB0aGUgbG9hZCBvZiBET00gbW9kZWwgaGFzIGJlZW4gY2FuY2VsZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTG9hZENuYWNlbGVkKCkgew0KLQkJcmV0dXJuIGxvYWRDbmFjZWxlZDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEhvbGRzIG1vZGVsIGRhdGEgaGVscGZ1bCBpbiBtb2RlbCBwcm9jZXNzaW5nDQotCSAqLw0KLQlwdWJsaWMgY2xhc3MgU2VydmljZU1vZGVsRGF0YQ0KLQl7DQotCQlwcml2YXRlIE1hcDxJV2ViU2VydmljZSwgU3RyaW5nPiB3czJzZWkgPSBuZXcgSGFzaE1hcDxJV2ViU2VydmljZSwgU3RyaW5nPigpOw0KLQ0KLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPElXZWJTZXJ2aWNlPj4gc2VpMndzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPElXZWJTZXJ2aWNlPj4oKTsNCi0NCi0JCXByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxJQ29tcGlsYXRpb25Vbml0Pj4gdHlwZTJpbmhlcml0ZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248SUNvbXBpbGF0aW9uVW5pdD4+KCk7DQotDQotCQlwdWJsaWMgdm9pZCBtYXAoSVdlYlNlcnZpY2Ugd3MsIFN0cmluZyBzZWlJbXBsKQ0KLQkJew0KLQkJCXdzMnNlaS5wdXQod3MsIHNlaUltcGwpOw0KLQkJCWdldEltcGxlbWVudGluZ1dzKHNlaUltcGwpLmFkZCh3cyk7DQotCQl9DQotDQotCQlTdHJpbmcgZ2V0U2VpSW1wbChJV2ViU2VydmljZSB3cykNCi0JCXsNCi0JCQlyZXR1cm4gd3Myc2VpLmdldCh3cyk7DQotCQl9DQotDQotCQlwdWJsaWMgQ29sbGVjdGlvbjxJV2ViU2VydmljZT4gZ2V0SW1wbGVtZW50aW5nV3MoU3RyaW5nIHNlaUltbCkNCi0JCXsNCi0JCQlDb2xsZWN0aW9uPElXZWJTZXJ2aWNlPiB3c3MgPSBzZWkyd3MuZ2V0KHNlaUltbCk7DQotCQkJaWYgKHdzcyA9PSBudWxsKQ0KLQkJCXsNCi0JCQkJd3NzID0gbmV3IEFycmF5TGlzdDxJV2ViU2VydmljZT4oKTsNCi0JCQkJc2VpMndzLnB1dChzZWlJbWwsIHdzcyk7DQotCQkJfQ0KLQkJCXJldHVybiB3c3M7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCB1bm1hcChJV2ViU2VydmljZSB3cykNCi0JCXsNCi0JCQlmaW5hbCBTdHJpbmcgc2VpID0gd3Myc2VpLnJlbW92ZSh3cyk7DQotCQkJZmluYWwgQ29sbGVjdGlvbjxJV2ViU2VydmljZT4gaW1wbGVtZW50aW5nV2ViU2VydmljZXMgPSBnZXRJbXBsZW1lbnRpbmdXcyhzZWkpOw0KLQkJCWltcGxlbWVudGluZ1dlYlNlcnZpY2VzLnJlbW92ZSh3cyk7DQotCQkJaWYgKGltcGxlbWVudGluZ1dlYlNlcnZpY2VzLnNpemUoKSA9PSAwKQ0KLQkJCXsNCi0JCQkJc2VpMndzLnJlbW92ZShzZWkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIHJlY29yZEhpZXJhcmNoeShTdHJpbmcgZnFOYW1lLCBDb2xsZWN0aW9uPElDb21waWxhdGlvblVuaXQ+IGluaGVyaXRlZFR5cGVzKQ0KLQkJew0KLQkJCXR5cGUyaW5oZXJpdGVkLnB1dChmcU5hbWUsIGluaGVyaXRlZFR5cGVzKTsNCi0JCX0NCi0NCi0JCS8qKg0KLQkJICogQHBhcmFtIGZxTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUNCi0JCSAqIEByZXR1cm4gY29sbGVjdGlvbiBvZiBjbGFzc2VzIHRoYXQgYXJlIHN1cGVyIGZvciBjbGFzcyA8Y29kZT5mcU5hbWU8L2NvZGU+DQotCQkgKi8NCi0JCXB1YmxpYyBDb2xsZWN0aW9uPElDb21waWxhdGlvblVuaXQ+IGdldEhpZXJhcmNoeShTdHJpbmcgZnFOYW1lKQ0KLQkJew0KLQkJCXJldHVybiB0eXBlMmluaGVyaXRlZC5nZXQoZnFOYW1lKTsNCi0JCX0NCi0NCi0JCS8qKg0KLQkJICogQ2xlYXJzIHJlY29yZGVyIGhpZXJhcmNoeSBmb3IgY2xhc3Mgd2l0aCBGUU5hbWUgPGNvZGU+ZnFOYW1lPC9jb2RlPg0KLQkJICogQHBhcmFtIGZxTmFtZQ0KLQkJICovDQotCQlwdWJsaWMgdm9pZCBjbGVhckhpZXJhcmNoeShTdHJpbmcgZnFOYW1lKQ0KLQkJew0KLQkJCXR5cGUyaW5oZXJpdGVkLnJlbW92ZShmcU5hbWUpOw0KLQkJfQ0KLQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmMTJkMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NEb21Mb2FkTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLXB1YmxpYyBjbGFzcyBKZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uIGltcGxlbWVudHMgSVdzRE9NUnVudGltZUV4dGVuc2lvbg0KLXsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5qZWU1IjsvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIExpc3Q8SVdzRG9tTG9hZExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElXc0RvbUxvYWRMaXN0ZW5lcj4oKTsNCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHdvcmtzcGFjZVJlc291cmNlOw0KLQlwcml2YXRlIGJvb2xlYW4gZmluaXNoZWQ7DQotCXByaXZhdGUgYm9vbGVhbiBzdGFydGVkOw0KLQ0KLQlwdWJsaWMgdm9pZCBjcmVhdGVET00oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCUpvYi5nZXRKb2JNYW5hZ2VyKCkuYmVnaW5SdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIG1vbml0b3IpOw0KLQkJdHJ5IHsNCi0JCQlpZiAod29ya3NwYWNlUmVzb3VyY2UgPT0gbnVsbCB8fCB3b3Jrc3BhY2VSZXNvdXJjZS5pc0xvYWRDbmFjZWxlZCgpKSB7CQkJDQotCQkJCXBlcmZvcm1Mb2FkKG1vbml0b3IpOw0KLQkJCX0NCi0JCX0gZmluYWxseSB7DQotCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5lbmRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwZXJmb3JtTG9hZChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gDQotCXsNCi0JCXdvcmtzcGFjZVJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UoKTsNCi0JCXdvcmtzcGFjZVJlc291cmNlLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsNCi0JCXRyeSB7DQotCQkJc3RhcnRlZCgpOw0KLQkJCXdvcmtzcGFjZVJlc291cmNlLmxvYWQobnVsbCk7DQotCQkJaWYgKHdvcmtzcGFjZVJlc291cmNlLmlzTG9hZENuYWNlbGVkKCkpIHsNCi0JCQkJdGhyb3cgY3JlYXRlQ2FuY2VsZWRFeGNlcHRpb24oKTsNCi0JCQl9DQotCQl9IGZpbmFsbHkgew0KLQkJCWZpbmlzaGVkKCk7DQotCQl9DQotCQkNCi0JCXdvcmtzcGFjZVJlc291cmNlLnN0YXJ0U3luY2hyb25pemluZygpOw0KLQl9DQotDQotCXB1YmxpYyBJRE9NIGdldERPTSgpIHRocm93cyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAod29ya3NwYWNlUmVzb3VyY2UgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlpZiAod29ya3NwYWNlUmVzb3VyY2UuaXNMb2FkQ25hY2VsZWQoKSkgew0KLQkJCXRocm93IGNyZWF0ZUNhbmNlbGVkRXhjZXB0aW9uKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiB3b3Jrc3BhY2VSZXNvdXJjZS5nZXRET00oKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgYWRkTG9hZExpc3RlbmVyKElXc0RvbUxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKGxpc3RlbmVyLCAibGlzdGVuZXIiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7DQotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7DQotCQl9DQotCQkNCi0JCWlmIChzdGFydGVkKSB7DQotCQkJbGlzdGVuZXIuc3RhcnRlZCgpOwkJCQ0KLQkJfQ0KLQkJDQotCQlpZiAoZmluaXNoZWQpIHsNCi0JCQlsaXN0ZW5lci5maW5pc2hlZCgpOwkJCQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCByZW1vdmVMb2FkTGlzdGVuZXIoSVdzRG9tTG9hZExpc3RlbmVyIGxpc3RlbmVyKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0obGlzdGVuZXIsICJsaXN0ZW5lciIpOy8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElKYXZhTW9kZWwgamF2YU1vZGVsKCkgew0KLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKSB7IA0KLQkJcmV0dXJuIG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbCgpKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSANCi0Jew0KLQkJZmluaXNoZWQgPSB0cnVlOw0KLQkJZm9yIChJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lci5maW5pc2hlZCgpOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0ZWQoKSANCi0Jew0KLQkJc3RhcnRlZCA9IHRydWU7DQotCQlmaW5pc2hlZCA9IGZhbHNlOw0KLQkJZm9yIChJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lci5zdGFydGVkKCk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gY3JlYXRlQ2FuY2VsZWRFeGNlcHRpb24oKSB7DQotCQlyZXR1cm4gbmV3IFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uKCJKQVgtV1MgRE9NIGxvYWRpbmcgY2FuY2VsZWQiLCBKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5Xb3Jrc3BhY2VDVUZpbmRlcl9MT0FESU5HX0NBTkNFTEVEKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvTm9uU3RyZWFtUmVzb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvTm9uU3RyZWFtUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGY2YTVhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL05vblN0cmVhbVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbDsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9uU3RyZWFtUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZUltcGwgew0KLQ0KLQkvKioNCi0JICogU2luY2UgdGhpcyBSZXNvdXJjZSBpcyBub3Qgc3RyZWFtIGJhc2VkLCB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLg0KLQkgKiBJZiBjYWxsZWQgaXQgd2lsbCB0aHJvdyA8Yz5VbnN1cHBvcnRlZEV4Y2VwdGlvbjwvYz4NCi0JICogQHBhcmFtIGFyZzAgLSBpZ25vcnJlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgTWFwPD8sPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCXN1cGVyLmRvTG9hZChpbnB1dFN0cmVhbSwgb3B0aW9ucyk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBTaW5jZSB0aGlzIFJlc291cmNlIGlzIG5vdCBzdHJlYW0gYmFzZWQsIHRoaXMgbWV0aG9kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQuDQotCSAqIElmIGNhbGxlZCBpdCB3aWxsIHRocm93IDxjPlVuc3VwcG9ydGVkRXhjZXB0aW9uPC9jPg0KLQkgKiBAcGFyYW0gYXJnMCAtIGlnbm9ycmVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBhcmcwLCBNYXA8Pyw/PiBhcmcxKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJc3VwZXIuZG9TYXZlKGFyZzAsIGFyZzEpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBbGx3YXN5IHRocm93cyA8Yz5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvYz4uIFN0cmVhbXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyByZXNvdXJjZS4NCi0JICogQHJldHVybiBub3RoaW5nLiB0aGlzIG1ldGhvZCBhbGx3YXlzIHRocm93cyA8Yz5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvYz4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc0NvbnRlbnRaaXBFbnRyeShaaXBFbnRyeSBhcmcwKSB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2luY2UgdGhpcyByZXNvdXJjZSBkb2Vzbid0IHN1cHBvcnQgc3RyZWFtcyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiBBbGx3YXN5IHRocm93cyA8Yz5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvYz4uDQotCSAqIEByZXR1cm4gbm90aGluZy4gdGhpcyBtZXRob2QgYWxsd2F5cyB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGZpbmFsIFppcEVudHJ5IG5ld0NvbnRlbnRaaXBFbnRyeSgpIHsNCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogU2luY2UgdGhpcyByZXNvdXJjZSBkb2Vzbid0IHN1cHBvcnQgc3RyZWFtcyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiBBbGx3YXN5IHRocm93cyA8Yz5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvYz4uDQotCSAqIEByZXR1cm4gbm90aGluZy4gdGhpcyBtZXRob2QgYWxsd2F5cyB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gdXNlWmlwKCkgew0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBmaW5hbCB2b2lkIGxvYWQoTWFwPD8sPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0NCi0JCWlmICghaXNMb2FkZWQoKSkgew0KLQkJCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBzZXRMb2FkZWQodHJ1ZSk7DQotCQkJaXNMb2FkaW5nID0gdHJ1ZTsNCi0JCQlpZiAoZXJyb3JzICE9IG51bGwpIHsNCi0JCQkJZXJyb3JzLmNsZWFyKCk7DQotCQkJfQ0KLQkJCWlmICh3YXJuaW5ncyAhPSBudWxsKSB7DQotCQkJCXdhcm5pbmdzLmNsZWFyKCk7DQotCQkJfQ0KLQkJCXRyeSB7DQotCQkJICAgIE1hcDw/LD8+IG1lcmdlZE9wdGlvbnMgPSBtZXJnZU1hcHMob3B0aW9ucywgZGVmYXVsdExvYWRPcHRpb25zKTsNCi0JCQkJZG9Mb2FkKG1lcmdlZE9wdGlvbnMpOw0KLQkJCX0gZmluYWxseSB7DQotCQkJCQ0KLQkJCQlpc0xvYWRpbmcgPSBmYWxzZTsNCi0JCQkJaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKSB7DQotCQkJCQllTm90aWZ5KG5vdGlmaWNhdGlvbik7DQotCQkJCX0NCi0JCQkJc2V0TW9kaWZpZWQoZmFsc2UpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENhbGxlZCB0byBsb2FkIHRoZSByZXNvdXJjZSB1c2luZyBubyBzdHJlYW1zLg0KLQkgKg0KLQkgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbnMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlci4gVGhpcyBtZXRvZCB3aWxsIGlnbm9yZSBhbnkgb3B0aW9ucyB0aGF0IGl0IGRvZXNuJ3QgcmVjb2duaXplLiBUaGUga2V5cyBhbmQgdGhlIHZhbHVlcyBjYW4gYmUgYXJiaXRyYXJ5IG9iamVjdHMuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLSB0aHJvd24gaWYgZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgY29udGVudCBvZiB0aGlzIHJlc291cmNlDQotCSAqLw0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBkb0xvYWQoTWFwPD8sPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBmaW5hbCB2b2lkIHNhdmUoTWFwPD8sPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JICAgIGlmIChlcnJvcnMgIT0gbnVsbCkNCi0JICAgIHsNCi0JICAgICAgZXJyb3JzLmNsZWFyKCk7DQotCSAgICB9DQotCSAgICBpZiAod2FybmluZ3MgIT0gbnVsbCkNCi0JICAgIHsNCi0JICAgICAgd2FybmluZ3MuY2xlYXIoKTsNCi0JICAgIH0NCi0JICAgIE1hcDw/LD8+IG1lcmdlZE9wdGlvbnMgPSBtZXJnZU1hcHMob3B0aW9ucywgZGVmYXVsdFNhdmVPcHRpb25zKTsNCi0JICAgIGRvU2F2ZShtZXJnZWRPcHRpb25zKTsNCi0JICAgIHNldE1vZGlmaWVkKGZhbHNlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENhbGxlZCB0byBzYXZlIHRoZSByZXNvdXJjZSB1c2luZyBubyBzdHJlYW1zLg0KLQkgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbnMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlci4gVGhpcyBtZXRvZCB3aWxsIGlnbm9yZSBhbnkgb3B0aW9ucyB0aGF0IGl0IGRvZXNuJ3QgcmVjb2duaXplLiBUaGUga2V5cyBhbmQgdGhlIHZhbHVlcyBjYW4gYmUgYXJiaXRyYXJ5IG9iamVjdHMuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLSBpZiBwcm9ibGVtIGR1cmluZyB0aGUgc2F2aW5nIG9jY3VycmVkLg0KLQkgKi8NCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TYXZlKE1hcDw/LD8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbjsNCi0JDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvU0JBbm5vdGF0aW9uRmVhdHVyZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvU0JBbm5vdGF0aW9uRmVhdHVyZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2E4MWZiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1NCQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi0vKioNCi0gKiBDb250YWlucyBTT0FQQmluZGluZyBhbm5vdGF0aW9uIG5hbWUsIGF0dHJpYnV0ZXMgYW5kIHBvc3NpYmxlIHZhbHVlcw0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU0JBbm5vdGF0aW9uRmVhdHVyZXMgDQotew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9BTk5PVEFUSU9OID0gImphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFX0FUVFJJQlVURSA9ICJzdHlsZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQVRUUklCVVRFID0gInVzZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfU1RZTEVfQVRUUklCVVRFID0gInBhcmFtZXRlclN0eWxlIjsvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9TVFlMRV9ET0NVTUVOVCAJPSBTQl9BTk5PVEFUSU9OICsgIi5TdHlsZS5ET0NVTUVOVCI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9TVFlMRV9SUEMgCQk9IFNCX0FOTk9UQVRJT04gKyAiLlNPQVBCaW5kaW5nLlN0eWxlLlJQQyI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0JfVVNFX0xJVEVSQUwgCT0gU0JfQU5OT1RBVElPTiArICIuVXNlLkxJVEVSQUwiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0JfVVNFX0VOQ09ERUQgCT0gU0JfQU5OT1RBVElPTiArICIuVXNlLkVOQ09ERUQiOy8vJE5PTi1OTFMtMSQNCi0JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCX1BBUkFNRVRFUl9TVFlMRV9CQVJFIAkJPSBTQl9BTk5PVEFUSU9OICsgIi5QYXJhbWV0ZXJTdHlsZS5CQVJFIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCX1BBUkFNRVRFUl9TVFlMRV9XUkFQUEVECT0gU0JfQU5OT1RBVElPTiArICIuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JDQotCXByaXZhdGUgU0JBbm5vdGF0aW9uRmVhdHVyZXMoKSB7DQotCQkvLyBubyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dNQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dNQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0OTg5Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XTUFubm90YXRpb25GZWF0dXJlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotcHVibGljIGZpbmFsIGNsYXNzIFdNQW5ub3RhdGlvbkZlYXR1cmVzDQotew0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTV9BTk5PVEFUSU9OID0gImphdmF4Lmp3cy5XZWJNZXRob2QiOy8vJE5PTi1OTFMtMSQNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01fTkFNRV9BVFRSSUJVVEUgPSAib3BlcmF0aW9uTmFtZSI7Ly8kTk9OLU5MUy0xJA0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTV9FWENMVURFRF9BVFRSSUJVVEUgPSAiZXhjbHVkZSI7Ly8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIFdNQW5ub3RhdGlvbkZlYXR1cmVzKCkNCi0Jew0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV1BBbm5vdGF0aW9uRmVhdHVyZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV1BBbm5vdGF0aW9uRmVhdHVyZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDdjMzJmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dQQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGhvbGRzIGluZm9ybWF0aW9uIG9uIGphdmF4Lmp3cy5XZWJQYXJhbSBhbm5vdGF0aW9uIG5hbWUgYW5kIGF0dHJpYnV0ZSBuYW1lcy4gDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLWZpbmFsIHB1YmxpYyBjbGFzcyBXUEFubm90YXRpb25GZWF0dXJlcyANCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdQX0FOTk9UQVRJT04gPSAiamF2YXguandzLldlYlBhcmFtIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVRUUklCVVRFID0gIm5hbWUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9OQU1FX0FUVFJJQlVURSA9ICJwYXJ0TmFtZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSA9ICJ0YXJnZXROYW1lc3BhY2UiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERV9BVFRSSUJVVEUgPSAibW9kZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQVRUUklCVVRFID0gImhlYWRlciI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNX01PREUgPSAiamF2YXguandzLldlYlBhcmFtLk1vZGUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNX01PREVfSU4gPSBXRUJfUEFSQU1fTU9ERSArICIuSU4iOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNX01PREVfT1VUID0gV0VCX1BBUkFNX01PREUgKyAiLk9VVCI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUEFSQU1fTU9ERV9JTk9VVCA9IFdFQl9QQVJBTV9NT0RFICsgIi5JTk9VVCI7Ly8kTk9OLU5MUy0xJA0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dTQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dTQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5ZjE1ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XU0Fubm90YXRpb25GZWF0dXJlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotZmluYWwgcHVibGljIGNsYXNzIFdTQW5ub3RhdGlvbkZlYXR1cmVzDQotew0KLQlwcml2YXRlIFdTQW5ub3RhdGlvbkZlYXR1cmVzKCkNCi0Jew0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTX0FOTk9UQVRJT04gPSAiamF2YXguandzLldlYlNlcnZpY2UiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEUgPSAibmFtZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFID0gImVuZHBvaW50SW50ZXJmYWNlIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUgPSAic2VydmljZU5hbWUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9MT0NBVElPTl9BVFRSSUJVVEUgPSAid3NkbExvY2F0aW9uIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFID0gInRhcmdldE5hbWVzcGFjZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUVfQVRUUklCVVRFID0gInBvcnROYW1lIjsJLy8kTk9OLU5MUy0xJA0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dvcmtzcGFjZUNVRmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dvcmtzcGFjZUNVRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkYzhmMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9Xb3Jrc3BhY2VDVUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotDQotcHVibGljIGNsYXNzIFdvcmtzcGFjZUNVRmluZGVyIGltcGxlbWVudHMgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBJSmF2YU1vZGVsIGphdmFNb2RlbDsNCi0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdFNlbGVjdG9yW10gc2VsZWN0b3JzOw0KLQkNCi0JcHVibGljIFdvcmtzcGFjZUNVRmluZGVyKElKYXZhTW9kZWwgamF2YU1vZGVsLCBJUHJvamVjdFNlbGVjdG9yW10gc2VsZWN0b3JzKSB7DQotCQlpZiAoamF2YU1vZGVsID09IG51bGwpIHsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphdmFNb2RlbCIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXRoaXMuamF2YU1vZGVsID0gamF2YU1vZGVsOw0KLQkJaWYgKHNlbGVjdG9ycyA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJzZWxlY3RvciIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXRoaXMuc2VsZWN0b3JzID0gc2VsZWN0b3JzOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBmaW5kKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIgY3VIYW5kbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJY3VIYW5kbGVyLnN0YXJ0ZWQoKTsNCi0JCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQltb25pdG9yLmJlZ2luVGFzayhKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5KQVhXU19ET01fTE9BRElORywgYXNzdW1lV29yaygpKTsNCi0JCX0JCQ0KLQkJdHJ5IHsNCi0JCQlmb3IgKElKYXZhUHJvamVjdCBwcmogOiBqYXZhTW9kZWwuZ2V0SmF2YVByb2plY3RzKCkpDQotCQkJew0KLQkJCQlpZiAobW9uaXRvciE9bnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCQkJdGhyb3cgbmV3IFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uKCJKQVgtV1MgRE9NIGxvYWRpbmcgY2FuY2VsZWQiLCBKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5Xb3Jrc3BhY2VDVUZpbmRlcl9MT0FESU5HX0NBTkNFTEVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCQ0KLQkJCQlpZiAoYXBwcm92ZShwcmopKQ0KLQkJCQl7DQotCQkJCQljdUhhbmRsZXIuaGFuZGxlKHByaik7DQotCQkJCQlwYXJzZVByb2plY3QocHJqLCBtb25pdG9yLCBjdUhhbmRsZXIpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWN1SGFuZGxlci5maW5pc2hlZCgpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCW1vbml0b3IuZG9uZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGludCBhc3N1bWVXb3JrKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIENvdW50aW5nQ1VIYW5kbGVyIGNvdW50aW5nSGFuZGxlciA9IG5ldyBDb3VudGluZ0NVSGFuZGxlcigpOw0KLQkJZm9yIChJSmF2YVByb2plY3QgcHJqIDogamF2YU1vZGVsLmdldEphdmFQcm9qZWN0cygpKSB7CQkNCi0JCQlpZiAoYXBwcm92ZShwcmopKSB7DQotCQkJCXBhcnNlUHJvamVjdChwcmosIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIGNvdW50aW5nSGFuZGxlcik7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY291bnRpbmdIYW5kbGVyLmNvdW50Ow0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcGFyc2VQcm9qZWN0KGZpbmFsIElKYXZhUHJvamVjdCBwcmosIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIgY3VIYW5kbGVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiANCi0Jew0KLQkJZm9yIChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA6IHByai5nZXRQYWNrYWdlRnJhZ21lbnRzKCkpIA0KLQkJew0KLQkJCWlmIChwYWNrYWdlRnJhZ21lbnQuZ2V0S2luZCgpICE9IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlmb3IgKElDb21waWxhdGlvblVuaXQgY3UgOiBwYWNrYWdlRnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0cygpKSANCi0JCQl7DQotCQkJCWlmIChtb25pdG9yIT1udWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCQl0aHJvdyBuZXcgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24oIkpBWC1XUyBET00gbG9hZGluZyBjYW5jZWxlZCIsSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuV29ya3NwYWNlQ1VGaW5kZXJfTE9BRElOR19DQU5DRUxFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJY3VIYW5kbGVyLmhhbmRsZShjdSk7DQotCQkJCQ0KLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikgew0KLQkJZm9yIChJUHJvamVjdFNlbGVjdG9yIHNlbGVjdG9yIDogc2VsZWN0b3JzKSB7DQotCQkJaWYgKHNlbGVjdG9yLmFwcHJvdmUocHJqKSkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBUaGlzIGhhbmRsZXIgY291bnRzIHRoZSBjb21waWxhdGlvbiB1bml0cyANCi0JICogIA0KLQkgKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotCSAqLw0KLQlwcm90ZWN0ZWQgY2xhc3MgQ291bnRpbmdDVUhhbmRsZXIgaW1wbGVtZW50cyBJQ29tcGlsYXRpb25Vbml0SGFuZGxlciANCi0Jew0KLQkJcHJpdmF0ZSBpbnQgY291bnQ7DQotCQkNCi0JCXB1YmxpYyB2b2lkIHN0YXJ0ZWQoKSB7DQotCQkJY291bnQgPSAwOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgdm9pZCBoYW5kbGUoSUNvbXBpbGF0aW9uVW5pdCBjdSkgew0KLQkJCWNvdW50Kys7DQotCQl9DQotCQkNCi0JCXB1YmxpYyB2b2lkIGZpbmlzaGVkKCkgeyAvKiBubyBwcm9jZXNzaW5nIG5lZWRlZCAqLyB9DQotCQlwdWJsaWMgdm9pZCBoYW5kbGUoSUphdmFQcm9qZWN0IGpwcmopIHsgLyogbm8gcHJvY2Vzc2luZyBuZWVkZWQgKi8gfQ0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlYWZhZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0Fubm90YXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsLkFubm90YXRpb25BZGFwdGVyOw0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgdGhhdCBhZGFwdHMgRE9NIG9iamVjdHMgdG8ge0BsaW5rIElBbm5vdGF0aW9uQWRhcHRlcn0gaW50ZXJmYWNlLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsDQotew0KLQkvKioNCi0JICogU2luZ2xldG9uIC0gdXNlIHRoaXMgc3RhdGljIGluc3RhbmNlIHRvIGFkYXB0IG9iamVjdHMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEFubm90YXRpb25BZGFwdGVyRmFjdG9yeSgpOw0KLQkNCi0JcHJpdmF0ZSBBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkoKSB7DQotCQkvLyBzaW5nbGV0b24NCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiB0eXBlID09IElBbm5vdGF0aW9uQWRhcHRlci5jbGFzczsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIA0KLQl7DQotCQlyZXR1cm4gbmV3IEFubm90YXRpb25BZGFwdGVyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0lBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0lBbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjQyNzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9JQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgdGhhdCBob2xkcyBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGFubm90YXRpb25zIGFwcGxpZWQgb24gdGhlDQotICogamF2YSBhcnRpZmFjdC9zIHdoaWNoIGlzIHJlcHJlc2VudCBieSB0aGUgRE9NIG9iamVjdCBhZGFwdGVkIHRvIHRoaXMgaW50ZXJmYWNlLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uQWRhcHRlciANCi17DQotCS8qKg0KLQkgKiBQcm92aWRlcyB0aGUge0BsaW5rIElBbm5vdGF0aW9ufSBmb3IgYW5ub3RhdGlvbiB3aXRoIDxjb2RlPmFubkZRTmFtZTwvY29kZT4uIA0KLQkgKiBAcGFyYW0gYW5uRlFOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbg0KLQkgKiBAcmV0dXJuIGxvY2F0b3IgaW5zdGFuY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGV4aXN0aW5nDQotCSAqLw0KLQlwdWJsaWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbihTdHJpbmcgYW5uRlFOYW1lKTsNCi0JDQotCS8qKg0KLQkgKiBBZGRzIGFubm90YXRpb24gdG8gdGhlIGxpc3Qgb2YgdXNlZCBhbm5vdGF0aW9ucy4NCi0JICogPGNvZGU+YW5ub3RhdGlvbjwvY29kZT4gY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIGxvY2F0b3IgZm9yIHRoaXMgYW5ub3RhdGlvbg0KLQkgKiBpcyByZW1vdmVkLg0KLQkgKiBAcGFyYW0gYW5uRlFOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbg0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aCBhbm5vdGF0aW9uIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uKFN0cmluZyBhbm5GUU5hbWUsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL2ltcGwvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQ2ZmJiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElMb2NhdG9yQWRhcHRlcn0uDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSUFubm90YXRpb25BZGFwdGVyDQotew0KLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+PiBhbm5vdGF0aW9uTG9jYXRvcnM7DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBBbm5vdGF0aW9uQWRhcHRlcigpIHsNCi0JCWFubm90YXRpb25Mb2NhdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4+KCk7DQotCX0NCi0JDQotCXB1YmxpYyBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uRlFOYW1lKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvbkZRTmFtZSwgImFubm90YXRpb25GUU5hbWUiKTsvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gYW5ub3RhdGlvbkxvY2F0b3JzLmdldChhbm5vdGF0aW9uRlFOYW1lKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uKGZpbmFsIFN0cmluZyBhbm5GUU5hbWUsIGZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24pIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShhbm5GUU5hbWUsICJhbm5GUU5hbWUiKTsvLyROT04tTkxTLTEkDQotCQlhbm5vdGF0aW9uTG9jYXRvcnMucHV0KGFubkZRTmFtZSwgYW5ub3RhdGlvbik7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MgPT0gdHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL01ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL01ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzYjc0YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9NZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotDQotLyoqDQotICogQWRhcHRlciB0aGF0IGdpdmVzIGRlZmF1bHQgdmFsdWVzIGZvciB7QGxpbmsgSVdlYk1ldGhvZH0gb2JqZWN0cw0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eURlZmF1bHRzDQotew0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IHR5cGU7DQotCX0NCi0JDQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2QpZ2V0VGFyZ2V0KCk7IA0KLQkJc3dpdGNoKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX05BTUU6DQotCQkJcmV0dXJuIGdldE1ldGhvZE5hbWUod2ViTWV0aG9kKTsNCi0JCX0JDQotCQkNCi0JCXJldHVybiB3ZWJNZXRob2QuZUdldChmZWF0dXJlKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBnZXRNZXRob2ROYW1lKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlpbnQgcG9zID0gd2ViTWV0aG9kLmdldEltcGxlbWVudGF0aW9uKCkuaW5kZXhPZignKCcpOw0KLQkJaWYgKHBvcyA+IC0xKSB7DQotCQkJcmV0dXJuIHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpLnN1YnN0cmluZygwLCBwb3MpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gd2ViTWV0aG9kLmdldEltcGxlbWVudGF0aW9uKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9QYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9QYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYmI5ZTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzRGVmYXVsdHNDYWxjdWxhdG9yOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgZGVmaW5lcyB3aGljaCBwcm9wZXJ0aWVzIGZvciB7QGxpbmsgSVdlYlBhcmFtfSBhcmUgZWRpdGFibGUNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlEZWZhdWx0cw0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvciBkZWZDYWxjID0gbmV3IEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yKCk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IHR5cGU7DQotCX0NCi0JDQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkNCi0Jew0KLQkJYXNzZXJ0IGdldFRhcmdldCgpIGluc3RhbmNlb2YgSVdlYlBhcmFtOw0KLQkJDQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWdldFRhcmdldCgpOw0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkgDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fTkFNRToNCi0JCQlyZXR1cm4gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHROYW1lKHdlYlBhcmFtKTsJCQkNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5jYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJQYXJhbSk7CQkJDQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQlyZXR1cm4gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUygoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCksIHdlYlBhcmFtKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19IRUFERVI6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5nZXREZWZhdWx0UGFyYW1JbkhlZGFlcigpOw0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQ6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5nZXREZWZhdWx0UGFyYW1LaW5kKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiB3ZWJQYXJhbS5lR2V0KGZlYXR1cmUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYygpIHsNCi0JCXJldHVybiBkZWZDYWxjOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODJiZTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbUFkYXB0ZXJGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgZmFjdG9yeSBmb3IgYWRhcHRlcnMgaW1wbGVtZW50aW5nIHtAbGluayBJUHJvcGVydHlTdGF0ZX0gaW50ZXJmYWNlLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRG9tQWRhcHRlckZhY3RvcnkNCi17DQotCS8qKg0KLQkgKiBTaW5nbGV0b24gaW5zdGFuY2UgZm9yIHRoaXMgYWRhcHRlciBmYWN0b3J5IA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5KCk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MgPT0gb2JqZWN0Ow0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlNlcnZpY2VBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG5ldyBXc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyKCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIoKTsNCi0JfQkNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViTWV0aG9kQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJQYXJhbUFkYXB0ZXIoKXsNCi0JCXJldHVybiBuZXcgUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1NlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1NlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5Y2NhN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgdGhhdCBwcm92aWRlcyBkZWZhdWx0IHZhbHVlcyBmb3Ige0BsaW5rIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2V9IHByb3BlcnRpZXMgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSVByb3BlcnR5RGVmYXVsdHMgDQotew0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWdldFRhcmdldCgpOw0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkNCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUU6DQotCQkJcmV0dXJuIEpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZShzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5RlFOYW1lKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCX0JCQkNCi0JCQ0KLQkJcmV0dXJuIHNlaS5lR2V0KGZlYXR1cmUpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1dzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdhYzk0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1dzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkpheFdzVXRpbHM7DQotDQotcHVibGljIGNsYXNzIFdzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eURlZmF1bHRzIA0KLXsNCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSANCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSAoSVdlYlNlcnZpY2UpZ2V0VGFyZ2V0KCk7DQotCQkNCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKQ0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fTkFNRTogDQotCQkJcmV0dXJuIEpheFdzVXRpbHMuZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKHdzLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FOg0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZSh3cy5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJcmV0dXJuIEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlGUU5hbWUod3MuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiB3cy5lR2V0KGZlYXR1cmUpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL0Fic3RyYWN0U2VyaWFsaXplckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9BYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwMTY4MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL0Fic3RyYWN0U2VyaWFsaXplckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLlBhcmFtVmFsdWVDb21wYXJhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogQmFzZSBjbGFzcyBmb3IgRE9NIGFkYXB0ZXJzIHRoYXQgbGlzdGVuIHRvIGNoYW5nZXMgaW4gRE9NIG9iamVjdHMgYW5kIGFwcGxpZXMgaXQNCi0gKiB0byB0aGUgdW5kZXJseWluZyBqYXZhIGNsYXNzLiBFeHRlbmRlcnMgc2hvdWxkIGltcGxlbWVudCA8Y29kZT5nZXRBbm5vdGF0aW9uKCk8L2NvZGU+DQotICogbWV0aG9kIHRvIHByb3ZpZGUgdGhlIHtAbGluayBJQW5ub3RhdGlvbn0gaW5zdGFuY2UgdG8gYmUgc2F2ZWQgdG8gamF2YSBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElBbm5vdGF0aW9uU2VyaWFsaXplcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOw0KLQlwcml2YXRlIGZpbmFsIERvbVV0aWwgdXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCXByaXZhdGUgZmluYWwgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYyA9IG5ldyBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvcigpOw0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIEBwYXJhbSByZXNvdXJjZQ0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+cmVzb3VyY2U8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcihmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSANCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHJlc291cmNlLCAicmVzb3VyY2UiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykNCi0Jew0KLQkJaWYgKCFyZXNvdXJjZS5pc1NhdmVFbmFibGVkKCkgfHwgbXNnLmlzVG91Y2goKSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSAhPSBOb3RpZmljYXRpb24uU0VUICYmIG1zZy5nZXRFdmVudFR5cGUoKSAhPSBOb3RpZmljYXRpb24uVU5TRVQpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWlmIChjaGVja1ZhbHVlKG1zZykpIHsNCi0JCQlzYXZlKG1zZyk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZWZhdWx0IHZhbHVlIGNoZWNrIC0gd29ya3Mgb25seSBmb3IgU3RyaW5nIHZhbHVlcywgdHJpbXMgdGhlDQotCSAqIG5ldyB2YWx1ZSBjaGVja3MgZm9yIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBpZiBpdCBpcyBub3QgbnVsbCBwdXRzIHRoZQ0KLQkgKiB2YWx1ZSB0byB0aGUgb2JqZWN0IGFuZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4NCi0JICogQHBhcmFtIG1zZw0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIHZhbHVlIGlzIHZhbGlkDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1ZhbHVlKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpDQotCXsNCi0JCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpZ2V0VGFyZ2V0KCk7DQotCQlmaW5hbCBTdHJpbmcgbmV3VmFsdWUgPSBnZXROZXdTdHJpbmdWYWx1ZShtc2cpOw0KLQkJaWYgKG5ld1ZhbHVlPT1udWxsKSB7CQkJDQotCQkJcmV0dXJuIHJldmVydFZhbHVlKG9iaiwgbXNnKTsNCi0JCX0NCi0JCQ0KLQkJLy8gdGhpcyBjYWxsIGlzIG5lZWRlZCBjYXVzZSBuZXdWYWx1ZSBtaWdodCBiZSB0cmltbWVkDQotCQlwdXRWYWx1ZShvYmosIChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSwgbmV3VmFsdWUpOw0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNhdmUoZmluYWwgTm90aWZpY2F0aW9uIG1zZykNCi0Jew0KLQkJYm9vbGVhbiBwcm9jZXNzZWQgPSBmYWxzZTsNCi0JCXRyeSB7DQotCQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsNCi0JCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJaWYgKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpPT0wICYmICFpc0Fubm90YXRpb25SZXF1aXJlZCgpKSB7DQotCQkJCWdldEFubm90YXRpb25Xcml0ZXIoKS5yZW1vdmUoYW5ub3RhdGlvbik7DQotCQkJfSBlbHNlIHsNCi0JCQkJZ2V0QW5ub3RhdGlvbldyaXRlcigpLnVwZGF0ZShhbm5vdGF0aW9uKTsNCi0JCQl9DQotCQkJcHJvY2Vzc2VkID0gdHJ1ZTsNCi0JCX0gDQotCQljYXRjaCAoQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiBlKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfSANCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCQlmaW5hbGx5IHsNCi0JCQlpZighcHJvY2Vzc2VkKSB7DQotCQkJCXJldmVydFZhbHVlKChFT2JqZWN0KWdldFRhcmdldCgpLCBtc2cpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGFic3RyYWN0IElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0Fubm90YXRpb25SZXF1aXJlZCgpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpDQotCXsNCi0JICAgIHJldHVybiBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3M9PXR5cGU7DQotCX0NCi0JDQotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKCkJew0KLQkJcmV0dXJuIHJlc291cmNlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgRG9tVXRpbCB1dGlsKCkgew0KLQkJcmV0dXJuIHV0aWw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvciBkZWZDYWxjKCkJew0KLQkJcmV0dXJuIGRlZkNhbGM7DQotCX0NCi0JDQotCXByb3RlY3RlZCBBbm5vdGF0aW9uV3JpdGVyIGdldEFubm90YXRpb25Xcml0ZXIoKQ0KLQl7DQotCQlyZXR1cm4gQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpOw0KLQl9DQotDQotCXByb3RlY3RlZCBJUGFyYW1WYWx1ZVBhaXIgY3JlYXRlUGFyYW1WYWx1ZShTdHJpbmcgcGFyYW0sIFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJZmluYWwgSVZhbHVlIGlWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKHZhbHVlKTsNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKHBhcmFtLCBpVmFsdWUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVBhcmFtVmFsdWVQYWlyIGNyZWF0ZVBhcmFtVmFsdWUoU3RyaW5nIHBhcmFtLCBib29sZWFuIHZhbHVlKQ0KLQl7DQotCQlmaW5hbCBJVmFsdWUgaVZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKHZhbHVlKTsNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKHBhcmFtLCBpVmFsdWUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVR5cGUgZmluZFR5cGUoZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIFN0cmluZyB0eXBlRlFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUVPYmplY3Qgd2ViUHJvamVjdCA9IG9iamVjdC5lQ29udGFpbmVyKCk7DQotCQl3aGlsZSghKHdlYlByb2plY3QgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpICYmIHdlYlByb2plY3QhPW51bGwpIHsNCi0JCQl3ZWJQcm9qZWN0ID0gd2ViUHJvamVjdC5lQ29udGFpbmVyKCk7DQotCQl9DQotCQkNCi0JCWlmICh3ZWJQcm9qZWN0PT1udWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQlmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSAoKElXZWJTZXJ2aWNlUHJvamVjdCl3ZWJQcm9qZWN0KS5nZXROYW1lKCk7DQotCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSByZXNvdXJjZS5qYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7CQkNCi0JCXJldHVybiBqYXZhUHJvamVjdC5maW5kVHlwZSh0eXBlRlFOYW1lKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlYWRzIHRoZSBuZXcgc3RyaW5nIHZhbHVlIGZyb20gPGNvZGU+bXNnPC9jb2RlPi4gDQotCSAqIEBwYXJhbSBtc2cNCi0JICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmFsdWUgaXMgZW1wdHkgc3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+LCBvdGhlcndpc2UgdGhlIHRyaW1tZWQgc3RyaW5nIHZhbHVlLg0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROZXdTdHJpbmdWYWx1ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKSANCi0Jew0KLQkJZmluYWwgU3RyaW5nIG5ld1ZhbHVlID0gKG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6IG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpLnRyaW0oKTsNCi0JCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmIG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkgew0KLQkJCXJldHVybiBuZXdWYWx1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXZlcnRzIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgY2hhbmdlZCBmZWF0dXJlIHRvIHRoZSBvbGQgdmFsdWUgYW5kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+DQotCSAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiZSByZXZlcnRlZA0KLQkgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlDQotCSAqIEByZXR1cm4gYWx3YXlzIHJldHVybnMgZmFsc2UNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIHJldmVydFZhbHVlKGZpbmFsIEVPYmplY3Qgb2JqLCBmaW5hbCBOb3RpZmljYXRpb24gbXNnKQ0KLQl7DQotCQlwdXRWYWx1ZShvYmosIChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSwgbXNnLmdldE9sZFZhbHVlKCkpOw0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUHV0cyB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IHRvIHRoZSBjaGFuZ2VkIGZlYXR1cmUuDQotCSAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiZSB1cGRhdGVkDQotCSAqIEBwYXJhbSBtc2cgdGhlIG5vdGlmaWNhdGlvbiBtZXNzYWdlDQotCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIHRvIGJlIHB1dA0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgcHV0VmFsdWUoZmluYWwgRU9iamVjdCBvYmosIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBmaW5hbCBPYmplY3QgbmV3VmFsdWUpDQotCXsNCi0JCXRyeSB7DQotCQkJb2JqLmVTZXREZWxpdmVyKGZhbHNlKTsNCi0JCQlvYmouZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7DQotCQl9IGZpbmFsbHkgew0KLQkJCW9iai5lU2V0RGVsaXZlcih0cnVlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIFRyZWVTZXQ8SVBhcmFtVmFsdWVQYWlyPiBjcmVhdGVQYXJhbVZhbHVlU29ydGVkVHJlZVNldCgpDQotCXsNCi0JCXJldHVybiBuZXcgVHJlZVNldDxJUGFyYW1WYWx1ZVBhaXI+KG5ldyBQYXJhbVZhbHVlQ29tcGFyYXRvcigpKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcigpDQotCXsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL01ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvTWV0aG9kU2VyaWFsaXplckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg3NWY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvTWV0aG9kU2VyaWFsaXplckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGZvciB7QGxpbmsgSVdlYk1ldGhvZH0gc2VyaWFsaXphdGlvbi4gTGlzdGVucyBmb3IgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYW5kIA0KLSAqIHNlcmlhbGl6ZXMgdGhlIG5ldyBvYmplY3QgY29udGVudCB0byB0aGUgdW5kZXJseWluZyBqYXZhIGNsYXNzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyDQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSBET00gcmVzb3VyY2UgDQotCSAqLw0KLQlwdWJsaWMgTWV0aG9kU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgew0KLQkJc3VwZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUmVxdWlyZWQoKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0JewkJDQotCQlhc3NlcnQgZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJV2ViTWV0aG9kOw0KLQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZClnZXRUYXJnZXQoKTsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upd2ViTWV0aG9kLmVDb250YWluZXIoKTsNCi0JCWlmIChzZWkgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJZmluYWwgSVR5cGUgc2VpVHlwZSA9IGZpbmRUeXBlKHNlaSwgc2VpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSB1dGlsKCkuZmluZE1ldGhvZChzZWlUeXBlLCB3ZWJNZXRob2QpOwkJDQotCQlpZiAobWV0aG9kPT1udWxsKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSU1ldGhvZCBmb3IgRE9NIG1ldGhvZCB3YXMgbm90IGZvdW5kIik7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fQU5OT1RBVElPTiwgbWV0aG9kLCBkZWZpbmVQYXJhbVZhbHVlcyh3ZWJNZXRob2QsIG1ldGhvZCkpOwkNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBkZWZpbmVQYXJhbVZhbHVlcyhmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSU1ldGhvZCBtZXRob2QpDQotCXsNCi0JCWZpbmFsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycyA9IGNyZWF0ZVBhcmFtVmFsdWVTb3J0ZWRUcmVlU2V0KCk7DQotCQlpZiAod2ViTWV0aG9kLmdldE5hbWUoKSE9bnVsbCAmJiAhd2ViTWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldEVsZW1lbnROYW1lKCkpKSB7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX05BTUVfQVRUUklCVVRFLCB3ZWJNZXRob2QuZ2V0TmFtZSgpKSk7DQotCQl9DQotCQkNCi0JCWlmICh3ZWJNZXRob2QuaXNFeGNsdWRlZCgpKSB7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0VYQ0xVREVEX0FUVFJJQlVURSwgdHJ1ZSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcGFyYW1WYWx1ZVBhaXJzOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tWYWx1ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKQ0KLQl7DQotCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKTsNCi0JCWlmIChmZWF0dXJlLmdldEZlYXR1cmVJRCgpIT1Eb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWlmICghc3VwZXIuY2hlY2tWYWx1ZShtc2cpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTdiMWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuSEVBREVSX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5QQVJUX05BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLlRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT047DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLkFubm90YXRpb25BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uSUFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5KZWU1RG9tVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogQ2xhc3MgdGhhdCBzZXJpYWxpemVzIHtAbGluayBJV2ViUGFyYW19IG9iamVjdHMgdG8gV2ViUGFyYW0gYW5ub3RhdGlvbiBpbiB1bmRlcmx5aW5nIGphdmENCi0gKiBjbGFzcy4gQ2hlY2tzIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvbWl0cyB0aGUgZGVmYXVsdHMuDQotICogIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyDQotew0KLQlwcml2YXRlIGZpbmFsIEplZTVEb21VdGlscyBqZWU1VXRpbHMgPSBKZWU1RG9tVXRpbHMuZ2V0SW5zdGFuY2UoKTsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiBAcGFyYW0gcmVzb3VyY2UNCi0JICovDQotCXB1YmxpYyBQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSB7DQotCQlzdXBlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIA0KLQl7DQotCQlpZiAoIXJlc291cmNlKCkuaXNTYXZlRW5hYmxlZCgpKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKTsNCi0JCWlmIChmZWF0dXJlLmdldEZlYXR1cmVJRCgpPT1Eb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRSkgDQotCQl7DQotCQkJdHJ5IHsNCi0JCQkJY2hhbmdlUGFydE5hbWUobXNnKTsNCi0JCQl9IA0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KLQkJCQkobmV3IExvZ2dlcigpKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJfQ0KLQkJfQkNCi0JCQ0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgY2hhbmdlUGFydE5hbWUoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWdldFRhcmdldCgpOw0KLQkJaWYgKGplZTVVdGlscy5pc1BhcnROYW1lVXNlZCh3ZWJQYXJhbSkpIA0KLQkJew0KLQkJCWZpbmFsIElBbm5vdGF0aW9uQWRhcHRlciBhbm5BZGFwdGVyID0gKElBbm5vdGF0aW9uQWRhcHRlciApQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdlYlBhcmFtLCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubiA9IGFubkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihXUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OKTsNCi0JCQlpZiAoYW5uIT1udWxsICYmIGFubi5nZXRQcm9wZXJ0eVZhbHVlKFdQQW5ub3RhdGlvbkZlYXR1cmVzLlBBUlRfTkFNRV9BVFRSSUJVVEUpIT1udWxsKSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmIChjaGVja1ZhbHVlKG1zZykpIHsNCi0JCQlwdXRWYWx1ZSh3ZWJQYXJhbSwgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19QQVJUX05BTUUsIG1zZy5nZXROZXdWYWx1ZSgpKTsNCi0JCX0NCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblJlcXVpcmVkKCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWdldFRhcmdldCgpOw0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7DQotCQlpZiAod2ViTWV0aG9kPT1udWxsIHx8IHdlYk1ldGhvZC5lQ29udGFpbmVyKCk9PW51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVR5cGUgc2VpVHlwZSA9IGZpbmRUeXBlKHdlYk1ldGhvZCwgKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdlYk1ldGhvZC5lQ29udGFpbmVyKCkpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSB1dGlsKCkuZmluZE1ldGhvZChzZWlUeXBlLCB3ZWJNZXRob2QpOw0KLQkJDQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbihXUF9BTk5PVEFUSU9OLCANCi0JCQkJbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSksDQotCQkJCWRlZmluZVBhcmFtVmFsdWVzKHdlYlBhcmFtLCB3ZWJNZXRob2QpKTsJDQotCX0NCi0JDQotCXByb3RlY3RlZCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBkZWZpbmVQYXJhbVZhbHVlcyhmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0sIGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlmaW5hbCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiB2YWx1ZVBhaXJzID0gY3JlYXRlUGFyYW1WYWx1ZVNvcnRlZFRyZWVTZXQoKTsNCi0JCQ0KLQkJaWYgKHdlYlBhcmFtLmdldEtpbmQoKSE9V2ViUGFyYW1LaW5kLklOKSB7DQotCQkJdmFsdWVQYWlycy5hZGQoY3JlYXRlTW9kZVZhbHVlUGFpcih3ZWJQYXJhbSkpOw0KLQkJfQ0KLQkJDQotCQlpZiAod2ViUGFyYW0uaXNIZWFkZXIoKSkgew0KLQkJCXZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoSEVBREVSX0FUVFJJQlVURSwgdHJ1ZSkpOw0KLQkJfQ0KLQ0KLQkJZmluYWwgU3RyaW5nIGRlZk5hbWUgPSBkZWZDYWxjKCkuY2FsY1dlYlBhcmFtRGVmYXVsdE5hbWUod2ViUGFyYW0pOw0KLQkJaWYgKGplZTVVdGlscy5pc05hbWVSZXF1aXJlZCh3ZWJQYXJhbSkgfHwgDQotCQkJKCF3ZWJQYXJhbS5nZXROYW1lKCkuZXF1YWxzKGRlZk5hbWUpICYmIGplZTVVdGlscy5pc05hbWVVc2VkKHdlYlBhcmFtKSkpIA0KLQkJew0KLQkJCXZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoTkFNRV9BVFRSSUJVVEUsIHdlYlBhcmFtLmdldE5hbWUoKSkpOw0KLQkJfQ0KLQkJDQotCQlpZiAoamVlNVV0aWxzLmlzUGFydE5hbWVVc2VkKHdlYlBhcmFtKSAmJiAhd2ViUGFyYW0uZ2V0UGFydE5hbWUoKS5lcXVhbHMoZGVmTmFtZSkpIHsNCi0JCQl2YWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFBBUlRfTkFNRV9BVFRSSUJVVEUsIHdlYlBhcmFtLmdldFBhcnROYW1lKCkpKTsNCi0JCX0NCi0NCi0JCWlmICh3ZWJQYXJhbS5nZXRUYXJnZXROYW1lc3BhY2UoKSE9bnVsbCkgDQotCQl7DQotCQkJZmluYWwgU3RyaW5nIGRlZk5zID0gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyh3ZWJNZXRob2QsIHdlYlBhcmFtKTsNCi0JCQlpZiAod2ViUGFyYW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkudHJpbSgpLmxlbmd0aCgpICE9IDAgJiYgIXdlYlBhcmFtLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhkZWZOcykpIHsNCi0JCQkJdmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSwgd2ViUGFyYW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiB2YWx1ZVBhaXJzOw0KLQl9CQ0KLQkNCi0JcHJvdGVjdGVkIElQYXJhbVZhbHVlUGFpciBjcmVhdGVNb2RlVmFsdWVQYWlyKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkgDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IG51bGw7DQotCQlzd2l0Y2ggKHdlYlBhcmFtLmdldEtpbmQoKSkgDQotCQl7DQotCQljYXNlIE9VVDoNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9PVVQpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBJTk9VVDoNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9JTk9VVCk7DQotCQkJYnJlYWs7DQotCQlkZWZhdWx0Og0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShXUEFubm90YXRpb25GZWF0dXJlcy5NT0RFX0FUVFJJQlVURSwgdmFsdWUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNQYXJhbVdpdGhTYW1lTmFtZShmaW5hbCBJV2ViUGFyYW0gcGFyYW0sIGZpbmFsIFN0cmluZyBuZXdOYW1lKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXBhcmFtLmVDb250YWluZXIoKTsNCi0JCWZvciAoSVdlYlBhcmFtIHdlYlBhcmFtIDogd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKSkgDQotCQl7DQotCQkJaWYod2ViUGFyYW09PXBhcmFtKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlpZih3ZWJQYXJhbS5nZXROYW1lKCkuZXF1YWxzKG5ld05hbWUpKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tWYWx1ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKSANCi0Jew0KLQkJaWYoKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSkuZ2V0RmVhdHVyZUlEKCk9PURvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gc3VwZXIuY2hlY2tWYWx1ZShtc2cpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZWlTZXJpYWxpemVyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlaVNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzYmJhNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlaVNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIHRoYXQgb24ge0BsaW5rIElXZWJTZXJ2aWNlfSBvYmplY3QgY2hhbmdlIHNhdmVzIHRoZSBhbm5vdGF0aW9uIHRvIA0KLSAqIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXQuIFVzZXMge0BsaW5rIEpheFdzV29ya3NwYWNlUmVzb3VyY2V9IHRvIGRlZmluZSANCi0gKiBpZiBzYXZlIG9wZXJhdGlvbiBpcyBlbmFibGVkLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyDQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIHJlc291cmNlDQotCSAqLw0KLQlwdWJsaWMgU2VpU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgew0KLQkJc3VwZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUmVxdWlyZWQoKSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQkNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiAJDQotCXsNCi0JCWFzc2VydCBnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotDQotCQlyZXR1cm4gY3JlYXRlSUFubm90YXRpb24oKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpZ2V0VGFyZ2V0KCksIHJlc291cmNlKCkuamF2YU1vZGVsKCkpOw0KLQl9DQotDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBjcmVhdGVJQW5ub3RhdGlvbihmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgZmluYWwgSUphdmFNb2RlbCBqYXZhTW9kZWwpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHNlaSwgInNlaSIpOy8vJE5PTi1OTFMtMSQNCi0JCW51bGxDaGVja1BhcmFtKGphdmFNb2RlbCwgImphdmFNb2RlbCIpOy8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJaWYgKHNlaS5pc0ltcGxpY2l0KCkpIA0KLQkJew0KLQkJCWlmIChzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5zaXplKCkgPT0gMCkgew0KLQkJCQkvLyB0aGUgaW1wbGljaXQgU0VJIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwcm9qZWN0DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gbmV3IFdzU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UoKSkuY3JlYXRlSUFubm90YXRpb24oc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuZ2V0KDApLCBqYXZhTW9kZWwpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJVHlwZSB0eXBlID0gZmluZFR5cGUoc2VpLCBzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlpZiAodHlwZSA9PSBudWxsKSB7DQotCQkJLy8gdGhlIGV4cGxpY2l0IFNFSSBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcHJvamVjdA0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJZmluYWwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzID0gY3JlYXRlUGFyYW1WYWx1ZVNvcnRlZFRyZWVTZXQoKTsNCi0NCi0JCWlmIChzZWkuZ2V0TmFtZSgpIT1udWxsICYmICFzZWkuZ2V0TmFtZSgpLmVxdWFscyhKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0dHlwZU5hbWUoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpKSkgew0KLQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXU0Fubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURSwgc2VpLmdldE5hbWUoKSkpOw0KLQkJfQ0KLQkJaWYgKHNlaS5nZXRUYXJnZXROYW1lc3BhY2UoKSE9bnVsbCAmJiAhc2VpLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSh0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkpKSkgew0KLQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSwgc2VpLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04sIHR5cGUsIHBhcmFtVmFsdWVQYWlycyk7CQ0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZXJpYWxpemVyQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZXJpYWxpemVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzRmYmIzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklBbm5vdGF0aW9uU2VyaWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbUFkYXB0ZXJGYWN0b3J5Ow0KLS8qKg0KLSAqIEZhY3RvcnkgZm9yIHNlcmlhbGl6YXRpb24gYWRhcHRlcnMuIFRoaXMgZmFjdG9yeSBpcyBpbnN0YW50aWF0ZWQgb24gY29uc3RydWN0aW9uIGJ5IA0KLSAqIHtAbGluayBKYXhXc1dvcmtzcGFjZVJlc291cmNlfSBhbmQgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIHRoZSBzYW1lIGluc3RhbmNlDQotICogaW4gY2FzZSB5b3UgbmVlZCB0aGlzIGZhY3RvcnkuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZXJpYWxpemVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBEb21BZGFwdGVyRmFjdG9yeQ0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOw0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIA0KLQkgKiBAcGFyYW0gcmVzb3VyY2UNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnJlc291cmNlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIFNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeShmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0ocmVzb3VyY2UsICJyZXNvdXJjZSIpOy8vJE5PTi1OTFMtMSQNCi0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgV3NTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgU2VpU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IE1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJQYXJhbUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFBhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpDQotCXsNCi0JCXJldHVybiBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MgPT0gdHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvV3NTZXJpYWxpemVyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1dzU2VyaWFsaXplckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGUxZDVjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvV3NTZXJpYWxpemVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgdGhhdCBvbiB7QGxpbmsgSVdlYlNlcnZpY2V9IG9iamVjdCBjaGFuZ2Ugc2F2ZXMgdGhlIGFubm90YXRpb24gdG8gDQotICogdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdC4gVXNlcyB7QGxpbmsgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZX0gdG8gZGVmaW5lIA0KLSAqIGlmIHNhdmUgb3BlcmF0aW9uIGlzIGVuYWJsZWQuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc1NlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcg0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIA0KLQkgKiBAcGFyYW0gcmVzb3VyY2UNCi0JICovDQotCXB1YmxpYyBXc1NlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UpIA0KLQl7DQotCQlzdXBlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25SZXF1aXJlZCgpIHsNCi0JCXJldHVybiB0cnVlOw0KLQl9CQkNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJYXNzZXJ0IGdldFRhcmdldCgpIGluc3RhbmNlb2YgSVdlYlNlcnZpY2U7DQotCQkNCi0JCXJldHVybiBjcmVhdGVJQW5ub3RhdGlvbigoSVdlYlNlcnZpY2UpZ2V0VGFyZ2V0KCksIHJlc291cmNlKCkuamF2YU1vZGVsKCkpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gY3JlYXRlSUFubm90YXRpb24oZmluYWwgSVdlYlNlcnZpY2Ugd3MsIGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHdzLCAid3MiKTsvLyROT04tTkxTLTEkDQotCQludWxsQ2hlY2tQYXJhbShqYXZhTW9kZWwsICJqYXZhTW9kZWwiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCWZpbmFsIElUeXBlIHR5cGUgPSBmaW5kVHlwZSh3cywgd3MuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlpZiAodHlwZT09bnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMgPSBjcmVhdGVQYXJhbVZhbHVlU29ydGVkVHJlZVNldCgpOw0KLQkJDQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IHdzLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJaWYgKHNlaSE9bnVsbCkgDQotCQl7CQkJDQotCQkJaWYgKHNlaS5pc0ltcGxpY2l0KCkpIA0KLQkJCXsNCi0JCQkJU3RyaW5nIHNlaU5hbWUgPSBzZWkuZ2V0TmFtZSgpOw0KLQkJCQlpZiAoIUpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZShzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSkuZXF1YWxzKHNlaU5hbWUpKSB7DQotCQkJCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEUsIHdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldE5hbWUoKSkpOw0KLQkJCQl9DQotCQkJfSBlbHNlIHsNCi0JCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLkVORFBPSU5UX0lOVEVSRkFDRV9BVFRSSUJVVEUsIHdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldEltcGxlbWVudGF0aW9uKCkpKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmICh3cy5nZXROYW1lKCkhPW51bGwgJiYgDQotCQkJIXdzLmdldE5hbWUoKS5lcXVhbHMoSmF4V3NVdGlscy5nZXREZWZhdWx0U2VydmljZU5hbWUod3MuZ2V0SW1wbGVtZW50YXRpb24oKSkpKSANCi0JCXsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuU0VSVklDRV9OQU1FX0FUVFJJQlVURSwgd3MuZ2V0TmFtZSgpKSk7DQotCQl9CQkJCQ0KLQkJaWYgKHdzLmdldFBvcnROYW1lKCkhPW51bGwgJiYgDQotCQkJIXdzLmdldFBvcnROYW1lKCkuZXF1YWxzKEpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnROYW1lKHdzLmdldEltcGxlbWVudGF0aW9uKCkpKSkgDQotCQl7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLlBPUlRfTkFNRV9BVFRSSUJVVEUsIHdzLmdldFBvcnROYW1lKCkpKTsNCi0JCX0NCi0JCWlmICh3cy5nZXRUYXJnZXROYW1lc3BhY2UoKSE9bnVsbCAmJiANCi0JCQkhd3MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSkpKSANCi0JCXsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUsIHdzLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7DQotCQl9DQotCQlpZiAod3MuZ2V0V3NkbExvY2F0aW9uKCkhPW51bGwpIHsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NETF9MT0NBVElPTl9BVFRSSUJVVEUsIHdzLmdldFdzZGxMb2NhdGlvbigpKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04sIHR5cGUsIHBhcmFtVmFsdWVQYWlycyk7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9NZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9NZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZmE4NTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvTWV0aG9kUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotDQotLyoqDQotICogRGVmaW5lcyB0aGUgc3RhdGUgb2Ygd2ViIG1ldGhvZCBwcm9wZXJ0aWVzLiBJbiBjYXNlIHRoZSBtZXRob2QgaXMgcGFydCBvZg0KLSAqIG91dHNpZGUtaW4gd2ViIHNlcnZpY2UgYWxsIHByb3BlcnRpZXMgYXJlIGltbXV0YWJsZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlTdGF0ZSANCi17DQotCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlYWJsZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2QgbWV0aG9kID0gKElXZWJNZXRob2QpZ2V0VGFyZ2V0KCk7IA0KLQkJaWYgKGlzT3V0aWRlSW5XcyhtZXRob2QpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkNCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fTkFNRToNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0JCQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByaXZhdGUgYm9vbGVhbiBpc091dGlkZUluV3MoZmluYWwgSVdlYk1ldGhvZCBtZXRob2QpDQotCXsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpbWV0aG9kLmVDb250YWluZXIoKTsNCi0JCWlmIChzZWk9PW51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA6IHNlaS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKSB7DQotCQkJaWYgKHdlYlNlcnZpY2UuZ2V0V3NkbExvY2F0aW9uKCkhPW51bGwpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQotCQlyZXR1cm4gSVByb3BlcnR5U3RhdGUuY2xhc3MgPT0gdHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1BhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1BhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwMmVhNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkplZTVEb21VdGlsczsNCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBmb3Ige0BsaW5rIElXZWJQYXJhbX0gYXJlIGVkaXRhYmxlDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSVByb3BlcnR5U3RhdGUNCi17DQotCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlYWJsZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgCQ0KLQl7DQotCQlhc3NlcnQgZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJV2ViUGFyYW07DQotCQkNCi0JCWZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSA9IChJV2ViUGFyYW0pZ2V0VGFyZ2V0KCk7DQotCQlpZiAod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoInJldHVybiIpKSB7Ly8kTk9OLU5MUy0xJA0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGlzT3V0c2lkZUluV2ViU2VydmljZSh3ZWJQYXJhbSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKSANCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19OQU1FOg0KLQkJCXJldHVybiBpc05hbWVDaGFuZ2VhYmxlKHdlYlBhcmFtKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJcmV0dXJuIGlzUGFydE5hbWVDaGFuZ2VhYmxlKHdlYlBhcmFtKTsJCQkNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCXJldHVybiBpc1RhcmdldE5TQ2hhbmdlYWJsZSh3ZWJQYXJhbSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJ0TmFtZUNoYW5nZWFibGUoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsJCQ0KLQkJDQotCQlyZXR1cm4gKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCk9PVNPQVBCaW5kaW5nU3R5bGUuUlBDICYmDQotCQkJCXdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1VzZSgpPT1TT0FQQmluZGluZ1VzZS5MSVRFUkFMICYmDQotCQkJCXdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk9PVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzTmFtZUNoYW5nZWFibGUoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsJCQ0KLQkJaWYgKGlzRG9jdW1lbnRMaXRlcmFsV3JhcHBlZCh3ZWJNZXRob2QpKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCWlmIChKZWU1RG9tVXRpbHMuZ2V0SW5zdGFuY2UoKS5pc05hbWVSZXF1aXJlZCh3ZWJQYXJhbSkpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdlYlBhcmFtLmlzSGVhZGVyKCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFyZ2V0TlNDaGFuZ2VhYmxlKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7CQkNCi0JCWlmIChpc0RvY3VtZW50TGl0ZXJhbFdyYXBwZWQod2ViTWV0aG9kKSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gd2ViUGFyYW0uaXNIZWFkZXIoKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2N1bWVudExpdGVyYWxXcmFwcGVkKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlyZXR1cm4gISh3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLlJQQyB8fA0KLQkJCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdVc2UoKT09U09BUEJpbmRpbmdVc2UuRU5DT0RFRCB8fA0KLQkJCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc091dHNpZGVJbldlYlNlcnZpY2UoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdlYlBhcmFtLmVDb250YWluZXIoKS5lQ29udGFpbmVyKCk7CQkNCi0JCXJldHVybiBEb21VdGlsLklOU1RBTkNFLmlzT3V0c2lkZUluV2ViU2VydmljZShzZWkpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eVN0YXRlLmNsYXNzID09IHR5cGU7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1Byb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTc4NWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb21BZGFwdGVyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGZhY3RvcnkgZm9yIGFkYXB0ZXJzIGltcGxlbWVudGluZyB7QGxpbmsgSVByb3BlcnR5U3RhdGV9IGludGVyZmFjZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIERvbUFkYXB0ZXJGYWN0b3J5DQotew0KLQkvKioNCi0JICogU2luZ2xldG9uIGluc3RhbmNlIGZvciB0aGlzIGFkYXB0ZXIgZmFjdG9yeSANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeSgpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eVN0YXRlLmNsYXNzID09IG9iamVjdDsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgV3NQcm9wZXJ0eVN0YXRlQWRhcHRlcigpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFNlaVByb3BlcnR5U3RhdGVBZGFwdGVyKCk7DQotCX0JDQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IE1ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyKCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCl7DQotCQlyZXR1cm4gbmV3IFBhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9TZWlQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9TZWlQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YmNjNmM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIHtAbGluayBJUHJvcGVydHlTdGF0ZX0gYWRhcHRlciBmb3Ige0BsaW5rIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2V9IG9iamVjdHMuDQotICogIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eVN0YXRlDQotew0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWFibGUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlpZiAoIShnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWdldFRhcmdldCgpOw0KLQkJaWYgKGlzT3V0c2lkZUluV3Moc2VpKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJc3dpdGNoKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FOg0KLQkJCXJldHVybiB0cnVlOw0KLQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQlyZXR1cm4gIXNlaS5pc0ltcGxpY2l0KCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc091dHNpZGVJbldzKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKSANCi0JewkJDQotCQlmb3IgKElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgOiBzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSkgew0KLQkJCWlmICh3ZWJTZXJ2aWNlLmdldFdzZGxMb2NhdGlvbigpIT1udWxsKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eVN0YXRlLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1dzUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzcwM2ViOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1dzUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi0NCi0vKioNCi0gKiB7QGxpbmsgSVByb3BlcnR5U3RhdGV9IGFkYXB0ZXIgZm9yIHtAbGluayBJV2ViU2VydmljZX0gb2JqZWN0cy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFdzUHJvcGVydHlTdGF0ZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eVN0YXRlDQotew0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWFibGUoZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlpZiAoIShnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWlmIChpc091dHNpZGVJbldzKChJV2ViU2VydmljZSlnZXRUYXJnZXQoKSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKQ0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fTkFNRTogDQotCQkJcmV0dXJuIHRydWU7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUU6DQotCQkJcmV0dXJuIHRydWU7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzT3V0c2lkZUluV3MoZmluYWwgSVdlYlNlcnZpY2Ugd3MpIA0KLQl7DQotCQlyZXR1cm4gd3MuZ2V0V3NkbExvY2F0aW9uKCkgIT0gbnVsbDsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlTdGF0ZS5jbGFzcyA9PSB0eXBlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TWV0aG9kU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1ZDNkMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TWV0aG9kU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5TQkFubm90YXRpb25GZWF0dXJlcy5TQl9BTk5PVEFUSU9OOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fRVhDTFVERURfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX05BTUVfQVRUUklCVVRFOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLlNCQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi0NCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXIgZXh0ZW5kcyBFbGVtZW50U3luY2hyb25pemVySW1wbA0KLXsNCi0JcHJpdmF0ZSBQYXJhbWV0ZXJTeW5jaHJvbml6ZXIgcGFyYW1ldGVyU3luY2hyb25pemVyID0gbmV3IFBhcmFtZXRlclN5bmNocm9uaXplcih0aGlzKTsNCi0JDQotCXByb3RlY3RlZCBpbnRlcmZhY2UgSU1ldGhvZFZpc2l0b3INCi0Jew0KLQkJdm9pZCB2aXNpdChJTWV0aG9kIG1ldGhvZCwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQl9DQotDQotCXB1YmxpYyBBYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplcihJTW9kZWxFbGVtZW50U3luY2hyb25pemVyIHBhcmVudCkNCi0Jew0KLQkJc3VwZXIocGFyZW50KTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aXNpdEV4cG9zYWJsZU1ldGhvZHMoSU1ldGhvZFZpc2l0b3IgdmlzaXRvciwgSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5LCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplTWV0aG9kcyhmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgZmluYWwgSVR5cGUgc2VpVHlwZSwgZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIENvbGxlY3Rpb248SVdlYk1ldGhvZD4gbWVyZ2VkTWV0aG9kcyA9IG5ldyBMaW5rZWRMaXN0PElXZWJNZXRob2Q+KCk7DQotCQlmaW5hbCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSBzZWlUeXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKTsNCi0JCWZpbmFsIElNZXRob2RWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSU1ldGhvZFZpc2l0b3IoKQ0KLQkJew0KLQkJCXB1YmxpYyB2b2lkIHZpc2l0KElNZXRob2QgbWV0aG9kLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JCQl7DQotCQkJCWZpbmFsIElXZWJNZXRob2Qgd20gPSBvYnRhaW5JbnN0YW5jZShzZWksIG1ldGhvZCk7DQotCQkJCWlmIChtZXJnZWRNZXRob2RzLmNvbnRhaW5zKHdtKSkNCi0JCQkJew0KLQkJCQkJLyoqDQotCQkJCQkgKiBjaGVjayB3aGV0aGVyIHRoaXMgbWV0aG9kIGhhcyBiZWVuIHByb2Nlc3NlZCBpbiBzb21lIG9mIHRoZSBjaGlsZCBjbGFzc2VzLiBJZiBzbw0KLQkJCQkJICogc2tpcCBpdCBhbmQgY29udGludWUuIE9ubHkgdGhlIG1ldGhvZCBpbiB0aGUgbGFzdCBjaGlsZCBkZWNsYXJpbmcgdGhpcyBtZXRob2QgbmVlZHMNCi0JCQkJCSAqIHRvIGJlIHByb2Nlc3NlZCBiZWNhdXNlIGVhY2ggY2hpbGQgaXMgb3ZlcnJpZGluZyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIGV2ZXJ5IG92ZXJyaWRlbg0KLQkJCQkJICogbWV0aG9kLg0KLQkJCQkJICovDQotCQkJCQlyZXR1cm47DQotCQkJCX0NCi0JCQkJbWVyZ2VNZXRob2Qod20sIG1ldGhvZCwgaW5zcGVjdG9yKTsNCi0JCQkJbWVyZ2VkTWV0aG9kcy5hZGQod20pOw0KLQkJCX0NCi0JCX07DQotCQl2aXNpdEV4cG9zYWJsZU1ldGhvZHModmlzaXRvciwgaGllcmFyY2h5LCBpbnNwZWN0b3IpOw0KLQkJcmVtb3ZlTGVmdE1ldGhvZHMoc2VpLCBtZXJnZWRNZXRob2RzKTsNCi0NCi0JfQ0KLQ0KLQlwcml2YXRlIElXZWJNZXRob2Qgb2J0YWluSW5zdGFuY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIElNZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZvciAoSVdlYk1ldGhvZCB3bSA6IHNlaS5nZXRXZWJNZXRob2RzKCkpDQotCQl7DQotCQkJaWYgKHV0aWwoKS5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKS5lcXVhbHMod20uZ2V0SW1wbGVtZW50YXRpb24oKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gd207DQotCQkJfQ0KLQkJfQ0KLQkJZmluYWwgSVdlYk1ldGhvZCBuZXdXZWJNZXRob2QgPSBkb21GYWN0b3J5KCkuY3JlYXRlSVdlYk1ldGhvZCgpOw0KLQkJc2VpLmdldFdlYk1ldGhvZHMoKS5hZGQobmV3V2ViTWV0aG9kKTsNCi0JCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUobmV3V2ViTWV0aG9kLCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19JTVBMRU1FTlRBVElPTiwgdXRpbCgpLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCXJldHVybiBuZXdXZWJNZXRob2Q7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1lcmdlTWV0aG9kKElXZWJNZXRob2Qgd20sIElNZXRob2QgbSwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IHdtQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG0sIFdNX0FOTk9UQVRJT04pOw0KLQkJZmluYWwgYm9vbGVhbiBleGNsdWRlZDsNCi0JCWZpbmFsIFN0cmluZyBuYW1lOw0KLQkJaWYgKHdtQW5ub3RhdGlvbiA9PSBudWxsKQ0KLQkJew0KLQkJCWV4Y2x1ZGVkID0gZmFsc2U7DQotCQkJbmFtZSA9IG0uZ2V0RWxlbWVudE5hbWUoKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCWV4Y2x1ZGVkID0gd21Bbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV01fRVhDTFVERURfQVRUUklCVVRFKSA9PSBudWxsID8gZmFsc2UgOiBCb29sZWFuLnBhcnNlQm9vbGVhbih3bUFubm90YXRpb24NCi0JCQkJCQkJCQkJCS5nZXRQcm9wZXJ0eVZhbHVlKFdNX0VYQ0xVREVEX0FUVFJJQlVURSkpOw0KLQkJCW5hbWUgPSB3bUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTV9OQU1FX0FUVFJJQlVURSkgPT0gbnVsbCA/IG0uZ2V0RWxlbWVudE5hbWUoKSA6IHdtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdNX05BTUVfQVRUUklCVVRFKTsNCi0JCX0NCi0JCWlmICghbmFtZS5lcXVhbHMod20uZ2V0TmFtZSgpKSkNCi0JCXsNCi0JCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHdtLCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19OQU1FLCBuYW1lKTsNCi0JCX0NCi0JCWlmIChleGNsdWRlZCAhPSB3bS5pc0V4Y2x1ZGVkKCkpDQotCQl7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3bSwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQsIGV4Y2x1ZGVkKTsNCi0JCX0NCi0JCW1lcmdlU29hcEJpbmRpbmcod20sIG0sIGluc3BlY3Rvcik7DQotCQlwYXJhbWV0ZXJTeW5jaHJvbml6ZXIuc3luY2hyb25pemVQYXJhbWV0ZXJzKHdtLCBtLCBpbnNwZWN0b3IpOw0KLQkJDQotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQod20sIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7DQotCQlhZGFwdFRvTG9jYXRpb25JbnRlcmZhY2Uod20sIFdNX0FOTk9UQVRJT04sIHdtQW5ub3RhdGlvbik7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBtZXJnZVNvYXBCaW5kaW5nKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kLCBmaW5hbCBJTWV0aG9kIG1ldGhvZCwgZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IHNiQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG1ldGhvZCwgU0JfQU5OT1RBVElPTik7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gc2VpU2JBbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RUeXBlKFNCX0FOTk9UQVRJT04pOw0KLQkJDQotCQlmaW5hbCBTT0FQQmluZGluZ1N0eWxlIHN0eWxlID0gZGVmaW5lU0JTdHlsZShzYkFubm90YXRpb24sIHNlaVNiQW5ub3RhdGlvbik7DQotCQlpZiAod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKSAhPSBzdHlsZSkgew0KLQkJCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKHN0eWxlKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdVc2UgdXNlID0gZGVmaW5lU0JVc2Uoc2JBbm5vdGF0aW9uLCBzZWlTYkFubm90YXRpb24pOw0KLQkJaWYgKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1VzZSgpICE9IHVzZSkgew0KLQkJCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZSh1c2UpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIHBhcmFtU3R5bGUgPWRlZmluZVNCUGFyYW1ldGVyU3R5bGUoc2JBbm5vdGF0aW9uLCBzZWlTYkFubm90YXRpb24pOw0KLQkJaWYgKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgIT0gcGFyYW1TdHlsZSkgew0KLQkJCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKHBhcmFtU3R5bGUpOw0KLQkJfQ0KLQkJDQotCQlhZGFwdFRvTG9jYXRpb25JbnRlcmZhY2Uod2ViTWV0aG9kLCBTQl9BTk5PVEFUSU9OLCBzYkFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFNPQVBCaW5kaW5nU3R5bGUgZGVmaW5lU0JTdHlsZShmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiBtZXRob2RTQkFubm90YXRpb24sIGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiBzZWlTYkFubm90YXRpb24pDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IG1ldGhvZFNCQW5ub3RhdGlvbiE9bnVsbCA/IG1ldGhvZFNCQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNUWUxFX0FUVFJJQlVURSkgOiBudWxsOw0KLQkJaWYodmFsdWU9PW51bGwpIHsNCi0JCQlyZXR1cm4gZGVmQ2FsYygpLmRlZmluZVNCU3R5bGUoc2VpU2JBbm5vdGF0aW9uKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1NUWUxFX1JQQy5lbmRzV2l0aCh2YWx1ZSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdTdHlsZS5SUEM7DQotCQl9IA0KLQkJDQotCQlpZihTQkFubm90YXRpb25GZWF0dXJlcy5TQl9TVFlMRV9ET0NVTUVOVC5lbmRzV2l0aCh2YWx1ZSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVDsNCi0JCX0NCi0JCQkNCi0JCXJldHVybiBkZWZDYWxjKCkuZGVmaW5lU0JTdHlsZShzZWlTYkFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFNPQVBCaW5kaW5nVXNlIGRlZmluZVNCVXNlKGZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IG1ldGhvZFNCQW5ub3RhdGlvbiwgZmluYWwgSUFubm90YXRpb248SVR5cGU+IHNlaVNiQW5ub3RhdGlvbikgDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IG1ldGhvZFNCQW5ub3RhdGlvbiE9bnVsbCA/IG1ldGhvZFNCQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlVTRV9BVFRSSUJVVEUpIDogbnVsbDsNCi0JCWlmICh2YWx1ZT09bnVsbCkgewkJDQotCQkJcmV0dXJuIGRlZkNhbGMoKS5kZWZpbmVTQlVzZShzZWlTYkFubm90YXRpb24pOw0KLQkJfQ0KLQkJDQotCQlpZiAoU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfVVNFX0VOQ09ERUQuZW5kc1dpdGgodmFsdWUpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQ7DQotCQl9DQotCQkNCi0JCWlmIChTQkFubm90YXRpb25GZWF0dXJlcy5TQl9VU0VfTElURVJBTC5lbmRzV2l0aCh2YWx1ZSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdVc2UuTElURVJBTDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGRlZkNhbGMoKS5kZWZpbmVTQlVzZShzZWlTYkFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiBtZXRob2RTQkFubm90YXRpb24sIGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiBzZWlTYkFubm90YXRpb24pDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IG1ldGhvZFNCQW5ub3RhdGlvbiE9bnVsbCA/IG1ldGhvZFNCQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlBBUkFNRVRFUl9TVFlMRV9BVFRSSUJVVEUpIDogbnVsbDsNCi0JCWlmICh2YWx1ZT09bnVsbCkgew0KLQkJCXJldHVybiBkZWZDYWxjKCkuZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShzZWlTYkFubm90YXRpb24pOw0KLQkJfQ0KLQkJDQotCQlpZiAoU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfUEFSQU1FVEVSX1NUWUxFX0JBUkUuZW5kc1dpdGgodmFsdWUpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRTsNCi0JCX0NCi0JCQ0KLQkJaWYgKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1BBUkFNRVRFUl9TVFlMRV9XUkFQUEVELmVuZHNXaXRoKHZhbHVlKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQ7DQotCQl9CQkNCi0JCQ0KLQkJcmV0dXJuIGRlZkNhbGMoKS5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKHNlaVNiQW5ub3RhdGlvbik7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUxlZnRNZXRob2RzKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpLCBDb2xsZWN0aW9uPElXZWJNZXRob2Q+IG1lcmdlZE1ldGhvZHMpDQotCXsNCi0JCWZpbmFsIEl0ZXJhdG9yPElXZWJNZXRob2Q+IGl0ZXIgPSBzZWkuZ2V0V2ViTWV0aG9kcygpLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJaWYgKCFtZXJnZWRNZXRob2RzLmNvbnRhaW5zKGl0ZXIubmV4dCgpKSkNCi0JCQl7DQotCQkJCWl0ZXIucmVtb3ZlKCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1vZGVsU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzIzMzNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1vZGVsU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklDb21waWxhdGlvblVuaXRIYW5kbGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlLlNlcnZpY2VNb2RlbERhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyIGltcGxlbWVudHMgSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBTZWlTeW5jaHJvbml6ZXIgc2VpTG9hZGVyOw0KLQ0KLQlwcml2YXRlIGZpbmFsIFdzU3luY2hyb25pemVyIHdzTG9hZGVyOw0KLQ0KLQlwcml2YXRlIGZpbmFsIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2U7DQotDQotCXByaXZhdGUgSURPTSBkb21CZWluZ0xvYWRlZDsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhOw0KLQ0KLQlwcml2YXRlIGZpbmFsIERvbVV0aWwgdXRpbDsNCi0NCi0JcHVibGljIEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSwgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSkNCi0Jew0KLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOw0KLQkJdGhpcy51dGlsID0gbmV3IERvbVV0aWwoKTsNCi0JCXRoaXMuc2VydmljZURhdGEgPSBzZXJ2aWNlRGF0YTsNCi0JCXRoaXMuc2VpTG9hZGVyID0gbmV3IFNlaVN5bmNocm9uaXplcih0aGlzKTsNCi0JCXRoaXMud3NMb2FkZXIgPSBuZXcgV3NTeW5jaHJvbml6ZXIodGhpcyk7DQotCX0NCi0NCi0JcHVibGljIERvbUZhY3RvcnkgZG9tRmFjdG9yeSgpDQotCXsNCi0JCXJldHVybiBEb21GYWN0b3J5LmVJTlNUQU5DRTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSURPTSBnZXREb21CZWluZ0xvYWRlZCgpDQotCXsNCi0JCWlmIChkb21CZWluZ0xvYWRlZCA9PSBudWxsKQ0KLQkJew0KLQkJCWRvbUJlaW5nTG9hZGVkID0gZG9tRmFjdG9yeSgpLmNyZWF0ZUlET00oKTsNCi0JCX0NCi0JCXJldHVybiBkb21CZWluZ0xvYWRlZDsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUphdmFNb2RlbCBqYXZhTW9kZWwoKQ0KLQl7DQotCQlyZXR1cm4gcmVzb3VyY2UuamF2YU1vZGVsKCk7DQotCX0NCi0NCi0JcHVibGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIHJlc291cmNlLmxvZ2dlcigpOw0KLQl9DQotDQotCXB1YmxpYyBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKCkNCi0Jew0KLQkJcmV0dXJuIHJlc291cmNlOw0KLQl9DQotDQotCXB1YmxpYyBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKCkNCi0Jew0KLQkJcmV0dXJuIHNlcnZpY2VEYXRhOw0KLQl9DQotDQotCXB1YmxpYyBEb21VdGlsIHV0aWwoKQ0KLQl7DQotCQlyZXR1cm4gdXRpbDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ29tcGlsYXRpb25Vbml0KGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdHJ5IHsNCi0JCQlyZXNvdXJjZS5kaXNhYmxlU2F2aW5nKCk7DQotCQkJDQotCQkJaWYgKGN1LmZpbmRQcmltYXJ5VHlwZSgpID09IG51bGwgfHwgIShjdS5maW5kUHJpbWFyeVR5cGUoKS5pc0ludGVyZmFjZSgpIHx8IGN1LmZpbmRQcmltYXJ5VHlwZSgpLmlzQ2xhc3MoKSkpDQotCQkJew0KLQkJCQlpZiAobG9nZ2VyKCkuaXNEZWJ1ZygpKQ0KLQkJCQl7DQotCQkJCQlsb2dnZXIoKS5sb2dEZWJ1Zygibm8gcHJpbWFyeSB0eXBlIGluIGNvbXBpbGF0aW9uIHVuaXQiICsgY3UuZ2V0UGF0aCgpLnRvT1NTdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCXJldHVybjsNCi0JCQl9IA0KLQkJCQkJCQ0KLQkJCWZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvciA9IHJlc291cmNlKCkubmV3QW5ub3RhdGlvbkluc3BlY3RvcihjdS5maW5kUHJpbWFyeVR5cGUoKSk7DQotCQkJZmluYWwgSUFubm90YXRpb248SVR5cGU+IHdzQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShXU19BTk5PVEFUSU9OKTsNCi0JCQlpZiAod3NBbm5vdGF0aW9uID09IG51bGwpDQotCQkJew0KLQkJCQlpZiAobG9nZ2VyKCkuaXNEZWJ1ZygpKQ0KLQkJCQl7DQotCQkJCQlsb2dnZXIoKS5sb2dEZWJ1Zygibm8gIiArIFdTX0FOTk9UQVRJT04gKyAiIGFubm90YXRpb24gZm91bmQgb24gdHlwZSAiICsgY3UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkDQotCQkJCX0NCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQlyZWNvcmRIaWVyYXJjaHkoY3UuZmluZFByaW1hcnlUeXBlKCkpOw0KLQkJCQ0KLQkJCWlmICh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5pc0ludGVyZmFjZSgpKQ0KLQkJCXsNCi0JCQkJLy8gaGFuZGxlIGNsYXNzIGNoYW5nZWQgdG8gaW50ZXJmYWNlDQotCQkJCXJlbW92ZVdzTW9kZWxFbGVtZW50cyh3c1Byb2plY3QsIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBmYWxzZSk7DQotCQkJCQ0KLQkJCQlzZWlMb2FkZXIuc3luY2hyb25pemVJbnRlcmZhY2Uod3NQcm9qZWN0LCB3c0Fubm90YXRpb24sIGluc3BlY3Rvcik7DQotCQkJfSBlbHNlIGlmICh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5pc0NsYXNzKCkpDQotCQkJew0KLQkJCQkvLyBoYW5kbGUgaW50ZXJmYWNlIGNoYW5nZWQgdG8gY2xhc3MNCi0JCQkJcmVtb3ZlU2VpTW9kZWxFbGVtZW50cyh3c1Byb2plY3QsIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBmYWxzZSwgdHJ1ZSk7DQotCQkJCQ0KLQkJCQkvLyBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgY2hhbmdlZCBhbmQgZW5kcG9pbnRJbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgdGhlIGV4aXN0aW5nDQotCQkJCS8vIFNFSSBpbiB0aGUgcHJvamVjdCBzaG91bGQgYmUgcmVtb3ZlZA0KLQkJCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IHdzTG9hZGVyLnN5bmNocm9uaXplV2ViU2VydmljZSh3c1Byb2plY3QsIHdzQW5ub3RhdGlvbiwgaW5zcGVjdG9yKTsNCi0JCQkJaWYgKHdzIT1udWxsICYmICh3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKT09bnVsbCB8fCAhd3MuZ2V0U2VydmljZUVuZHBvaW50KCkuaXNJbXBsaWNpdCgpKSkgew0KLQkJCQkJcmVtb3ZlU2VpTW9kZWxFbGVtZW50cyh3c1Byb2plY3QsIHdzLmdldEltcGxlbWVudGF0aW9uKCksIGZhbHNlLCBmYWxzZSk7DQotCQkJCX0NCi0JCQl9IGVsc2UNCi0JCQl7DQotCQkJCWlmIChsb2dnZXIoKS5pc0RlYnVnKCkpDQotCQkJCXsNCi0JCQkJCWxvZ2dlcigpLmxvZ0RlYnVnKCJhbm5vdGF0aW9uICIgKyBXU19BTk5PVEFUSU9OICsgIiBpcyBwdXQgb24gdHlwZSAiLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQNCi0JCQkJCQkJCQkrIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpDQotCQkJCQkJCQkJKyAid2hpY2ggaXMgbmVpdGhlciBpbnRlcmZhY2UsIG5vciBhIGNsYXNzLiBJZ25vcnJpbmchIik7Ly8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJfQkJCQ0KLQkJfSBmaW5hbGx5IHsNCi0JCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgd2ViIHNlcnZpY2VzIGZyb20gdGhlIG1vZGVsLg0KLQkgKiBAcGFyYW0gd3NQcm9qZWN0DQotCSAqIEBwYXJhbSBpbXBsQmFzZU5hbWUNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVdzTW9kZWxFbGVtZW50cyhmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBmaW5hbCBTdHJpbmcgaW1wbEJhc2VOYW1lLCBmaW5hbCBib29sZWFuIGlzRm9yUGFja2FnZSkgDQotCXsNCi0JCWZpbmFsIEl0ZXJhdG9yPElXZWJTZXJ2aWNlPiB3c0l0ZXIgPSB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKS5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKHdzSXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSB3c0l0ZXIubmV4dCgpOw0KLQkJCWlmICh3cy5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsQmFzZU5hbWUpIHx8IA0KLQkJCQkoaXNGb3JQYWNrYWdlICYmIHdzLmdldEltcGxlbWVudGF0aW9uKCkuc3RhcnRzV2l0aChpbXBsQmFzZU5hbWUpKSkNCi0JCQl7DQotCQkJCXNlcnZpY2VEYXRhKCkuY2xlYXJIaWVyYXJjaHkod3MuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQkJCXdzSXRlci5yZW1vdmUoKTsNCi0JCQkJaWYgKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpICE9IG51bGwpDQotCQkJCXsNCi0JCQkJCXdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkucmVtb3ZlKHdzKTsNCi0JCQkJfQ0KLQkJCQlzZXJ2aWNlRGF0YSgpLnVubWFwKHdzKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIFNFSSdzIHdpdGggPGNvZGU+aW1wbEJhc2VOYW1lPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBmcm9tIHRoZSBtb2RlbC4NCi0JICogQHBhcmFtIHdzUHJvamVjdA0KLQkgKiBAcGFyYW0gaW1wbEJhc2VOYW1lDQotCSAqIEBwYXJhbSBvbmx5RXhwbGljaXQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gaW1wbGljaXQgaW50ZXJmYWNlcyBhcmUgbm90IHJlbW92ZWQgZnJvbSBtb2RlbCwgb3RoZXJ3aXNlIGJvdGggYXJlIHJlbW92ZWQuDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZWlNb2RlbEVsZW1lbnRzKGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIGZpbmFsIFN0cmluZyBpbXBsQmFzZU5hbWUsIGZpbmFsIGJvb2xlYW4gaXNGb3JQYWNrYWdlLCBmaW5hbCBib29sZWFuIG9ubHlFeHBsaWNpdCkgDQotCXsNCi0JCWZpbmFsIEl0ZXJhdG9yPElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IHNlaUl0ZXIgPSB3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoc2VpSXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBzZWlJdGVyLm5leHQoKTsNCi0JCQlpZiAoc2VpLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxCYXNlTmFtZSkgfHwNCi0JCQkJKGlzRm9yUGFja2FnZSAmJiBzZWkuZ2V0SW1wbGVtZW50YXRpb24oKS5zdGFydHNXaXRoKGltcGxCYXNlTmFtZSkpKQ0KLQkJCXsNCi0JCQkJaWYgKChvbmx5RXhwbGljaXQgJiYgc2VpLmlzSW1wbGljaXQoKSkpIHsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCXNlcnZpY2VEYXRhKCkuY2xlYXJIaWVyYXJjaHkoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJCQlzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jbGVhcigpOw0KLQkJCQlzZWlJdGVyLnJlbW92ZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQkNCi0NCi0Jdm9pZCByZWNvcmRIaWVyYXJjaHkoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBDb2xsZWN0aW9uPElDb21waWxhdGlvblVuaXQ+IGNvbXBpbGF0aW9uVW5pdHMgPSBuZXcgTGlua2VkTGlzdDxJQ29tcGlsYXRpb25Vbml0PigpOw0KLQkJDQotCQlmb3IgKElUeXBlIHN1cGVyVHlwZSA6IHR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldEFsbFN1cGVydHlwZXModHlwZSkpIHsNCi0JCQljb21waWxhdGlvblVuaXRzLmFkZChzdXBlclR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOw0KLQkJfQ0KLQkJCQ0KLQkJc2VydmljZURhdGEoKS5yZWNvcmRIaWVyYXJjaHkodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgY29tcGlsYXRpb25Vbml0cyk7DQotCX0NCi0NCi0NCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBjcmVhdGVQcm9qZWN0KGZpbmFsIElKYXZhUHJvamVjdCBqcHJqKQ0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3QgdGhpc1Byb2plY3QgPSBkb21GYWN0b3J5KCkuY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHRoaXNQcm9qZWN0LCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FLCBqcHJqLmdldEVsZW1lbnROYW1lKCkpOw0KLQ0KLQkJdXRpbCgpLmFkZFRvQ29sbGVjdGlvbkZlYXR1cmUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgRG9tUGFja2FnZS5JRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUywgdGhpc1Byb2plY3QpOw0KLQkJcmV0dXJuIHRoaXNQcm9qZWN0Ow0KLQl9DQotDQotCXByb3RlY3RlZCBjbGFzcyBMb2FkZXJDb21waWxhdGlvblVuaXRIYW5kbGVyIGltcGxlbWVudHMgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXINCi0Jew0KLQkJcHVibGljIHZvaWQgc3RhcnRlZCgpDQotCQl7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpDQotCQl7DQotCQkJcmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChnZXREb21CZWluZ0xvYWRlZCgpKTsNCi0JCX0NCi0NCi0JCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0Ow0KLQ0KLQkJcHVibGljIHZvaWQgaGFuZGxlKGZpbmFsIElKYXZhUHJvamVjdCBqcHJqKQ0KLQkJew0KLQkJCXdzUHJvamVjdCA9IGNyZWF0ZVByb2plY3QoanByaik7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBoYW5kbGUoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkNCi0JCXsNCi0JCQl0cnkNCi0JCQl7DQotCQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcm9qZWN0LCBjdSk7DQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkNCi0JCQl7DQotCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gcGFyc2UgdGhlIGNvbnRlbnQgb2YgY29tcGlsYXRpb24gdW5pdCIgKyBjdS5nZXRQYXRoKCkudG9PU1N0cmluZygpLCBqbWUpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9FbGVtZW50U3luY2hyb25pemVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0VsZW1lbnRTeW5jaHJvbml6ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmODE5NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0VsZW1lbnRTeW5jaHJvbml6ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLklBbm5vdGF0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLQ0KLWNsYXNzIEVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsIGltcGxlbWVudHMgSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcg0KLXsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBJTW9kZWxFbGVtZW50U3luY2hyb25pemVyIHBhcmVudDsNCi0JcHJpdmF0ZSBmaW5hbCBEb21VdGlsIHV0aWw7DQotCXByaXZhdGUgZmluYWwgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmYXVsdHNDYWxjdWxhdG9yOw0KLQkNCi0JRWxlbWVudFN5bmNocm9uaXplckltcGwoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXRoaXMucGFyZW50ID0gcGFyZW50Ow0KLQkJdXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCQlkZWZhdWx0c0NhbGN1bGF0b3IgPSBuZXcgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IoKTsNCi0JfQ0KLQkNCi0JcHVibGljIERvbVV0aWwgdXRpbCgpIHsNCi0JCXJldHVybiB1dGlsOw0KLQl9DQotCQ0KLQlwdWJsaWMgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYygpIHsNCi0JCXJldHVybiBkZWZhdWx0c0NhbGN1bGF0b3I7DQotCX0NCi0JDQotCXB1YmxpYyBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKCkNCi0Jew0KLQkJcmV0dXJuIHBhcmVudC5zZXJ2aWNlRGF0YSgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUxvZ2dlciBsb2dnZXIoKQ0KLQl7DQotCQlyZXR1cm4gcGFyZW50LmxvZ2dlcigpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSURPTSBnZXREb21CZWluZ0xvYWRlZCgpDQotCXsNCi0JCXJldHVybiBwYXJlbnQuZ2V0RG9tQmVpbmdMb2FkZWQoKTsNCi0JfQ0KLQkNCi0JcHVibGljIERvbUZhY3RvcnkgZG9tRmFjdG9yeSgpDQotCXsNCi0JCXJldHVybiBwYXJlbnQuZG9tRmFjdG9yeSgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUphdmFNb2RlbCBqYXZhTW9kZWwoKQ0KLQl7DQotCQlyZXR1cm4gcGFyZW50LmphdmFNb2RlbCgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSgpDQotCXsNCi0JCXJldHVybiBwYXJlbnQucmVzb3VyY2UoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKGZpbmFsIEVPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgYW5uRlFOYW1lLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbkFkYXB0ZXIgbG9jYXRvciA9IChJQW5ub3RhdGlvbkFkYXB0ZXIpQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KG9iamVjdCwgSUFubm90YXRpb25BZGFwdGVyLmNsYXNzKTsNCi0JCWxvY2F0b3IuYWRkQW5ub3RhdGlvbihhbm5GUU5hbWUsIGFubm90YXRpb24pOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Jbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Jbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGJiMDFiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvSW5pdGlhbE1vZGVsU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLQ0KLXB1YmxpYyBjbGFzcyBJbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyDQotew0KLQlwdWJsaWMgSW5pdGlhbE1vZGVsU3luY2hyb25pemVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UsIFNlcnZpY2VNb2RlbERhdGEgc2VydmljZURhdGEpDQotCXsNCi0JCXN1cGVyKHJlc291cmNlLCBzZXJ2aWNlRGF0YSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbG9hZChNYXA8Pyw/PiBvcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbg0KLQl7DQotCQl0cnkgew0KLQkJCXJlc291cmNlKCkuZGlzYWJsZVNhdmluZygpOwkJCQ0KLQkJCXJlc291cmNlKCkubmV3Q29tcGlsYXRpb25Vbml0RmluZGVyKHJlc291cmNlKCkuamF2YU1vZGVsKCksIHJlc291cmNlKCkuZ2V0UHJvamVjdFNlbGVjdG9ycygpKS4NCi0JCQkJZmluZChtb25pdG9yLCBuZXcgTG9hZGVyQ29tcGlsYXRpb25Vbml0SGFuZGxlcigpKTsNCi0JCX0gZmluYWxseSB7DQotCQkJcmVzb3VyY2UoKS5lbmFibGVTYXZpbmcoKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvT25FdmVudE1vZGVsU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvT25FdmVudE1vZGVsU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyZWNlMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL09uRXZlbnRNb2RlbFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklDb21waWxhdGlvblVuaXRGaW5kZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JUHJvamVjdFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldvcmtzcGFjZUNVRmluZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotcHVibGljIGNsYXNzIE9uRXZlbnRNb2RlbFN5bmNocm9uaXplciBleHRlbmRzIEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lcg0KLXsNCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBJRE9NIGdldERvbUJlaW5nTG9hZGVkKCkNCi0Jew0KLQkJcmV0dXJuIHJlc291cmNlKCkuZ2V0RE9NKCk7DQotCX0NCi0NCi0JcHVibGljIE9uRXZlbnRNb2RlbFN5bmNocm9uaXplcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlLCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKQ0KLQl7DQotCQlzdXBlcihyZXNvdXJjZSwgc2VydmljZURhdGEpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKGZpbmFsIEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCWlmIChsb2dnZXIoKS5pc0RlYnVnKCkpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dEZWJ1ZygiRWxlbWVudENoYW5nZWRFdmVudCBoYXMgYmVlbiBkZWxpdmVyZWQuIEV2ZW50IGRldGFpbHM6ICIgKyBldmVudC50b1N0cmluZygpKTsvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJCQ0KLQkJCS8vIG5vIHByb2Nlc3NpbmcgaWYgRE9NIGxvYWQgaGFzIGJlZW4gY2FuY2VsZWQNCi0JCQlpZiAocmVzb3VyY2UoKS5pc0xvYWRDbmFjZWxlZCgpKSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJcmVzb3VyY2UoKS5kaXNhYmxlU2F2aW5nKCk7DQotCQkJDQotCQkJLy8gaGFuZGxlcyBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfUkVDT05DSUxFIC0gdGhlIGNhc2Ugd2hlbiB0aGUgZWRpdG9yIHNlbmRzIHJlY29uY2lsZSBldmVudA0KLQkJCWlmIChldmVudC5nZXRUeXBlKCkgPT0gRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX1JFQ09OQ0lMRSkNCi0JCQl7DQotCQkJCWhhbmRsZVJlY29uY2lsZUV2ZW50KGV2ZW50KTsNCi0JCQl9DQotDQotCQkJLy8gaGFuZGxlcyBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFIC0gdGhlIGNhc2Ugd2hlbiB0aGUgY29tcGlsYXRpb24gdW5pdCBoYXMgYmVlbiBjaGFuZ2VkDQotCQkJaWYgKGV2ZW50LmdldERlbHRhKCkuZ2V0RWxlbWVudCgpICE9IHJlc291cmNlKCkuamF2YU1vZGVsKCkpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCWFzc2VydCAoZXZlbnQuZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgKElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4gfCBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpKSAhPSAwOw0KLQkJCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGQgOiBldmVudC5nZXREZWx0YSgpLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCQl7DQotCQkJCWlmIChjaGlsZC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpDQotCQkJCXsNCi0JCQkJCWhhbmRsZUNoYW5nZWRQcm9qZWN0KGNoaWxkKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0gDQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gc3luY2hyb25pemUgV2ViIFNlcnZpY2UgbW9kZWwgdXBvbiBqYXZhIGVsZW1lbnQgZGVsdGEgIisgZXZlbnQuZ2V0RGVsdGEoKSwgY2UpOyAvLyROT04tTkxTLTEkDQotCQl9IA0KLQkJY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHN5bmNocm9uaXplIFdlYiBTZXJ2aWNlIG1vZGVsIHVwb24gamF2YSBlbGVtZW50IGRlbHRhICIgKyBldmVudC5nZXREZWx0YSgpLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJfSANCi0JCWZpbmFsbHkgew0KLQkJCXJlc291cmNlKCkuZW5hYmxlU2F2aW5nKCk7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsZUV2ZW50KGZpbmFsIEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYoIShldmVudC5nZXREZWx0YSgpLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQgKSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJaW50IHJlcXVpcmVkRmxhZ3MgPSBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQgfCBJSmF2YUVsZW1lbnREZWx0YS5GX0NISUxEUkVOOw0KLQkJDQotCQlpZiAoKGV2ZW50LmdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIHJlcXVpcmVkRmxhZ3MpID09IDApIHsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1ID0gKElDb21waWxhdGlvblVuaXQpZXZlbnQuZ2V0RGVsdGEoKS5nZXRFbGVtZW50KCk7DQotCQlpZiAoIXJlc291cmNlKCkuYXBwcm92ZVByb2plY3QoY3UuZ2V0SmF2YVByb2plY3QoKSkpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlpZiAoaXNKYXZhUmVzb3VyY2UoY3UpKSB7DQotCQkJaGFuZGxlQ2hhbmdlZENvbnRlbnRDb21waWxhdGlvblVuaXQoY3UpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNKYXZhUmVzb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gY3U7DQotCQl3aGlsZSAoKGphdmFFbGVtZW50ID0gamF2YUVsZW1lbnQuZ2V0UGFyZW50KCkpICE9IG51bGwpIA0KLQkJew0KLQkJCWlmICghamF2YUVsZW1lbnQuZXhpc3RzKCkpIHsNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCXZvaWQgaGFuZGxlQ2hhbmdlZFByb2plY3QoSUphdmFFbGVtZW50RGVsdGEgcHJvamVjdERlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IChwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KTsNCi0JDQotCQlpZiAoKCgocHJvamVjdERlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMT1NFRCkgIT0gMCkgfHwgcHJvamVjdERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEKQ0KLQkJCSYmIG51bGwgIT0gdXRpbCgpLmZpbmRQcm9qZWN0QnlOYW1lKGdldERvbUJlaW5nTG9hZGVkKCksIHByb2plY3REZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSkpDQotCQl7DQotCQkJLy9pZiB0aGUgcHJvamVjdCBoYXMgYmVlbiBjbG9zZWQgdGhlbiBpdCdzIGZhY2V0J3MgY291bGQgbm90IGJlIHJlYWQuIFRodXMgdGhlIGFwcHJvdmUgbWV0aG9kDQotCQkJLy93aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UuIFRoYXQncyB3aHkgd2UgY2hlY2sgaWYgdGhlIHByb2plY3QgaGFzIGFscmVhZHkgYmVlbiBpbiB0aGUgDQotCQkJaGFuZGxlQ2xvc2VkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJfQ0KLQkJaWYgKCFyZXNvdXJjZSgpLmFwcHJvdmVQcm9qZWN0KChJSmF2YVByb2plY3QpcHJvamVjdERlbHRhLmdldEVsZW1lbnQoKSkpDQotCQl7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJaWYgKCgocHJvamVjdERlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX09QRU5FRCkgIT0gMCkgfHwgcHJvamVjdERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCkNCi0JCXsNCi0JCQloYW5kbGVPcGVuZWRQcm9qZWN0KHByb2plY3REZWx0YSk7DQotCQl9DQotCQ0KLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogcHJvamVjdERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCXsNCi0JCQlpZiAoIShjaGlsZERlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSkNCi0JCQl7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQlpZiAoKGNoaWxkRGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKSAhPSAwKQ0KLQkJCXsNCi0JCQkJaGFuZGxlQ2xvc2VkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJCQloYW5kbGVPcGVuZWRQcm9qZWN0KHByb2plY3REZWx0YSk7DQotCQkJfQ0KLQkJCWlmICgoY2hpbGREZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSAhPSAwKQ0KLQkJCXsNCi0JCQkJaGFuZGxlQ2xvc2VkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJCQloYW5kbGVPcGVuZWRQcm9qZWN0KHByb2plY3REZWx0YSk7DQotCQkJfQ0KLQkJCWlmICgoY2hpbGREZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DSElMRFJFTikgIT0gMCkNCi0JCQl7DQotCQkJCXJlY3Vyc2V2aWx5SGFuZGxlUmVtb3ZlZFBhY2thZ2VzKGNoaWxkRGVsdGEpOw0KLQkJCQlyZWN1cnNldmlseUhhbmRsZUFkZGVkUGFja2FnZXMoY2hpbGREZWx0YSk7DQotCQkJCXJlY3Vyc2V2aWx5SGFuZGxlQ29tcGlsYXRpb25Vbml0cyhjaGlsZERlbHRhKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHJlY3Vyc2V2aWx5SGFuZGxlQWRkZWRQYWNrYWdlcyhJSmF2YUVsZW1lbnREZWx0YSByb290RGVsdGEpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqID0gZmluZFByb2plY3RCeURlbHRhKHJvb3REZWx0YSk7DQotCQlpZiAod3NQcmogPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogcm9vdERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCXsNCi0JCQlpZiAoY2hpbGREZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50ICYmIGNoaWxkRGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKQ0KLQkJCXsNCi0JCQkJZm9yIChJQ29tcGlsYXRpb25Vbml0IGN1IDogKChJUGFja2FnZUZyYWdtZW50KWNoaWxkRGVsdGEuZ2V0RWxlbWVudCgpKS5nZXRDb21waWxhdGlvblVuaXRzKCkpDQotCQkJCXsNCi0JCQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcmosIGN1KTsNCi0JCQkJfQ0KLQkJCQlyZWN1cnNldmlseUhhbmRsZUFkZGVkUGFja2FnZXMoY2hpbGREZWx0YSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgZmluZFByb2plY3RCeURlbHRhKElKYXZhRWxlbWVudERlbHRhIHJvb3REZWx0YSkgew0KLQkJcmV0dXJuIHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCByb290RGVsdGEuZ2V0RWxlbWVudCgpLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZWN1cnNldmlseUhhbmRsZVJlbW92ZWRQYWNrYWdlcyhJSmF2YUVsZW1lbnREZWx0YSByb290RGVsdGEpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJDQotCQlmb3IgKElKYXZhRWxlbWVudERlbHRhIGNoaWxkRGVsdGEgOiByb290RGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKQ0KLQkJew0KLQkJCWlmIChjaGlsZERlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpDQotCQkJew0KLQkJCQlpZiAoY2hpbGREZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCkNCi0JCQkJew0KLQkJCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqID0gZmluZFByb2plY3RCeURlbHRhKHJvb3REZWx0YSk7DQotCQkJCQlpZiAod3NQcmogIT0gbnVsbCkgew0KLQkJCQkJCXJlbW92ZU1vZGVsRWxlbWVudHMod3NQcmosIGNoaWxkRGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCksIHRydWUpOw0KLQkJCQkJfQ0KLQkJCQl9IGVsc2UNCi0JCQkJew0KLQkJCQkJcmVjdXJzZXZpbHlIYW5kbGVSZW1vdmVkUGFja2FnZXMoY2hpbGREZWx0YSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU9wZW5lZFByb2plY3QoSUphdmFFbGVtZW50RGVsdGEgcHJvamVjdERlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IHByb2plY3REZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YVByb2plY3Q7DQotCQlmaW5hbCBJSmF2YVByb2plY3QgY2hhbmdlZFByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpOw0KLQkJbmV3UHJvamVjdENVRmluZGVyKGNoYW5nZWRQcm9qZWN0KS5maW5kKG51bGwsIG5ldyBMb2FkZXJDb21waWxhdGlvblVuaXRIYW5kbGVyKCkpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVDbG9zZWRQcm9qZWN0KElKYXZhRWxlbWVudERlbHRhIHByb2plY3REZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IHByb2plY3REZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YVByb2plY3Q7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmogPSB1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgcHJvamVjdERlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWlmICh3c1Byaj09bnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJZm9yIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHdzUHJqLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCXsNCi0JCQlzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jbGVhcigpOw0KLQkJfQ0KLQkJZm9yIChJV2ViU2VydmljZSB3cyA6IHdzUHJqLmdldFdlYlNlcnZpY2VzKCkpDQotCQl7DQotCQkJc2VydmljZURhdGEoKS51bm1hcCh3cyk7DQotCQl9DQotCQlnZXREb21CZWluZ0xvYWRlZCgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLnJlbW92ZSh3c1Byaik7DQotCX0NCi0NCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0RmluZGVyIG5ld1Byb2plY3RDVUZpbmRlcihmaW5hbCBJSmF2YVByb2plY3QgcHJqKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFdvcmtzcGFjZUNVRmluZGVyKHJlc291cmNlKCkuamF2YU1vZGVsKCksIG5ldyBJUHJvamVjdFNlbGVjdG9yW10geyBuZXcgSVByb2plY3RTZWxlY3RvcigpDQotCQl7DQotCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZShJSmF2YVByb2plY3QgdG9BcHByb3ZlKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHByai5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0b0FwcHJvdmUuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJfQ0KLQkJfSB9KTsNCi0JfQ0KLQ0KLQkvLyBoYW5kbGVzIGNvbXBpbGF0aW9uIHVuaXRzIC0gc2tpcHMgd29ya2luZyBjb3BpZXMNCi0JcHJpdmF0ZSB2b2lkIHJlY3Vyc2V2aWx5SGFuZGxlQ29tcGlsYXRpb25Vbml0cyhJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkNCi0Jew0KLQkJaWYgKGRlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpDQotCQl7DQotCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBkZWx0YS5nZXRFbGVtZW50KCk7DQotCQkJaWYgKHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBjdS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpPT1udWxsKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQl0cnkNCi0JCQl7DQotCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX0ZST00pID09IDApDQotCQkJCXsNCi0JCQkJCWhhbmRsZUFkZGVkQ29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCQkJfQ0KLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX1RPKSA9PSAwKQ0KLQkJCQl7DQotCQkJCQloYW5kbGVSZW1vdmVkQ29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCQkJfQ0KLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX1RPKSAhPSAwKQ0KLQkJCQl7DQotCQkJCQloYW5kbGVNb3ZlZFRvQ29tcGlsYXRpb25Vbml0KGN1LCAoSUNvbXBpbGF0aW9uVW5pdCkgZGVsdGEuZ2V0TW92ZWRUb0VsZW1lbnQoKSk7DQotCQkJCX0NCi0JCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEICYmIA0KLQkJCQkJKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1JFU09VUkNFKSAhPSAwKSB8fA0KLQkJCQkJKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1dPUktJTkdfQ09QWSkgIT0gMCkpDQotCQkJCXsNCi0JCQkJCWhhbmRsZUNoYW5nZWRDb250ZW50Q29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCQkJfQ0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHBhcnNlIHRoZSBjb250ZW50IG9mIGNvbXBpbGF0aW9uIHVuaXQiICsgZGVsdGEuZ2V0RWxlbWVudCgpLCBqbWUpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfSBlbHNlDQotCQl7DQotCQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKQ0KLQkJCXsNCi0JCQkJcmVjdXJzZXZpbHlIYW5kbGVDb21waWxhdGlvblVuaXRzKGNoaWxkRGVsdGEpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2hhbmdlZENvbnRlbnRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJVHlwZSB0eXBlID0gY3UuZmluZFByaW1hcnlUeXBlKCk7CQ0KLQkJZmluYWwgSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gPSB0eXBlPT1udWxsID8gbnVsbCA6IHJlc291cmNlKCkubmV3QW5ub3RhdGlvbkluc3BlY3Rvcih0eXBlKS5pbnNwZWN0VHlwZShXU19BTk5PVEFUSU9OKTsNCi0JCWlmICh0eXBlID09IG51bGwgfHwgYW5ub3RhdGlvbiA9PSBudWxsKQ0KLQkJew0KLQkJCXVwZGF0ZVN1YmNsYXNzaW5nV1NFbGVtZW50cyhjdSk7DQotCQkJaGFuZGxlUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChjdSk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gdXRpbCgpLmZpbmRQcm9qZWN0QnlOYW1lKGdldERvbUJlaW5nTG9hZGVkKCksIGN1LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJYXNzZXJ0IHdzUHJvamVjdCAhPSBudWxsOw0KLQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcm9qZWN0LCBjdSk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN1YmNsYXNzaW5nV1NFbGVtZW50cyhJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZvciAoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqIDogZ2V0RG9tQmVpbmdMb2FkZWQoKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKSkNCi0JCXsNCi0JCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVByaiA9IGphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0KHdzUHJqLmdldE5hbWUoKSk7DQotCQkJZm9yIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHdzUHJqLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCQl7DQotCQkJCWlmKHNlcnZpY2VEYXRhKCkuZ2V0SGllcmFyY2h5KHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKT09bnVsbCkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJaWYgKHNlcnZpY2VEYXRhKCkuZ2V0SGllcmFyY2h5KHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKS5jb250YWlucyhjdSkpDQotCQkJCXsNCi0JCQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcmosIGphdmFQcmouZmluZFR5cGUoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlmb3IgKElXZWJTZXJ2aWNlIHdzIDogd3NQcmouZ2V0V2ViU2VydmljZXMoKSkNCi0JCQl7DQotCQkJCWlmKHNlcnZpY2VEYXRhKCkuZ2V0SGllcmFyY2h5KHdzLmdldEltcGxlbWVudGF0aW9uKCkpPT1udWxsKSB7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCQlpZiAoc2VydmljZURhdGEoKS5nZXRIaWVyYXJjaHkod3MuZ2V0SW1wbGVtZW50YXRpb24oKSkuY29udGFpbnMoY3UpKQ0KLQkJCQl7DQotCQkJCQlwcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJqLCBqYXZhUHJqLmZpbmRUeXBlKHdzLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBhZGRlZENVKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBhZGRlZENVLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQl0aGlzLnByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcmosIGFkZGVkQ1UpOw0KLQl9DQotDQotCXZvaWQgaGFuZGxlTW92ZWRUb0NvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGZyb21DVSwgSUNvbXBpbGF0aW9uVW5pdCB0b0NVKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElKYXZhV2ViU2VydmljZUVsZW1lbnQgd3NFbGVtID0gZ3Vlc3NDb250YWluZWRXU0VsZW1lbnQoZnJvbUNVKTsNCi0JCWlmICh3c0VsZW0gPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlmaW5hbCBib29sZWFuIGZxTmFtZUNoYW5nZWQgPSAhdG9DVS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhmcm9tQ1UuZ2V0RWxlbWVudE5hbWUoKSkNCi0JCQkJCQkJCQkJfHwgIXRvQ1UuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZnJvbUNVLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJaWYgKGZxTmFtZUNoYW5nZWQpDQotCQl7DQotCQkJaGFuZGxlUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChmcm9tQ1UpOw0KLQkJCWhhbmRsZUFkZGVkQ29tcGlsYXRpb25Vbml0KHRvQ1UpOw0KLQkJfSBlbHNlDQotCQkvLyB0aGVuIGFzc3VtZSB0aGF0IHRoZSBwcm9qZWN0IG9ubHkgaGFzIGNoYW5nZWQuDQotCQl7DQotCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHRvUHJqID0gdXRpbCgpLmZpbmRQcm9qZWN0QnlOYW1lKGdldERvbUJlaW5nTG9hZGVkKCksIHRvQ1UuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQlpZiAod3NFbGVtIGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQkJew0KLQkJCQl0b1Byai5nZXRXZWJTZXJ2aWNlcygpLmFkZCgoSVdlYlNlcnZpY2UpIHdzRWxlbSk7DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQl0b1Byai5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuYWRkKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB3c0VsZW0pOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IHJlbUNVKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCByZW1DVS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJcmVtb3ZlTW9kZWxFbGVtZW50cyh3c1ByaiwgZ3Vlc3NQcmltYXJ5VHlwZU5hbWUocmVtQ1UpLCBmYWxzZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1vZGVsRWxlbWVudHMoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqLCBTdHJpbmcgaW1wbEJhc2VOYW1lLCBib29sZWFuIGlzRm9yUGFja2FnZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAod3NQcmogPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCXJlbW92ZVdzTW9kZWxFbGVtZW50cyh3c1ByaiwgaW1wbEJhc2VOYW1lLCBpc0ZvclBhY2thZ2UpOw0KLQkJcmVtb3ZlU2VpTW9kZWxFbGVtZW50cyh3c1ByaiwgaW1wbEJhc2VOYW1lLCBpc0ZvclBhY2thZ2UsIGZhbHNlKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IGd1ZXNzQ29udGFpbmVkV1NFbGVtZW50KElDb21waWxhdGlvblVuaXQgY3UpDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBjdS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJcmV0dXJuIHV0aWwoKS5maW5kSmF2YVdlYlNlcnZpY2VFbGVtQnlJbXBsTmFtZSh3c1ByaiwgZ3Vlc3NQcmltYXJ5VHlwZU5hbWUoY3UpKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIGd1ZXNzUHJpbWFyeVR5cGVOYW1lKElDb21waWxhdGlvblVuaXQgY3UpDQotCXsNCi0JCWZpbmFsIFN0cmluZyBwYXJlbnROYW1lID0gY3UuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCWZpbmFsIFN0cmluZ0J1aWxkZXIgYXNzdW1lZFByaW1hcnlUeXBlTmFtZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQotCQlpZiAocGFyZW50TmFtZS5sZW5ndGgoKSA+IDApIHsNCi0JCQlhc3N1bWVkUHJpbWFyeVR5cGVOYW1lIC5hcHBlbmQocGFyZW50TmFtZSkuYXBwZW5kKCcuJyk7DQotCQl9DQotCQlyZXR1cm4gYXNzdW1lZFByaW1hcnlUeXBlTmFtZS5hcHBlbmQoY3UuZ2V0RWxlbWVudE5hbWUoKSkuDQotCQkJZGVsZXRlKGFzc3VtZWRQcmltYXJ5VHlwZU5hbWUubGFzdEluZGV4T2YoIi5qYXZhIiksIGFzc3VtZWRQcmltYXJ5VHlwZU5hbWUubGVuZ3RoKCkpLnRvU3RyaW5nKCk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9QYXJhbWV0ZXJTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9QYXJhbWV0ZXJTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjU1OTAzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvUGFyYW1ldGVyU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5IRUFERVJfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLk1PREVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLlBBUlRfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgc3luY2hyb25pemVzIHRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgSVdlYk1ldGhvZH0gb2JqZWN0Ow0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclN5bmNocm9uaXplciBleHRlbmRzIEVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOX1BBUkFNX05BTUUJPSAicmV0dXJuIjsvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT0xERVJfQ0xBU1NfTkFNRSA9ICJIb2xkZXIiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT0xERVJfQ0xBU1NfRlFOQU1FID0gImphdmF4LnhtbC53cy5Ib2xkZXIiOy8vJE5PTi1OTFMtMSQNCi0JDQotCXB1YmxpYyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVQYXJhbWV0ZXJzKElXZWJNZXRob2Qgd20sIElNZXRob2QgbWV0aG9kLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgQ29sbGVjdGlvbjxJV2ViUGFyYW0+IG1lcmdlZFBhcmFtcyA9IG5ldyBMaW5rZWRMaXN0PElXZWJQYXJhbT4oKTsNCi0JCWlmICghU2lnbmF0dXJlLlNJR19WT0lELmVxdWFscyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkNCi0JCXsNCi0JCQlmaW5hbCBJV2ViUGFyYW0gcmV0UGFyYW0gPSBvYnRhaW5JbnN0YW5jZSh3bSwgUkVUVVJOX1BBUkFNX05BTUUpOw0KLQkJCW1lcmdlUGFyYW0ocmV0UGFyYW0sIDAsIHdtLCBtZXRob2QsIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIGluc3BlY3Rvcik7DQotCQkJbWVyZ2VkUGFyYW1zLmFkZChyZXRQYXJhbSk7DQotCQl9DQotCQlmaW5hbCBTdHJpbmdbXSBuYW1lcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpOw0KLQkJZmluYWwgU3RyaW5nW10gdHlwZVNpZ25hdHVyZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsgDQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKQ0KLQkJew0KLQkJCWZpbmFsIElXZWJQYXJhbSBwYXJhbSA9IG9idGFpbkluc3RhbmNlKHdtLCBuYW1lc1tpXSk7DQotCQkJbWVyZ2VQYXJhbShwYXJhbSwgaSwgd20sIG1ldGhvZCwgdHlwZVNpZ25hdHVyZXNbaV0sIGluc3BlY3Rvcik7DQotCQkJbWVyZ2VkUGFyYW1zLmFkZChwYXJhbSk7DQotCQl9DQotCQl3bS5nZXRQYXJhbWV0ZXJzKCkucmV0YWluQWxsKG1lcmdlZFBhcmFtcyk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1lcmdlUGFyYW0oSVdlYlBhcmFtIHdlYlBhcmFtLCBpbnQgcG9zLCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgSU1ldGhvZCBtZXRob2QsIFN0cmluZyB0eXBlU2lnbiwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJYXNzZXJ0IHR5cGVQYXJhbSE9IG51bGw7DQotCQkNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiB3cEFubm90YXRpb24gPSBpc1dlYlJlc3VsdCh3ZWJQYXJhbSkgPyBudWxsIDogaW5zcGVjdG9yLmluc3BlY3RQYXJhbSh0eXBlUGFyYW0sIFdQX0FOTk9UQVRJT04pOw0KLQkJCQkNCi0JCWlmICghIHR5cGVTaWduLmVxdWFscyh3ZWJQYXJhbS5nZXRUeXBlTmFtZSgpKSkgew0KLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUod2ViUGFyYW0sIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FLCB0eXBlU2lnbik7DQotCQl9DQotCQkNCi0JCWZpbmFsIFdlYlBhcmFtS2luZCBraW5kID0gaXNXZWJSZXN1bHQod2ViUGFyYW0pID8gV2ViUGFyYW1LaW5kLk9VVCA6IGNhbGNLaW5kKHdwQW5ub3RhdGlvbiwgbWV0aG9kLCB0eXBlU2lnbik7DQotCQlpZiAoIWtpbmQuZXF1YWxzKHdlYlBhcmFtLmdldEtpbmQoKSkpIHsNCi0JCQl3ZWJQYXJhbS5zZXRLaW5kKGtpbmQpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBib29sZWFuIGlzSGVhZGVyID0gY2FsY0hlYWRlcih3cEFubm90YXRpb24pOw0KLQkJaWYgKHdlYlBhcmFtLmlzSGVhZGVyKCkgXiBpc0hlYWRlcikgew0KLQkJCXdlYlBhcmFtLnNldEhlYWRlcihpc0hlYWRlcik7DQotCQl9DQotCQkNCi0JCWZpbmFsIFN0cmluZyBuYW1lID0gaXNXZWJSZXN1bHQod2ViUGFyYW0pID8gZGVmQ2FsYygpLmNhbGNXZWJSZXN1bHREZWZhdWx0TmFtZSh3ZWJNZXRob2QpIDogY2FsY05hbWUod3BBbm5vdGF0aW9uLCB3ZWJNZXRob2QsIHBvcyk7DQotCQlpZiAoIW5hbWUuZXF1YWxzKHdlYlBhcmFtLmdldE5hbWUoKSkpIHsNCi0JCQl3ZWJQYXJhbS5zZXROYW1lKG5hbWUpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTdHJpbmcgcGFydE5hbWUgPSBjYWxjUGFydE5hbWUod3BBbm5vdGF0aW9uLCBuYW1lKTsNCi0JCWlmICghcGFydE5hbWUuZXF1YWxzKHdlYlBhcmFtLmdldFBhcnROYW1lKCkpKSB7DQotCQkJd2ViUGFyYW0uc2V0UGFydE5hbWUocGFydE5hbWUpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gY2FsY1RhcmdldE5hbWVzcGFjZSh3cEFubm90YXRpb24sIHdlYk1ldGhvZCwgd2ViUGFyYW0pOw0KLQkJaWYgKCF0YXJnZXROYW1lc3BhY2UuZXF1YWxzKHdlYlBhcmFtLmdldFRhcmdldE5hbWVzcGFjZSgpKSkgew0KLQkJCXdlYlBhcmFtLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOw0KLQkJfQkJDQotCQkNCi0JCXJlc291cmNlKCkuZ2V0U2VyaWFsaXplckZhY3RvcnkoKS5hZGFwdCh3ZWJQYXJhbSwgSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzKTsJCQ0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHdlYlBhcmFtLCBXUF9BTk5PVEFUSU9OLCB3cEFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNXZWJSZXN1bHQoZmluYWwgSVdlYlBhcmFtIHBhcmFtKQ0KLQl7DQotCQlyZXR1cm4gcGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoUkVUVVJOX1BBUkFNX05BTUUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUoZmluYWwgSU1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0Jew0KLQkJaWYgKFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZCh0eXBlU2lnbmF0dXJlKSA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSkNCi0JCXsNCi0JCQlyZXR1cm4gU2lnbmF0dXJlLnRvU3RyaW5nKHR5cGVTaWduYXR1cmUpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTdHJpbmdbXVtdIHJlc29sdmVkVHlwZXMgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpLnJlc29sdmVUeXBlKFNpZ25hdHVyZS50b1N0cmluZyh0eXBlU2lnbmF0dXJlKSk7DQotCQlpZiAocmVzb2x2ZWRUeXBlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkDQotCQl9DQotCQlmaW5hbCBTdHJpbmcgcGFjayA9IHJlc29sdmVkVHlwZXNbMF1bMF07DQotCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gcmVzb2x2ZWRUeXBlc1swXVsxXTsNCi0JCWlmIChwYWNrICE9IG51bGwgJiYgcGFjay5sZW5ndGgoKSAhPSAwKQ0KLQkJew0KLQkJCXJldHVybiBwYWNrICsgIi4iICsgY2xhc3NOYW1lOy8vJE5PTi1OTFMtMSQNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXJldHVybiBjbGFzc05hbWU7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBXZWJQYXJhbUtpbmQgY2FsY0tpbmQoZmluYWwgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHBhcm1Bbm5vdGF0aW9uLCBmaW5hbCBJTWV0aG9kIG1ldGhvZCwgZmluYWwgU3RyaW5nIHR5cGVTaWduYXR1cmUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAocGFybUFubm90YXRpb24gIT0gbnVsbCAmJiBwYXJtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE1PREVfQVRUUklCVVRFKSAhPSBudWxsKQ0KLQkJew0KLQkJCWZpbmFsIFN0cmluZyBtb2RlID0gcGFybUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShNT0RFX0FUVFJJQlVURSk7DQotCQkJaWYgKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldFQl9QQVJBTV9NT0RFX0lOT1VULmVuZHNXaXRoKG1vZGUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIFdlYlBhcmFtS2luZC5JTk9VVDsNCi0JCQl9DQotCQkJaWYgKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldFQl9QQVJBTV9NT0RFX0lOLmVuZHNXaXRoKG1vZGUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIFdlYlBhcmFtS2luZC5JTjsNCi0JCQl9DQotCQkJaWYgKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldFQl9QQVJBTV9NT0RFX09VVC5lbmRzV2l0aChtb2RlKSkNCi0JCQl7DQotCQkJCXJldHVybiBXZWJQYXJhbUtpbmQuT1VUOw0KLQkJCX0NCi0JCX0gDQotCQkNCi0JCWlmIChpc1Bvc3NpYmx5SG9sZGVyQ2xhc3ModHlwZVNpZ25hdHVyZSkpIHsNCi0JCQlmaW5hbCBTdHJpbmcgdHlwZUZRTmFtZSA9IHJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUobWV0aG9kLCB0eXBlU2lnbmF0dXJlKTsNCi0JCQlpZiAodHlwZUZRTmFtZS5zdGFydHNXaXRoKEhPTERFUl9DTEFTU19GUU5BTUUpKSB7DQotCQkJCXJldHVybiBXZWJQYXJhbUtpbmQuSU5PVVQ7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gV2ViUGFyYW1LaW5kLklOOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQWRkZWQgZHVlIHRvIHBlcmZvcm1hbmNlIGlzc3VlcyBDU04gMDEyMDA2MTUzMiAwMDAyMjU2OTI1IDIwMDkuDQotCSAqIFRoZSBpZGVhIGlzIHRoYXQgYmVmb3JlIGNhbGxpbmcge0BsaW5rICNyZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKElNZXRob2QsIFN0cmluZyl9DQotCSAqIHdlIGNoZWNrIGlmIHRoZSBjbGFzcyBpcyBwb3RlbnRpYWxseSBIb2xkZXIuDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaXNQb3NzaWJseUhvbGRlckNsYXNzKGZpbmFsIFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7CQ0KLQkJZmluYWwgU3RyaW5nIGVyYXN1dGVUeXBlTmFtZSA9IFNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKFNpZ25hdHVyZS5nZXRUeXBlRXJhc3VyZSh0eXBlU2lnbmF0dXJlKSk7DQotCQlpZiAoSE9MREVSX0NMQVNTX05BTUUuZXF1YWxzKGVyYXN1dGVUeXBlTmFtZSkpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBjYWxjTmFtZShJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gcGFybUFubm90YXRpb24sIElXZWJNZXRob2Qgd2ViTWV0aG9kLCBpbnQgcGFyYW1Qb3NpdGlvbikNCi0Jew0KLQkJaWYgKHBhcm1Bbm5vdGF0aW9uICE9IG51bGwgJiYgcGFybUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShOQU1FX0FUVFJJQlVURSkgIT0gbnVsbCkgew0KLQkJCXJldHVybiBwYXJtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGRlZkNhbGMoKS5jYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJNZXRob2QsIHBhcmFtUG9zaXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBjYWxjUGFydE5hbWUoZmluYWwgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHdwQW5ub3RhdGlvbiwgZmluYWwgU3RyaW5nIG5hbWUpIA0KLQl7DQotCQlpZiAod3BBbm5vdGF0aW9uIT1udWxsICYmIHdwQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFBBUlRfTkFNRV9BVFRSSUJVVEUpIT1udWxsKSB7DQotCQkJcmV0dXJuIHdwQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFBBUlRfTkFNRV9BVFRSSUJVVEUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbmFtZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGNhbGNIZWFkZXIoZmluYWwgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHdwQW5ub3RhdGlvbikNCi0Jew0KLQkJaWYgKHdwQW5ub3RhdGlvbiE9bnVsbCAmJiB3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShIRUFERVJfQVRUUklCVVRFKSE9bnVsbCkgew0KLQkJCXJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbih3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShIRUFERVJfQVRUUklCVVRFKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgY2FsY1RhcmdldE5hbWVzcGFjZShmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gd3BBbm5vdGF0aW9uLCBmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlpZiAod3BBbm5vdGF0aW9uIT1udWxsICYmIHdwQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKSE9bnVsbCkgew0KLQkJCXJldHVybiB3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBkZWZDYWxjKCkuY2FsY1dlYlBhcmFtRGVmYXVsdFRhcmdldE5TKHdlYk1ldGhvZCwgd2ViUGFyYW0pOw0KLQl9DQotCQ0KLQlwcml2YXRlIElXZWJQYXJhbSBvYnRhaW5JbnN0YW5jZShJV2ViTWV0aG9kIHdtLCBTdHJpbmcgaW1wbCkNCi0Jew0KLQkJZmluYWwgSVdlYlBhcmFtIGV4aXN0aW5nID0gZmluZFdlYlBhcmFtQnlJbXBsTmFtZSh3bSwgaW1wbCk7DQotCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZXhpc3Rpbmc7DQotCQl9DQotCQlmaW5hbCBJV2ViUGFyYW0gbmV3UGFyYW0gPSBkb21GYWN0b3J5KCkuY3JlYXRlSVdlYlBhcmFtKCk7DQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKG5ld1BhcmFtLCBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0lNUExFTUVOVEFUSU9OLCBpbXBsKTsNCi0JCXdtLmdldFBhcmFtZXRlcnMoKS5hZGQobmV3UGFyYW0pOw0KLQkJcmV0dXJuIG5ld1BhcmFtOw0KLQl9DQotCQ0KLQlwcml2YXRlIElXZWJQYXJhbSBmaW5kV2ViUGFyYW1CeUltcGxOYW1lKGZpbmFsIElXZWJNZXRob2Qgd20sIGZpbmFsIFN0cmluZyBpbXBsKQ0KLQl7DQotCQlmb3IgKElXZWJQYXJhbSBwYXJhbSA6IHdtLmdldFBhcmFtZXRlcnMoKSkNCi0JCXsNCi0JCQlpZiAoaW1wbC5lcXVhbHMocGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gcGFyYW07DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1lcmdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMGNlODIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlNZXJnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLlNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi0NCi0vKioNCi0gKiBTeW5jaHJvbml6ZXIgdGhhdCBtZXJnZXMgY29udGVudCBvZiB7QGxpbmsgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZX0gd2l0aCB0aGUgY3VycmVudCBjb250ZW50IG9mIA0KLSAqIHRoZSBjbGFzcyBpbXBsZW1lbnRpbmcgaXQuICANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaU1lcmdlciBleHRlbmRzIEVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsDQotew0KLQlwcml2YXRlIEFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyIG1ldGhvZFN5bmNocm9uaXplcjsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiBAcGFyYW0gcGFyZW50DQotCSAqIEBwYXJhbSBtZXRob2RTeW5jIHRoZSBzeW5jaHJvbml6ZXIgdGhhdCB0YWtlcyBjYXJlIGZvciB0aGUgU0VJIG1ldGhvZHMNCi0JICovDQotCXB1YmxpYyBTZWlNZXJnZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQsIEFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyIG1ldGhvZFN5bmMpIA0KLQl7DQotCQlzdXBlcihwYXJlbnQpOw0KLQkJbnVsbENoZWNrUGFyYW0obWV0aG9kU3luYyk7DQotCQl0aGlzLm1ldGhvZFN5bmNocm9uaXplciA9IG1ldGhvZFN5bmM7DQotCX0NCi0JCQ0KLQlwcm90ZWN0ZWQgdm9pZCBtZXJnZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgSUFubm90YXRpb248SVR5cGU+IHdzQW5ub3RhdGlvbiwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZyBzZWlOYW1lID0gd3NBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoTkFNRV9BVFRSSUJVVEUpID09IG51bGwgPyANCi0JCQkJSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydHR5cGVOYW1lKHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSA6IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKTsNCi0JCQkJDQotCQlpZiAoIXNlaU5hbWUuZXF1YWxzKHNlaS5nZXROYW1lKCkpKSB7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FLCBzZWlOYW1lKTsNCi0JCX0NCi0JCQkJDQotCQkvLyBhZGQgdGFyZ2V0TmFtZXNwYWNlDQotCQlmaW5hbCBTdHJpbmcgdGFyZ2V0TnMgPSBleHRyYWN0VGFyZ2V0TmFtZXNwYWNlKHdzQW5ub3RhdGlvbik7DQotCQlpZiAoIXRhcmdldE5zLmVxdWFscyhzZWkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFLCB0YXJnZXROcyk7DQotCQl9DQotCQkNCi0JCW1lcmdlU29hcEJpbmRpbmcoc2VpLCBpbnNwZWN0b3IpOw0KLQkJbWV0aG9kU3luY2hyb25pemVyLnN5bmNocm9uaXplTWV0aG9kcyhzZWksIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLCBpbnNwZWN0b3IpOw0KLQkJDQotCQlhZGFwdFRvTG9jYXRpb25JbnRlcmZhY2Uoc2VpLCBXU19BTk5PVEFUSU9OLCB3c0Fubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0VGFyZ2V0TmFtZXNwYWNlKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24pDQotCXsNCi0JCS8vIGFkZCB0YXJnZXROYW1lc3BhY2UNCi0JCWZpbmFsIFN0cmluZyB0YXJnZXROcyA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKTsNCi0JCWlmICh0YXJnZXROcz09bnVsbCkgew0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCX0JDQotCQkNCi0JCXJldHVybiB0YXJnZXROczsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIG1lcmdlU29hcEJpbmRpbmcoZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gc2JBbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RUeXBlKFNCX0FOTk9UQVRJT04pOw0KLQkJDQotCQlmaW5hbCBTT0FQQmluZGluZ1N0eWxlIHN0eWxlID0gZGVmQ2FsYygpLmRlZmluZVNCU3R5bGUoc2JBbm5vdGF0aW9uKTsNCi0JCWlmIChzZWkuZ2V0U29hcEJpbmRpbmdTdHlsZSgpICE9IHN0eWxlKSB7DQotCQkJc2VpLnNldFNvYXBCaW5kaW5nU3R5bGUoc3R5bGUpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTT0FQQmluZGluZ1VzZSB1c2UgPSBkZWZDYWxjKCkuZGVmaW5lU0JVc2Uoc2JBbm5vdGF0aW9uKTsNCi0JCWlmIChzZWkuZ2V0U29hcEJpbmRpbmdVc2UoKSAhPSB1c2UpIHsNCi0JCQlzZWkuc2V0U29hcEJpbmRpbmdVc2UodXNlKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBwYXJhbVN0eWxlID0gZGVmQ2FsYygpLmRlZmluZVNCUGFyYW1ldGVyU3R5bGUoc2JBbm5vdGF0aW9uKTsNCi0JCWlmIChzZWkuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpICE9IHBhcmFtU3R5bGUpIHsNCi0JCQlzZWkuc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShwYXJhbVN0eWxlKTsNCi0JCX0NCi0JCQ0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHNlaSwgU0JfQU5OT1RBVElPTiwgc2JBbm5vdGF0aW9uKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpTWV0aG9kU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpTWV0aG9kU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzNTRmNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1ldGhvZFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotY2xhc3MgU2VpTWV0aG9kU3luY2hyb25pemVyIGV4dGVuZHMgQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXINCi17DQotDQotCXB1YmxpYyBTZWlNZXRob2RTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIHZpc2l0RXhwb3NhYmxlTWV0aG9kcyhJTWV0aG9kVmlzaXRvciB2aXNpdG9yLCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHksIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl2aXNpdFJlY3Vyc2l2ZWx5KHZpc2l0b3IsIGhpZXJhcmNoeS5nZXRUeXBlKCksIGhpZXJhcmNoeSwgaW5zcGVjdG9yKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgdmlzaXRSZWN1cnNpdmVseShJTWV0aG9kVmlzaXRvciB2aXNpdG9yLCBJVHlwZSB0eXBlLCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHksIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmb3IgKElNZXRob2QgbWV0aG9kIDogdHlwZS5nZXRNZXRob2RzKCkpDQotCQl7DQotCQkJdmlzaXRvci52aXNpdChtZXRob2QsIGluc3BlY3Rvcik7DQotCQl9DQotDQotCQlmb3IgKElUeXBlIHN1cGVySW50ZiA6IGhpZXJhcmNoeS5nZXRTdXBlckludGVyZmFjZXModHlwZSkpDQotCQl7CQkJDQotCQkJdmlzaXRSZWN1cnNpdmVseSh2aXNpdG9yLCBzdXBlckludGYsIGhpZXJhcmNoeSwgcmVzb3VyY2UoKS5uZXdBbm5vdGF0aW9uSW5zcGVjdG9yKHN1cGVySW50ZikpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThlZmE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi0NCi0vKioNCi0gKiBTeW5jaHJvbml6ZXIgZm9yIGV4cGxpY2l0IHtAbGluayBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlfSBpbnN0YW5jZS4gVXBkYXRlcyB0aGUgRE9NIGluc3RhbmNlIHRvIHRoZSBjdXJyZW50DQotICogU0VJIGltcGxlbWVudGF0aW9uIGNsYXNzIGJ5IHJlYWRpbmcgcmVsZXZhbnQgYW5ub3RhdGlvbnMgYW5kIA0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIFNlaVN5bmNocm9uaXplciBleHRlbmRzIEVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsDQotew0KLQlwcml2YXRlIGZpbmFsIFNlaU1lcmdlciBzZWlNZXJnZXI7IA0KLQ0KLQlTZWlTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCQlzZWlNZXJnZXIgPSBuZXcgU2VpTWVyZ2VyKHRoaXMsIG5ldyBTZWlNZXRob2RTeW5jaHJvbml6ZXIodGhpcykpOw0KLQl9DQotDQotCS8qIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgKi8NCi0Jdm9pZCBzeW5jaHJvbml6ZUludGVyZmFjZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBvYnRhaW5JbnN0YW5jZSh3c1Byb2plY3QsIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCXNlaU1lcmdlci5tZXJnZShzZWksIHdzQW5ub3RhdGlvbiwgaW5zcGVjdG9yKTsNCi0JCXJlc29sdmVXc1JlZnNUb1RoaXNTZWkoc2VpKTsNCi0JCXJlc291cmNlKCkuZ2V0U2VyaWFsaXplckZhY3RvcnkoKS5hZGFwdChzZWksIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7CQkNCi0JfQ0KLQ0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugb2J0YWluSW5zdGFuY2UoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgU3RyaW5nIGltcGxOYW1lKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IG51bGw7DQotCQlmb3IgKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZXhpc3RpbmcgOiB3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpKQ0KLQkJew0KLQkJCWlmIChleGlzdGluZy5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsTmFtZSkpIHsNCi0JCQkJc2VpID0gZXhpc3Rpbmc7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAoc2VpPT1udWxsKQ0KLQkJew0KLQkJCXNlaSA9IGRvbUZhY3RvcnkoKS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sIGltcGxOYW1lKTsNCi0JCQl3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmFkZChzZWkpOw0KLQkJfQ0KLQkJDQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHNlaSwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lULCBmYWxzZSk7DQotCQkNCi0JCXJldHVybiBzZWk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVXc1JlZnNUb1RoaXNTZWkoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpDQotCXsNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiBzZXJ2aWNlRGF0YSgpLmdldEltcGxlbWVudGluZ1dzKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKSkNCi0JCXsNCi0JCQlpZiAod3MuZ2V0U2VydmljZUVuZHBvaW50KCkgIT0gc2VpKQ0KLQkJCXsNCi0JCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3cywgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsIHNlaSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9XU01ldGhvZFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dTTWV0aG9kU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwOTM0ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dTTWV0aG9kU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotcHVibGljIGNsYXNzIFdTTWV0aG9kU3luY2hyb25pemVyIGV4dGVuZHMgQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXINCi17DQotDQotCXB1YmxpYyBXU01ldGhvZFN5bmNocm9uaXplcihJTW9kZWxFbGVtZW50U3luY2hyb25pemVyIHBhcmVudCkNCi0Jew0KLQkJc3VwZXIocGFyZW50KTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXRFeHBvc2FibGVNZXRob2RzKElNZXRob2RWaXNpdG9yIHZpc2l0b3IsIElUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXZpc2l0UmVjdXJzaXZlbHkodmlzaXRvciwgaGllcmFyY2h5LmdldFR5cGUoKSwgaGllcmFyY2h5LCBpbnNwZWN0b3IpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCB2aXNpdFJlY3Vyc2l2ZWx5KElNZXRob2RWaXNpdG9yIHZpc2l0b3IsIElUeXBlIHR5cGUsIElUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmICh0eXBlID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkNCi0JCWFzc2VydCB0eXBlLmlzQ2xhc3MoKTsNCi0JCWZpbmFsIGJvb2xlYW4gaXNXZWJTZXJ2aWNlID0gaW5zcGVjdG9yLmluc3BlY3RUeXBlKFdTX0FOTk9UQVRJT04pICE9IG51bGw7DQotCQlmb3IgKElNZXRob2QgbWV0aG9kIDogdHlwZS5nZXRNZXRob2RzKCkpDQotCQl7DQotCQkJaWYobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkNCi0JCQl7DQotCQkJCS8vIENvbnN0cnVjdG9ycyBjYW4gbmV2ZXIgdGFrZSBwYXJ0IGluIHRoZSBwb3J0dHlwZQ0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJZmluYWwgSUFubm90YXRpb248SU1ldGhvZD4gd21Bbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RNZXRob2QobWV0aG9kLCBXTV9BTk5PVEFUSU9OKTsNCi0JCQlmaW5hbCBib29sZWFuIGlzRXhjbHVkZWRXaXRoQW5ub3RhdGlvbiA9IHdtQW5ub3RhdGlvbiA9PSBudWxsID8gZmFsc2UgOiAidHJ1ZSIuZXF1YWxzKHdtQW5ub3RhdGlvbi8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCS5nZXRQcm9wZXJ0eVZhbHVlKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0VYQ0xVREVEX0FUVFJJQlVURSkpOw0KLQkJCWlmIChNb2RpZmllci5pc1B1YmxpYyhtZXRob2QuZ2V0RmxhZ3MoKSkgJiYgIWlzRXhjbHVkZWRXaXRoQW5ub3RhdGlvbiAmJiAoaXNXZWJTZXJ2aWNlIHx8IHdtQW5ub3RhdGlvbiAhPSBudWxsKSkNCi0JCQl7DQotCQkJCXZpc2l0b3IudmlzaXQobWV0aG9kLCBpbnNwZWN0b3IpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVR5cGUgc3VwZXJUeXBlID0gaGllcmFyY2h5LmdldFN1cGVyY2xhc3ModHlwZSk7DQotCQlpZiAoc3VwZXJUeXBlIT1udWxsKSB7DQotCQkJdmlzaXRSZWN1cnNpdmVseSh2aXNpdG9yLCBzdXBlclR5cGUsIGhpZXJhcmNoeSwgcmVzb3VyY2UoKS5uZXdBbm5vdGF0aW9uSW5zcGVjdG9yKHN1cGVyVHlwZSkpOw0KLQkJfQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Xc1N5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyNGZlODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dzU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5FTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuUE9SVF9OQU1FX0FUVFJJQlVURTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlNFUlZJQ0VfTkFNRV9BVFRSSUJVVEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTRExfTE9DQVRJT05fQVRUUklCVVRFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkpheFdzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsKLQotcHVibGljIGNsYXNzIFdzU3luY2hyb25pemVyIGV4dGVuZHMgRWxlbWVudFN5bmNocm9uaXplckltcGwKLXsKLQlwcml2YXRlIGZpbmFsIFNlaU1lcmdlciBzZWlNZXJnZXI7Ci0KLQlwdWJsaWMgV3NTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNlaU1lcmdlciA9IG5ldyBTZWlNZXJnZXIodGhpcywgbmV3IFdTTWV0aG9kU3luY2hyb25pemVyKHRoaXMpKTsKLQl9Ci0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIG9idGFpbkluc3RhbmNlKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIFN0cmluZyBpbXBsTmFtZSkKLQl7Ci0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKSkKLQkJewotCQkJaWYgKHdzLmdldEltcGxlbWVudGF0aW9uKCkhPSBudWxsICYmIHdzLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxOYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gd3M7Ci0JCQl9Ci0JCX0KLQkJZmluYWwgSVdlYlNlcnZpY2UgbmV3V3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOwotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKG5ld1dzLCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCBpbXBsTmFtZSk7Ci0JCXV0aWwoKS5hZGRUb0NvbGxlY3Rpb25GZWF0dXJlKHdzUHJvamVjdCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTLCBuZXdXcyk7Ci0JCQotCQlyZXR1cm4gbmV3V3M7Ci0JfQotCi0JcHVibGljIElXZWJTZXJ2aWNlIHN5bmNocm9uaXplV2ViU2VydmljZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gb2J0YWluSW5zdGFuY2Uod3NQcm9qZWN0LCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCW1lcmdlV2ViU2VydmljZSh3cywgd3NQcm9qZWN0LCB3c0Fubm90YXRpb24sIGluc3BlY3Rvcik7Ci0JCQotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQod3MsIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7Ci0JCWFkYXB0VG9Mb2NhdGlvbkludGVyZmFjZSh3cywgV1NfQU5OT1RBVElPTiwgd3NBbm5vdGF0aW9uKTsKLQkJCi0JCXJldHVybiB3czsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWVyZ2VXZWJTZXJ2aWNlKElXZWJTZXJ2aWNlIHRvTWVyZ2UsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJLy8gYWRkIHNlcnZpY2VOYW1lIG5hbWUKLQkJZmluYWwgU3RyaW5nIHdzTmFtZSA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUpID09IG51bGwgPwotCQkJCUpheFdzVXRpbHMuZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSA6IAotCQkJCXdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUpOwotCQkJCQotCQlpZiAoIXdzTmFtZS5lcXVhbHModG9NZXJnZS5nZXROYW1lKCkpKQotCQl7Ci0JCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHRvTWVyZ2UsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19OQU1FLCB3c05hbWUpOwotCQl9Ci0JCQotCQkvLyBhZGQgdGFyZ2V0TmFtZXNwYWNlCi0JCWZpbmFsIFN0cmluZyB0YXJnZXROcyA9IGV4dHJhY3RUYXJnZXROYW1lc3BhY2Uod3NBbm5vdGF0aW9uKTsKLQkJaWYgKCF0YXJnZXROcy5lcXVhbHModG9NZXJnZS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsKLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUodG9NZXJnZSwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UsIHRhcmdldE5zKTsKLQkJfQotCQkKLQkJLy8gYWRkIHBvcnROYW1lCi0JCWZpbmFsIFN0cmluZyBwb3J0TmFtZSA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFBPUlRfTkFNRV9BVFRSSUJVVEUpPT1udWxsID8KLQkJCQlKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZSh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgOgotCQkJCXdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFBPUlRfTkFNRV9BVFRSSUJVVEUpOwotCQkJCQotCQlpZiAoIXBvcnROYW1lLmVxdWFscyh0b01lcmdlLmdldFBvcnROYW1lKCkpKSB7Ci0JCQl0b01lcmdlLnNldFBvcnROYW1lKHBvcnROYW1lKTsKLQkJfQotCQkKLQkJLy8gYWRkIHdzZGxMb2NhdGlvbgotCQl0b01lcmdlLnNldFdzZGxMb2NhdGlvbih3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXU0RMX0xPQ0FUSU9OX0FUVFJJQlVURSkpOwotCQkKLQkJLy8gYWRkIGVuZHBvaW50SW50ZXJmYWNlCi0JCWZpbmFsIFN0cmluZyBuZXdTZWlJbXBsID0gd3NBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURSk7Ci0JCWlmIChuZXdTZWlJbXBsID09IG51bGwpCi0JCXsKLQkJCW1lcmdlSW1wbGljaXRJbnRlcmZhY2Uob2J0YWluSW1wbGljaXRJbnRlcmZhY2VJbnN0YW5jZSh3c1Byb2plY3QsIHRvTWVyZ2UsIHdzQW5ub3RhdGlvbiksIHdzQW5ub3RhdGlvbiwgaW5zcGVjdG9yKTsKLQkJfSBlbHNlCi0JCXsKLQkJCWlmICh0b01lcmdlLmdldFNlcnZpY2VFbmRwb2ludCgpID09IG51bGwgfHwgIXRvTWVyZ2UuZ2V0U2VydmljZUVuZHBvaW50KCkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMobmV3U2VpSW1wbCkpCi0JCQl7Ci0JCQkJc2VydmljZURhdGEoKS5tYXAodG9NZXJnZSwgbmV3U2VpSW1wbCk7Ci0JCQkJcmVzb2x2ZUludGVyZmFjZSh0b01lcmdlLCB3c1Byb2plY3QsIHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKEVORFBPSU5UX0lOVEVSRkFDRV9BVFRSSUJVVEUpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBvYnRhaW5JbXBsaWNpdEludGVyZmFjZUluc3RhbmNlKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIElXZWJTZXJ2aWNlIHdzLCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uKQotCXsKLQkJaWYgKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpICE9IG51bGwgJiYgd3MuZ2V0U2VydmljZUVuZHBvaW50KCkuaXNJbXBsaWNpdCgpKQotCQl7Ci0JCQlyZXR1cm4gd3MuZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0JCX0KLQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCwgdHJ1ZSk7Ci0JCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUoc2VpLCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUod3MsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5ULCBzZWkpOwotCQkKLQkJd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5hZGQoc2VpKTsKLQkJCi0JCXJldHVybiBzZWk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1lcmdlSW1wbGljaXRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJc2VpTWVyZ2VyLm1lcmdlKHNlaSwgd3NBbm5vdGF0aW9uLCBpbnNwZWN0b3IpOwotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQoc2VpLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBleHRyYWN0VGFyZ2V0TmFtZXNwYWNlKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24pCi0JewotCQkvLyBhZGQgdGFyZ2V0TmFtZXNwYWNlCi0JCWZpbmFsIFN0cmluZyB0YXJnZXROcyA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKTsKLQkJaWYgKHRhcmdldE5zPT1udWxsKSB7Ci0JCQlyZXR1cm4gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2Uod3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCX0JCi0JCQotCQlyZXR1cm4gdGFyZ2V0TnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVJbnRlcmZhY2UoSVdlYlNlcnZpY2Ugd3MsIElXZWJTZXJ2aWNlUHJvamVjdCBwcmVmZmVyZWQsIFN0cmluZyBpbXBsZW1lbnRhdGlvbikKLQl7Ci0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgcmVzb2x2ZWQgPSBudWxsOwotCQlmb3IgKElXZWJTZXJ2aWNlUHJvamVjdCBwcmogOiBnZXREb21CZWluZ0xvYWRlZCgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpKQotCQl7Ci0JCQlmb3IgKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpIDogcHJqLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkKLQkJCXsKLQkJCQlpZiAoc2VpLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxlbWVudGF0aW9uKSkKLQkJCQl7Ci0JCQkJCXJlc29sdmVkID0gc2VpOwotCQkJCQlpZiAocHJlZmZlcmVkLmVxdWFscyhwcmopKQotCQkJCQl7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlCi0JCQkJCXsKLQkJCQkJCXJlc29sdmVkID0gc2VpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3cywgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsIHJlc29sdmVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lFbmRwb2ludE1ldGFkYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lFbmRwb2ludE1ldGFkYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4NjRjMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wcm92aWRlci9JRW5kcG9pbnRNZXRhZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXI7DQotDQotLyoqDQotICogUmVwcmVzZW50cyBtZXRhZGF0YSBmb3IgYW4gZW5kcG9pbnQuIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuYW1lIGFuZCBuYW1lc3BhY2Ugb2YgdGhlIGVuZHBvaW50LiBDb250YWlucyBleHBvc2VkIG9wZXJhdGlvbnMuIFRoaXMgaW50ZXJmYWNlDQotICogaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBpbnB1dCBkYXRhIGZvciBpbXBsZW1lbnRvcnMgb2Yge0BsaW5rIElFbmRwb2ludEdlbmVyYXRvcn0uDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGludGVyZmFjZSBJRW5kcG9pbnRNZXRhZGF0YQ0KLXsNCi0JLyoqDQotCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgZW5wb2ludC4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOw0KLQ0KLQkvKioNCi0JICogQHJldHVybiBUaGUgcGFja2FnZS9uYW1lc3BhY2Ugb2YgdGhlIGVuZHBvaW50Lg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlKCk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHJlcHJlc2VudGluZyB0aGlzIGVuZHBvaW50DQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB3c2RsOnNlcnZpY2UgcmVwcmVzZW50aW5nIHRoaXMgZW5kcG9pbnQuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2VydmljZU5hbWUNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB3c2RsOnBvcnQgcmVmZXJlbmNpbmcgdGhpcyBlbmRwb2ludCB3aGljaCB0aGlzDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB3c2RsOnBvcnQgcmVmZXJlbmNpbmcgdGhpcyBlbmRwb2ludCB3aGljaCB0aGlzDQotCSAqIA0KLQkgKiBAcGFyYW0gcG9ydE5hbWUNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBwb3J0TmFtZSk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSB3c2RsIGxvY2F0aW9uIGluIGNhc2UgdGhpcyBlbmRwb2ludCBpcyBnZW5lcmF0ZWQgZnJvbSB3c2RsIG90aGVyd2lzZSA8dHQ+bnVsbDwvdHQ+DQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFdzZGxMb2NhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgd3NkbCBsb2NhdGlvbiBpbiBjYXNlIHRoaXMgZW5kcG9pbnQgaXMgZ2VuZXJhdGVkIGZyb20gd3NkbA0KLQkgKiANCi0JICogQHBhcmFtIHdzZGxMb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIGxvY2F0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsTG9jYXRpb24oU3RyaW5nIHdzZGxMb2NhdGlvbik7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBuYW1lc3BhY2UgVVJJDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpOw0KLQ0KLQkvKioNCi0JICogc2V0cyB0aGUgbmFtZXNwYWNlIFVSSQ0KLQkgKiANCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2VVUkkpOw0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgY29udGFpbmluZyBXZWJTZXJ2aWNlIG1ldGhvZHMgdGhhdCB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IHRoaXMgZW5kcG9pbnQgaW1wbGVtZW50YXRpb24uIFRoaXMNCi0JICogICAgICAgICBtZXRob2QgY2FuIHJldHVybiA8dHQ+bnVsbDwvdHQ+DQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFNFSU5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIHJlZmVyZW5jZWQgYnkgdGhpcyBlbmRwb2ludC4NCi0JICogDQotCSAqIEBwYXJhbSBzZWlOYW1lDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaW4gY2FzZSA8dHQ+c2VpTmFtZTwvdHQ+IGlzIG51bGwNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaW4gY2FzZSA8dHQ+c2VpTmFtZTwvdHQ+IGlzIGVtcHR5IHN0cmluZw0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U0VJTmFtZShTdHJpbmcgc2VpTmFtZSk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBlbmRwb2ludC4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIGxpc3Qgb2YgYWRkZWQgbWV0aG9kcw0KLQkgKi8NCi0JcHVibGljIExpc3Q8SUVuZHBvaW50TWV0aG9kPiBnZXRNZXRob2RzKCk7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBJRW5kcG9pbnRNZXRob2R9IHdpdGggPHR0Pm5hbWU8L3R0PiBhbmQgPHR0PnJldHVyblR5cGVGUU5hbWU8L3R0PiBhbmQgYWRkcyBpdCB0byB0aGUgc2V0IG9mIGF2YWlsYWJsZQ0KLQkgKiBtZXRob2RzLg0KLQkgKiANCi0JICogQHBhcmFtIG5hbWUNCi0JICogQHBhcmFtIHJldHVyblR5cGVGUU5hbWUNCi0JICogQHJldHVybiBjcmVhdGVkIElFbmRwb2ludE1ldGhvZCBmb3IgYWRkZWQgbWV0aG9kDQotCSAqLw0KLQlwdWJsaWMgSUVuZHBvaW50TWV0aG9kIGFkZE1ldGhvZChTdHJpbmcgbmFtZSwgU3RyaW5nIHJldHVyblR5cGVGUU5hbWUpOw0KLQkNCi0JLyoqDQotCSAqIEFkZHMge0BsaW5rIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJ9IHRvIHRoZSB7QGxpbmsgSUVuZHBvaW50TWV0YWRhdGF9IGRlc2NyaXB0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbnNDb250YWluZXIgLSBDb250YWluZXIsIHdoaWNoIHdpbGwgYmUgYWRkZWQuDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbnNDb250YWluZXIoZmluYWwgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBhbm5vdGF0aW9uc0NvbnRhaW5lcik7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIFNldCB3aXRoIHtAbGluayBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyfSByZWxhdGVkIHRvIHRoZSB7QGxpbmsgSUVuZHBvaW50TWV0YWRhdGF9IGRlc2NyaXB0b3IuDQotCSAqDQotCSAqIEByZXR1cm4gU2V0IHdpdGgge0BsaW5rIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJ9Lg0KLQkgKi8NCi0JcHVibGljIFNldDxJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyPiBnZXRBbm5vdGF0aW9uc0NvbnRhaW5lcigpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lFbmRwb2ludE1ldGhvZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wcm92aWRlci9JRW5kcG9pbnRNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQyMWNmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lFbmRwb2ludE1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucHJvdmlkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcjsNCi0NCi0vKioNCi0gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIG1ldGhvZCBpbiBlbmRwb2ludC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJRW5kcG9pbnRNZXRob2QNCi17DQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRob2QgbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSByZXR1cm5GUU5hbWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuVHlwZSgpOw0KLQ0KLQkvKioNCi0JICogQHBhcmFtIHJldHVyblR5cGVGUU5hbWUNCi0JICogICAgICAgICAgICBzZXRzIHRoZSByZXR1cm4gdHlwZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZShTdHJpbmcgcmV0dXJuVHlwZUZRTmFtZSk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIGh1bWFuIHJlYWRhYmxlIG1ldGhvZCByZXByZXNlbnRhdGlvbg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmUoKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gc2V0IG9mIHRocm93biBleGNlcHRpb25zDQotCSAqLw0KLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RXhjZXB0aW9ucygpOw0KLQ0KLQkvKioNCi0JICogQHBhcmFtIGV4Y2VwdGlvbkZRTmFtZQ0KLQkgKiAgICAgICAgICAgIGFkZCB0aHJvd24gZXhjZXB0aW9uIHRvIHRoZSBtZXRob2QNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZEV4Y2VwdGlvbihTdHJpbmcgZXhjZXB0aW9uRlFOYW1lKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gbGlzdCBvZiBtZXRob2QgcGFyYW1zIG9uIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBtZXRob2QNCi0JICovDQotCXB1YmxpYyBMaXN0PElNZXRob2RQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKTsNCi0NCi0JLyoqDQotCSAqIGNyZWF0ZXMgbmV3IHBhcmFtIGFucyBhZGRzIGl0IHRvIHRoZSBlbmQgb2YgcGFyYW1ldGVycyBsaXN0Lg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZQ0KLQkgKiBAcGFyYW0gbmFtZSBwYXJhbWV0ZXIgbmFtZQ0KLQkgKiBAcmV0dXJuIHtAbGluayBJTWV0aG9kUGFyYW1ldGVyfSBjcmVhdGVzDQotCSAqLw0KLQlwdWJsaWMgSU1ldGhvZFBhcmFtZXRlciBhZGRQYXJhbWV0ZXIoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lKTsNCi0NCi0JLyoqDQotCSAqIEFkZHMge0BsaW5rIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJ9IHRvIHRoZSB7QGxpbmsgSUVuZHBvaW50TWV0aG9kfSBkZXNjcmlwdG9yLg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb25zQ29udGFpbmVyIC0gQ29udGFpbmVyLCB3aGljaCB3aWxsIGJlIGFkZGVkLg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZEFubm90YXRpb25zQ29udGFpbmVyKGZpbmFsIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgYW5ub3RhdGlvbnNDb250YWluZXIpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBTZXQgd2l0aCB7QGxpbmsgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcn0gcmVsYXRlZCB0byB0aGUge0BsaW5rIElFbmRwb2ludE1ldGhvZH0gZGVzY3JpcHRvci4NCi0JICoNCi0JICogQHJldHVybiBTZXQgd2l0aCB7QGxpbmsgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcn0uDQotCSAqLw0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXI+IGdldEFubm90YXRpb25zQ29udGFpbmVyKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcHJvdmlkZXIvSU1ldGhvZFBhcmFtZXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wcm92aWRlci9JTWV0aG9kUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlNzNlNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wcm92aWRlci9JTWV0aG9kUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wcm92aWRlcjsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIHBhcmFtZXRlciBpbiBtZXRob2QNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICogDQotICovDQotcHVibGljIGludGVyZmFjZSBJTWV0aG9kUGFyYW1ldGVyDQotew0KLQkvKioNCi0JICogQHJldHVybiB0aGUgcGFyYW1ldGVyIG5hbWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOw0KLQ0KLQkvKioNCi0JICogQHJldHVybiBwYXJhbWV0ZXIgZnVsbHkgcXVhbGlmaWVkIG5hbWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L0lXc0RPTVJ1bnRpbWVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L0lXc0RPTVJ1bnRpbWVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmOGNiMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9JV3NET01SdW50aW1lSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JTmFtZWRFeHRlbnNpb25JbmZvOw0KLQ0KLS8qKg0KLSAqIERlZmluZXMgdGhlIGluZm9ybWF0aW9uIHN0cnVjdHVyZSB3aGljaCBzaG91bGQgYmUgaW5zdGFudGlhdGVkIHVwb24gcmVhZGluZyBjb250cmlidXRvcnMNCi0gKiB0byB0aGUgU3VwcG9ydGVkIFJ1bnRpbWUgZXh0ZW5zaW9uIHBvaW50Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIEhyaXN0b3YgSTAzNjIwMQ0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJV3NET01SdW50aW1lSW5mbyBleHRlbmRzIElOYW1lZEV4dGVuc2lvbkluZm8NCi17DQotCS8qKg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgbWFwIG9mIHByb2plY3QgZmFjZXRzIHJlbGV2YW50IGZvciBhIHBhcnRpY3VsYXIgcnVudGltZSB3aGVyZSB0aGUga2V5IGlzIA0KLQkgKiB0aGUgcHJvamVjdCBmYWNldCBpZCBhbmQgdGhlIHZhbHVlIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGZhY2V0IGlmIHNwZWNpZmllZC4NCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb2plY3RGYWNldHMoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9Xc0RPTVJ1bnRpbWVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9Xc0RPTVJ1bnRpbWVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MmE4MmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcmVnaXN0cnkvV3NET01SdW50aW1lUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbC5OYW1lZEV4dGVuc2lvbkluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBIcmlzdG92IEkwMzYyMDENCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc0RPTVJ1bnRpbWVSZWdpc3RyeSANCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVJbmZvIGV4dGVuZHMgTmFtZWRFeHRlbnNpb25JbmZvIGltcGxlbWVudHMgSVdzRE9NUnVudGltZUluZm8NCi0Jew0KLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb2plY3RGYWNldHM7DQotCQkNCi0JCVJ1bnRpbWVJbmZvKGZpbmFsIFN0cmluZyBwSWQsIGZpbmFsIFN0cmluZyBwTGFiZWwsIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvamVjdEZhY2V0cykNCi0JCXsNCi0JCQlzdXBlcihwSWQsIHBMYWJlbCk7DQotCQkJDQotCQkJdGhpcy5wcm9qZWN0RmFjZXRzID0gcHJvamVjdEZhY2V0czsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRQcm9qZWN0RmFjZXRzKCkNCi0JCXsNCi0JCQlyZXR1cm4gdGhpcy5wcm9qZWN0RmFjZXRzOw0KLQkJfQ0KLSAJfQ0KLQkNCi0JLyoqIFRoZSBJRCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IGZvciBhIHN1cHBvcnRlZCBydW50aW1lICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX1hQID0gSmF4V3NEb21SdW50aW1lUGx1Z2luLlBMVUdJTl9JRCArICIuZG9tcnVudGltZXMiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKgkgRXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBleHRlbnNpb24gcG9pbnQgbm90IHByb3Blcmx5IGRlZmluZWQgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEID0gIlJlZ2lzdGVyZWQgcnVudGltZSBleHRlbnNpb24gbm90IHByb3Blcmx5IHJlZ2lzdGVyZWQgKGVycm9yIGluIHBsdWdpbi54bWwpIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVCA9ICJpbXBsZW1lbnRhdGlvbiI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhQX1BST0pFQ1RfRkFDRVRfRUxFTUVOVCA9ICJwcm9qZWN0X2ZhY2V0IjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhQX1BST0pFQ1RfRkFDRVRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfUFJPSkVDVF9GQUNFVF9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gaW5mbyB0aGUgZGVzY3JpcHRvciBvYmplY3QgYnVpbHQgZHVyaW5nIGV4dGVuc2lvbiBwb2ludCBsb2FkDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgcnVudGltZSBleHRlbnNpb24gaW1wbGVtZW50YXRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBpbnN0YW50aWF0ZVJ1bnRpbWUoZmluYWwgSVdzRE9NUnVudGltZUluZm8gaW5mbykNCi0Jew0KLQkJZmluYWwgSUV4dGVuc2lvbiBleHQgPSBmaW5kRXh0ZW5zaW9uKGluZm8pOw0KLQkJDQotCQlpZihleHQ9PW51bGwpDQotCQl7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEKTsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQkNCi0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsIDogZXh0LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKQ0KLQkJew0KLQkJCWlmIChlbC5nZXROYW1lKCkuZXF1YWxzKFhQX0lNUExFTUVOVEFUSU9OX0VMRU1FTlQpKQ0KLQkJCXsNCi0JCQkJdHJ5DQotCQkJCXsNCi0JCQkJCS8vRklYTUUgQ2xhc3NDYXN0RXhjZXB0aW9uIHNob3dpbmcgdXAgaW4gdGhlIGxvZ3MgaW4gdGhlIFdUUCBidWlsZA0KLQkJCQkJT2JqZWN0IGltcGwgPSBlbC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFhQX0lNUExFTUVOVEFUSU9OX0VMRU1FTlRfQ0xBU1NfQVRUUik7DQotCQkJCQlpZiAoaW1wbCBpbnN0YW5jZW9mIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24pIHsNCi0JCQkJCQlyZXR1cm4gKElXc0RPTVJ1bnRpbWVFeHRlbnNpb24pIGltcGw7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCXJldHVybiBudWxsOw0KLQkJCQkJfQ0KLS8vCQkJCQlyZXR1cm4gKElXc0RPTVJ1bnRpbWVFeHRlbnNpb24pIGVsLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSKTsNCi0JCQkJfSANCi0JCQkJY2F0Y2ggKGZpbmFsIENvcmVFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgZXh0ZW5zaW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCXJldHVybiBudWxsOw0KLQkJCQkJDQotCQkJCX0NCi0vLwkJCQljYXRjaCAoZmluYWwgQ2xhc3NDYXN0RXhjZXB0aW9uIGUpDQotLy8JCQkJew0KLS8vCQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiSW1wbGVtZW50YXRpb24gY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IHByb3BlciBpbnRlcmZhY2UiLCBlKTsgLy8kTk9OLU5MUy0xJA0KLS8vCQkJCQlyZXR1cm4gbnVsbDsNCi0vLwkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlsb2dnZXIoKS5sb2dFcnJvcihFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQpOw0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIExvY2F0ZXMgdGhlIGV4dGVuc2lvbiBwb2ludCBjb250cmlidXRpb24gZGVmaW5pdGlvbiBmb3IgdGhpcyBwYXJ0aWN1bGFyIHJ1bnRpbWUuDQotCSAqIA0KLQkgKiBAcGFyYW0gaW5mbyB0aGUgZGVzY3JpcHRvciBvYmplY3QgYnVpbHQgZHVyaW5nIGV4dGVuc2lvbiBwb2ludCBsb2FkDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgY29udHJpYnV0aW9uIGRlZmluaXRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUV4dGVuc2lvbiBmaW5kRXh0ZW5zaW9uKGZpbmFsIElXc0RPTVJ1bnRpbWVJbmZvIGluZm8pDQotCXsNCi0JCWlmKGluZm8hPW51bGwpDQotCQl7DQotCQkJZmluYWwgSUV4dGVuc2lvbltdIGV4dHMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFJVTlRJTUVfWFApLmdldEV4dGVuc2lvbnMoKTsNCi0JCQ0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykNCi0JCQl7DQotCQkJCWlmIChleHRzW2ldLmdldFNpbXBsZUlkZW50aWZpZXIoKS5lcXVhbHMoaW5mby5nZXRJZCgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGV4dHNbaV07DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBydW50aW1lcy4NCi0JICogDQotCSAqIEByZXR1cm4gc2V0IG9mIGluZm9ybWF0aW9uIHJlY29yZHMgZm9yIHRoZSByZWdpc3RlcmVkIHJ1bnRpbWVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SVdzRE9NUnVudGltZUluZm8+IGdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKQ0KLQl7DQotCQlmaW5hbCBJRXh0ZW5zaW9uW10gZXh0cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoUlVOVElNRV9YUCkuZ2V0RXh0ZW5zaW9ucygpOw0KLQkJZmluYWwgQ29sbGVjdGlvbjxJV3NET01SdW50aW1lSW5mbz4gcnVudGltZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxJV3NET01SdW50aW1lSW5mbz4oZXh0cy5sZW5ndGgpOw0KLQkJDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dHMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJSGFzaE1hcDxTdHJpbmcsU3RyaW5nPiBwcm9qZWN0RmFjZXRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsNCi0JCQkNCi0JCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbCA6IGV4dHNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpDQotCQkJew0KLQkJCQlpZiAoZWwuZ2V0TmFtZSgpLmVxdWFscyhYUF9QUk9KRUNUX0ZBQ0VUX0VMRU1FTlQpKQ0KLQkJCQl7DQotCQkJCQlwcm9qZWN0RmFjZXRzLnB1dChlbC5nZXRBdHRyaWJ1dGUoWFBfUFJPSkVDVF9GQUNFVF9JRCksZWwuZ2V0QXR0cmlidXRlKFhQX1BST0pFQ1RfRkFDRVRfVkVSU0lPTikpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCQ0KLQkJCQ0KLQkJCXJ1bnRpbWVEZXNjcmlwdG9ycy5hZGQobmV3IFJ1bnRpbWVJbmZvKGV4dHNbaV0uZ2V0U2ltcGxlSWRlbnRpZmllcigpLCBleHRzW2ldLmdldExhYmVsKCksIHByb2plY3RGYWNldHMpKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHJ1bnRpbWVEZXNjcmlwdG9yczsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgZGVzY3JpcHRvciBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGlzIHJ1bnRpbWUgaWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gcnVudGltZUlkIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBydW50aW1lDQotCSAqIEByZXR1cm4gZGVzY3JpcHRvciBvYmplY3QgZm9yIHRoZSBuZWVkZWQgcnVudGltZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJV3NET01SdW50aW1lSW5mbyBnZXRSdW50aW1lSW5mbyhmaW5hbCBTdHJpbmcgcnVudGltZUlkKQ0KLQl7DQotCQlJdGVyYXRvcjxJV3NET01SdW50aW1lSW5mbz4gcmVnaXN0ZXJlZFJ1bnRpbWUgPSBnZXRSZWdpc3RlcmVkUnVudGltZXNJbmZvKCkuaXRlcmF0b3IoKTsNCi0JCQ0KLQkJd2hpbGUocmVnaXN0ZXJlZFJ1bnRpbWUuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlXc0RPTVJ1bnRpbWVJbmZvIHJ1bnRpbWVJbmZvID0gcmVnaXN0ZXJlZFJ1bnRpbWUubmV4dCgpOw0KLQkJCQ0KLQkJCWlmKHJ1bnRpbWVJbmZvLmdldElkKCkuZXF1YWxzKHJ1bnRpbWVJZCkpDQotCQkJew0KLQkJCQlyZXR1cm4gcnVudGltZUluZm87DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgSUxvZ2dlciBsb2dnZXIoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb20yUmVzb3VyY2VNYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb20yUmVzb3VyY2VNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmVmMjUyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tMlJlc291cmNlTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi0NCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IHRha2VzIGNhcmUgZm9yIG1hcHBpbmcgRE9NIG9iamVjdHMgdG8gRWNsaXBzZSByZXNvdXJjZXMuIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tMlJlc291cmNlTWFwcGVyDQotew0KLQkvKiogdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERvbTJSZXNvdXJjZU1hcHBlciBJTlNUQU5DRSA9IG5ldyBEb20yUmVzb3VyY2VNYXBwZXIoKTsNCi0JDQotCXByaXZhdGUgRG9tU3dpdGNoPFN0cmluZz4gaW1wbENsYXNzRmluZGVyU3dpdGNoOw0KLQkNCi0JLyoqDQotCSAqIFNpbmdsZXRvbiBDb25zdHJ1Y3RvciANCi0JICovDQotCXByaXZhdGUgRG9tMlJlc291cmNlTWFwcGVyKCkgewkNCi0JCXRoaXMuaW1wbENsYXNzRmluZGVyU3dpdGNoID0gY3JlYXRlSW1wbEZpbmRlclN3aXRjaCgpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRmluZHMgdW5kZXJseWluZyB7QGxpbmsgSVJlc291cmNlfSBmb3IgdGhpcyBET00gb2JqZWN0DQotCSAqIEBwYXJhbSBlT2JqZWN0IHRoZSBET00gb2JqZWN0DQotCSAqIEByZXR1cm4gZm91bmQgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBJUmVzb3VyY2UgZmluZFJlc291cmNlKGZpbmFsIEVPYmplY3QgZU9iamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZU9iamVjdCk7DQotCQlzd2l0Y2ggKGVPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIA0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRToNCi0JCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6IA0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EOiANCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNOgkNCi0JCQlmaW5hbCBJVHlwZSB0eXBlID0gZmluZFR5cGUoZU9iamVjdCk7IA0KLQkJCXJldHVybiB0eXBlPT1udWxsID8gbnVsbCA6IHR5cGUuZ2V0UmVzb3VyY2UoKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVDoNCi0JCQlyZXR1cm4gZmluZFByb2plY3QoKElXZWJTZXJ2aWNlUHJvamVjdCllT2JqZWN0KTsNCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRmluZHMgSVByb2plY3QgaW5zdGFuY2UgZm9yIHRoZSB3ZWIgc2VydmljZSBwcm9qZWN0IHJlcHJlc2VudGVkIGJ5IDxjb2RlPndzUHJvamVjdDwvY29kZT4NCi0JICogQHBhcmFtIHdzUHJvamVjdCB0aGUgcHJvamVjdCBET00gb2JqZWN0DQotCSAqIEByZXR1cm4gZm91bmQgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBJUHJvamVjdCBmaW5kUHJvamVjdChmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQl7DQotCQlpZiAod3NQcm9qZWN0ID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3Qod3NQcm9qZWN0LmdldE5hbWUoKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBGaW5kcyB1bmRlcmx5aW5nIHtAbGluayBJVHlwZX0gaW5zdGFuY2UgZm9yIHRoaXMgPGNvZGU+ZU9iamVjdDwvY29kZT4gDQotCSAqIEBwYXJhbSBlT2JqZWN0IHRoZSBET00gb2JqZWN0DQotCSAqIEByZXR1cm4gdGhlIElUeXBlIGNvbnRhaW5pbmcgdGhpcyA8Y29kZT5lT2JqZWN0PC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIElUeXBlIGZpbmRUeXBlKGZpbmFsIEVPYmplY3QgZU9iamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGVPYmplY3QpOw0KLQkJDQotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QoRG9tVXRpbC5JTlNUQU5DRS5maW5kV3NQcm9qZWN0KGVPYmplY3QpKTsNCi0JCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JCWZpbmFsIFN0cmluZyBmcU5hbWUgPSBpbXBsQ2xhc3NGaW5kZXJTd2l0Y2guZG9Td2l0Y2goZU9iamVjdCk7DQotCQlpZiAoamF2YVByb2plY3Q9PW51bGwgfHwgZnFOYW1lID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGphdmFQcm9qZWN0LmZpbmRUeXBlKGZxTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBEb21Td2l0Y2g8U3RyaW5nPiBjcmVhdGVJbXBsRmluZGVyU3dpdGNoKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBEb21Td2l0Y2g8U3RyaW5nPigpDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIFN0cmluZyBjYXNlSVdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugd3MpIHsNCi0JCQkJcmV0dXJuIHdzLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpIHsNCi0JCQkJcmV0dXJuIHNlaSA9PSBudWxsID8gbnVsbCA6IHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViTWV0aG9kKElXZWJNZXRob2Qgd20pIHsNCi0JCQkJcmV0dXJuIHdtID09IG51bGwgPyBudWxsIDogY2FzZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHdtLmVDb250YWluZXIoKSk7DQotCQkJfQkNCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIHdwKSB7DQotCQkJCXJldHVybiBjYXNlSVdlYk1ldGhvZCgoSVdlYk1ldGhvZCl3cC5lQ29udGFpbmVyKCkpOw0KLQkJCX0NCi0JCX07DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0RvbUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWZiNTNjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4NCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZQ0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBEb21QYWNrYWdlIG1vZGVsUGFja2FnZTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBEb21BZGFwdGVyRmFjdG9yeSgpIHsNCi0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkNCi0JCXsNCi0JCQltb2RlbFBhY2thZ2UgPSBEb21QYWNrYWdlLmVJTlNUQU5DRTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQ0KLQkJew0KLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIERvbVN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9DQotCQluZXcgRG9tU3dpdGNoPEFkYXB0ZXI+KCkNCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSURPTShJRE9NIG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJRE9NQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChJSmF2YVdlYlNlcnZpY2VFbGVtZW50IG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50QWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYk1ldGhvZChJV2ViTWV0aG9kIG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJV2ViTWV0aG9kQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYlBhcmFtKElXZWJQYXJhbSBvYmplY3QpDQotCQkJew0KLQkJCQlyZXR1cm4gY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYlNlcnZpY2VQcm9qZWN0KElXZWJTZXJ2aWNlUHJvamVjdCBvYmplY3QpDQotCQkJew0KLQkJCQlyZXR1cm4gY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0QWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYlR5cGUoSVdlYlR5cGUgb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlXZWJUeXBlQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOw0KLQkJCX0NCi0JCX07DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0Lg0KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7DQotCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00gPGVtPklET008L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlET01BZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50IDxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50QWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCA8ZW0+SVdlYiBNZXRob2Q8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJNZXRob2RBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0gPGVtPklXZWIgUGFyYW08L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UgPGVtPklXZWIgU2VydmljZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCi0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0IDxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCi0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViU2VydmljZVByb2plY3RBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZSA8ZW0+SVdlYiBUeXBlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGUNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlR5cGVBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSANCi0Jew0KLQkJc3luY2hyb25pemVkICh0YXJnZXQpIHsNCi0JCQlyZXR1cm4gc3VwZXIuYWRhcHQodGFyZ2V0LCB0eXBlKTsNCi0JCX0NCi0JfQ0KLQkNCi19IC8vRG9tQWRhcHRlckZhY3RvcnkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5NTIxNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0RvbVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZTsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuDQotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQ0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwNCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdA0KLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkNCi0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwNCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIERvbVN3aXRjaDxUPiB7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgRG9tUGFja2FnZSBtb2RlbFBhY2thZ2U7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRG9tU3dpdGNoKCkgew0KLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKQ0KLQkJew0KLQkJCW1vZGVsUGFja2FnZSA9IERvbVBhY2thZ2UuZUlOU1RBTkNFOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgew0KLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgew0KLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKQ0KLQkJew0KLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOw0KLQkJCXJldHVybg0KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPw0KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOg0KLQkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsNCi0JCXN3aXRjaCAoY2xhc3NpZmllcklEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JRE9NOg0KLQkJCXsNCi0JCQkJSURPTSBpZG9tID0gKElET00pdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSURPTShpZG9tKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQ6DQotCQkJew0KLQkJCQlJSmF2YVdlYlNlcnZpY2VFbGVtZW50IGlKYXZhV2ViU2VydmljZUVsZW1lbnQgPSAoSUphdmFXZWJTZXJ2aWNlRWxlbWVudCl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KGlKYXZhV2ViU2VydmljZUVsZW1lbnQpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOg0KLQkJCXsNCi0JCQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EOg0KLQkJCXsNCi0JCQkJSVdlYk1ldGhvZCBpV2ViTWV0aG9kID0gKElXZWJNZXRob2QpdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSVdlYk1ldGhvZChpV2ViTWV0aG9kKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChpV2ViTWV0aG9kKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU06DQotCQkJew0KLQkJCQlJV2ViUGFyYW0gaVdlYlBhcmFtID0gKElXZWJQYXJhbSl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJV2ViUGFyYW0oaVdlYlBhcmFtKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChpV2ViUGFyYW0pOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFOg0KLQkJCXsNCi0JCQkJSVdlYlNlcnZpY2UgaVdlYlNlcnZpY2UgPSAoSVdlYlNlcnZpY2UpdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSVdlYlNlcnZpY2UoaVdlYlNlcnZpY2UpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KGlXZWJTZXJ2aWNlKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUOg0KLQkJCXsNCi0JCQkJSVdlYlNlcnZpY2VQcm9qZWN0IGlXZWJTZXJ2aWNlUHJvamVjdCA9IChJV2ViU2VydmljZVByb2plY3QpdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSVdlYlNlcnZpY2VQcm9qZWN0KGlXZWJTZXJ2aWNlUHJvamVjdCk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1RZUEU6DQotCQkJew0KLQkJCQlJV2ViVHlwZSBpV2ViVHlwZSA9IChJV2ViVHlwZSl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJV2ViVHlwZShpV2ViVHlwZSk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlKYXZhV2ViU2VydmljZUVsZW1lbnQoaVdlYlR5cGUpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklET008L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRE9NPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlET00oSURPTSBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy4NCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KElKYXZhV2ViU2VydmljZUVsZW1lbnQgb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIE1ldGhvZDwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJNZXRob2QoSVdlYk1ldGhvZCBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFBhcmFtPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4NCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4NCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGNhc2VJV2ViU2VydmljZShJV2ViU2VydmljZSBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJTZXJ2aWNlUHJvamVjdChJV2ViU2VydmljZVByb2plY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBUeXBlPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBUeXBlPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJUeXBlKElXZWJUeXBlIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4NCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLX0gLy9Eb21Td2l0Y2gNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvSmVlNURvbVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvSmVlNURvbVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0NTVkNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0plZTVEb21VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLkFubm90YXRpb25BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uSUFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotLyoqDQotICogVXRpbGl0eSBmb3Igc29tZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmljIGxvZ2ljcyB0aGF0IGFyZSBmcmVxdWVudGx5IHVzZWQNCi0gKiB3aGlsZSBkZWFsaW5nIHdpdGggRE9NIG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKZWU1RG9tVXRpbHMgDQotew0KLQkvKiogdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSAqLw0KLQlwcml2YXRlIHN0YXRpYyBKZWU1RG9tVXRpbHMgaW5zdGFuY2U7DQotCQ0KLQlwcml2YXRlIEplZTVEb21VdGlscygpIHsNCi0JCS8vIHNpbmdsZXRvbg0KLQl9DQotCQ0KLQkvKioNCi0JICogTWV0aG9kIHRoYXQgZGVjaWRlcyBpZiB0aGUgYXR0cmlidXRlICdwYXJ0TmFtZScgaXMgdXNlZCBhdCBhbGwgYWNjb3JkaW5nIA0KLQkgKiB0byBKU1ItMTgxIHNlY3Rpb24gNC40LjEgLSBhdHRyaWJ1dGUgJ3BhcnROYW1lJyBjb2x1bW4gJ21lYW5pbmcnLg0KLQkgKiBAcGFyYW0gd2ViUGFyYW0gdGhlIHdlYlBhcmFtIHRvIGJlIGNoZWNrZWQNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbiBjYXNlIHBhcnROYW1lIGlzIHVzZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUGFydE5hbWVVc2VkKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7DQotCQkNCi0JCXJldHVybiB3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLlJQQyB8fCANCi0JCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkU7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBNZXRob2QgdGhhdCBkZWNpZGVzIGlzIHRoZSBhdHRyaWJ1dGUgJ25hbWUnIGlzIHVzZWQgYXQgYWxsDQotCSAqIGFjY29yZGluZyB0byBKU1ItMTgxIHNlY3Rpb24gNC40LjEgLSBhdHRyaWJ1dGUgJ25hbWUnIGNvbHVtbiAnbWVhbmluZycNCi0JICogQHBhcmFtIHdlYlBhcmFtDQotCSAqIEByZXR1cm4gcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgbmFtZSBpcyB1c2VkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc05hbWVVc2VkKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7DQotCQlpZiggd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCB8fCB3ZWJQYXJhbS5pc0hlYWRlcigpICkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gIGZpbmRBbm5vdGF0aW9uKHdlYlBhcmFtLCBXUF9BTk5PVEFUSU9OKTsNCi0JCWlmIChhbm5vdGF0aW9uPT1udWxsKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdQQW5ub3RhdGlvbkZlYXR1cmVzLlBBUlRfTkFNRV9BVFRSSUJVVEUpPT1udWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogSGVscGVyIG1ldGhvZCB0byBleHRyYWN0IGFubm90YXRpb24gd2l0aCBmdWxseSBxdWFsaWZpZWQgbmFtZSA8Y29kZT5hbm5GUU5hbWU8L2NvZGU+DQotCSAqIEBwYXJhbSBlT2JqZWN0IHRoZSBvYmplY3QgdG8gc2VhcmNoIGluDQotCSAqIEBwYXJhbSBhbm5GUU5hbWUgdGhlIEZRIG5hbWUgb2Ygc2VhcmNoZWQgYW5ub3RhdGlvbiANCi0JICogQHJldHVybiBmb3VuZCBhbm5vdGF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZmluZEFubm90YXRpb24oZmluYWwgRU9iamVjdCBlT2JqZWN0LCBmaW5hbCBTdHJpbmcgYW5uRlFOYW1lKSANCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSUFubm90YXRpb25BZGFwdGVyKUFubm90YXRpb25BZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChlT2JqZWN0LCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJaWYgKGFkYXB0ZXIhPW51bGwpIHsNCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRBbm5vdGF0aW9uKGFubkZRTmFtZSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogTWV0aG9kIHRoYXQgZGVjaWRlcyBpZiB0aGUgcGFyYW0gbmFtZSBpcyByZXF1aXJlZCB0byBiZSBwdXQgaW4gdGhlIGFubm90YXRpb24gYWNjb3JkaW5nIA0KLQkgKiB0byBKU1ItMTgxIHNlY3Rpb24gNC40LjEgLSBhdHRyaWJ1dGUgJ25hbWUnIGNvbHVtbiAnbWVhbmluZycuDQotCSAqIEBwYXJhbSB3ZWJQYXJhbQ0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuYW1lIGF0dHJpYnV0ZSBzaG91bGQgYmUgcHV0IG9uIGFubm90YXRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTmFtZVJlcXVpcmVkKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7DQotCQkNCi0JCWlmICh3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UICYmDQotCQkJd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKT09U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFICYmDQotCQkJKHdlYlBhcmFtLmdldEtpbmQoKT09V2ViUGFyYW1LaW5kLklOT1VUIHx8IHdlYlBhcmFtLmdldEtpbmQoKT09V2ViUGFyYW1LaW5kLk9VVCkpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9CQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBKZWU1RG9tVXRpbHMgZ2V0SW5zdGFuY2UoKQ0KLQl7DQotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgew0KLQkJCWluc3RhbmNlID0gbmV3IEplZTVEb21VdGlscygpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gaW5zdGFuY2U7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL1BhcmFtVmFsdWVDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvUGFyYW1WYWx1ZUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGU3NzI0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvUGFyYW1WYWx1ZUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGNvbXBhcmVzIHtAbGluayBJUGFyYW1WYWx1ZVBhaXJ9IGJ5IHByb3BlcnR5IG5hbWUuIEludGVuZGVkIHRvIGJlIHVzZWQgd2hlbiANCi0gKiBjcmVhdGluZyBhIHtAbGluayBUcmVlU2V0fSBmb3IgYW5ub3RhdGlvbiBwcm9wZXJ0aWVzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGFyYW1WYWx1ZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPElQYXJhbVZhbHVlUGFpcj4NCi17CQkNCi0JcHVibGljIGVudW0gT3JkZXIge05vcm1hbCwgUmV2ZXJzZWR9Ow0KLQ0KLQlwcml2YXRlIGZpbmFsIE9yZGVyIG9yZGVyOw0KLQkNCi0JcHVibGljIFBhcmFtVmFsdWVDb21wYXJhdG9yKCkgew0KLQkJb3JkZXIgPSBPcmRlci5Ob3JtYWw7DQotCX0NCi0JDQotCXB1YmxpYyBQYXJhbVZhbHVlQ29tcGFyYXRvcihmaW5hbCBPcmRlciBvcmRlcikgew0KLQkJdGhpcy5vcmRlciA9IG9yZGVyOw0KLQl9DQotDQotCQ0KLQlwdWJsaWMgaW50IGNvbXBhcmUoSVBhcmFtVmFsdWVQYWlyIG8xLCBJUGFyYW1WYWx1ZVBhaXIgbzIpIA0KLQl7DQotCQlpZihvcmRlcj09T3JkZXIuTm9ybWFsKSB7DQotCQkJcmV0dXJuIG8xLmdldFBhcmFtKCkuY29tcGFyZVRvKG8yLmdldFBhcmFtKCkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbzIuZ2V0UGFyYW0oKS5jb21wYXJlVG8obzEuZ2V0UGFyYW0oKSk7DQotCX0JCQ0KLX0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxYTQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Nzg0YWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwYmIyYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBKdW4gMjMgMTA6Mzg6MjIgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhYTYyM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpJEltcGxlbWVudGF0aW9uCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwuaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLAotIG9yZy5lY2xpcHNlLmpmYWNlCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxMGFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BdWd1c3QgMTUsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDE4NGVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLWJpbi5pbmNsdWRlcyA9IC4sXA0KLSAgICAgICAgICAgICAgIGljb25zLyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbA0KLWphcnMuY29tcGlsZS5vcmRlciA9IC4NCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvU0VJLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9TRUkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTMyNWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9TRUkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1NFSV9Hcm91cC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvU0VJX0dyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWFmY2MwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvU0VJX0dyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfTWV0aG9kLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfTWV0aG9kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTgxOGEzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX01ldGhvZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1BhcmFtX0luLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfUGFyYW1fSW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTZiMzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfUGFyYW1fSW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9QYXJhbV9PdXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9QYXJhbV9PdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDA5MThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfUGFyYW1fT3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfU2VydmljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1NlcnZpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MjE2YjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfU2VydmljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1NlcnZpY2VfR3JvdXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9TZXJ2aWNlX0dyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGI0ODE0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1NlcnZpY2VfR3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9TZXJ2aWNlX0l0ZW1fUHJvdmlkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9TZXJ2aWNlX0l0ZW1fUHJvdmlkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfU2VydmljZV9JdGVtX1Byb3ZpZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9lcnJvcl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Vycm9yX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiYzYwNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Vycm9yX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlET01fd2ViU2VydmljZVByb2plY3RzX0lXZWJTZXJ2aWNlUHJvamVjdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlET01fd2ViU2VydmljZVByb2plY3RzX0lXZWJTZXJ2aWNlUHJvamVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjNzY2NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJRE9NX3dlYlNlcnZpY2VQcm9qZWN0c19JV2ViU2VydmljZVByb2plY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3dlYk1ldGhvZHNfSVdlYk1ldGhvZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfd2ViTWV0aG9kc19JV2ViTWV0aG9kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTVmNWE4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfd2ViTWV0aG9kc19JV2ViTWV0aG9kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVdlYk1ldGhvZF9wYXJhbWV0ZXJzX0lXZWJQYXJhbS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlXZWJNZXRob2RfcGFyYW1ldGVyc19JV2ViUGFyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwM2Q2M2NiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVdlYk1ldGhvZF9wYXJhbWV0ZXJzX0lXZWJQYXJhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdF9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJV2ViU2VydmljZVByb2plY3Rfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlc19JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzYxYjE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdF9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJV2ViU2VydmljZVByb2plY3Rfd2ViU2VydmljZXNfSVdlYlNlcnZpY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJV2ViU2VydmljZVByb2plY3Rfd2ViU2VydmljZXNfSVdlYlNlcnZpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTIwZDEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0X3dlYlNlcnZpY2VzX0lXZWJTZXJ2aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lET00uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSURPTS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyMGVlZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSURPTS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lKYXZhV2ViU2VydmljZUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYTU4YTY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lKYXZhV2ViU2VydmljZUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzNhOTk3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJNZXRob2QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYk1ldGhvZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExN2RjN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYk1ldGhvZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViUGFyYW0uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlBhcmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE1YzcwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViUGFyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlNlcnZpY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlNlcnZpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzUwMGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJTZXJ2aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJTZXJ2aWNlUHJvamVjdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViU2VydmljZVByb2plY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTgzNjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJTZXJ2aWNlUHJvamVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViVHlwZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwMGFlZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL3dhcm5pbmdfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy93YXJuaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiMmU1MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL3dhcm5pbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjhiOGU3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1CdW5kbGUtTmFtZS4wPUpBWC1XUyBET00gVUkNCi1CdW5kbGUtVmVuZG9yLjA9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0NCi0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyZWF0ZSBOZXcgezB9IFVuZGVyIHsxfSBGZWF0dXJlDQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNoaWxkIG9mIHR5cGUgezB9IGZvciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlIHNlbGVjdGVkIHsyfS4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50Lg0KLQ0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSBUaGUgezB9IG9mIHRoZSB7MX0NCi0NCi1fVUlfSURPTV90eXBlID0gSURPTQ0KLV9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X3R5cGUgPSBKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQNCi1fVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV90eXBlID0gU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UNCi1fVUlfSVdlYlNlcnZpY2VfdHlwZSA9IFdlYiBTZXJ2aWNlDQotX1VJX0lXZWJTZXJ2aWNlUHJvamVjdF90eXBlID0gV2ViIFNlcnZpY2UgUHJvamVjdA0KLV9VSV9Vbmtub3duX3R5cGUgPSBPYmplY3QNCi0NCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gVmFsdWUNCi0NCi1fVUlfSURPTV93ZWJTZXJ2aWNlUHJvamVjdHNfZmVhdHVyZSA9IFdlYiBTZXJ2aWNlIFByb2plY3RzDQotX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfamF2YUltcGxlbWVudGF0aW9uX2ZlYXR1cmUgPSBKYXZhIEltcGxlbWVudGF0aW9uDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfbmFtZV9mZWF0dXJlID0gTmFtZQ0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ltcGxpY2l0X2ZlYXR1cmUgPSBJbXBsaWNpdA0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ltcGxlbWVudGluZ1dlYlNlcnZpY2VzX2ZlYXR1cmUgPSBJbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUgPSBUYXJnZXQgTmFtZXNwYWNlDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmcgPSBTT0FQIEJpbmRpbmcNCi1fVUlfSVdlYlNlcnZpY2VfbmFtZV9mZWF0dXJlID0gTmFtZQ0KLV9VSV9JV2ViU2VydmljZV9zZXJ2aWNlRW5kcG9pbnRfZmVhdHVyZSA9IFNlcnZpY2UgRW5kcG9pbnQNCi1fVUlfSVdlYlNlcnZpY2VfdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUgPSBUYXJnZXQgTmFtZXNwYWNlDQotX1VJX0lXZWJTZXJ2aWNlX3BvcnROYW1lX2ZlYXR1cmUJCT0gUG9ydCBOYW1lDQotX1VJX0lXZWJTZXJ2aWNlX3dzZGxMb2NhdGlvbl9mZWF0dXJlCT0gV1NETCBMb2NhdGlvbg0KLV9VSV9JV2ViU2VydmljZVByb2plY3Rfd2ViU2VydmljZXNfZmVhdHVyZSA9IFdlYiBTZXJ2aWNlcw0KLV9VSV9JV2ViU2VydmljZVByb2plY3Rfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlc19mZWF0dXJlID0gU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzDQotX1VJX0lXZWJTZXJ2aWNlUHJvamVjdF9uYW1lX2ZlYXR1cmUgPSBOYW1lDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFVuc3BlY2lmaWVkDQotDQotX1VJX1dlYlNlcnZpY2VBbm5vdGF0aW9uQ2F0ZWdvcnkgPSBHZW5lcmFsIChXZWJTZXJ2aWNlIGFubm90YXRpb24pDQotX1VJX1dlYk1ldGhvZEFubm90YXRpb25DYXRlZ29yeSA9IEdlbmVyYWwgKFdlYk1ldGhvZCBhbm5vdGF0aW9uKQ0KLV9VSV9XZWJQYXJhbUFubm90YXRpb25DYXRlZ29yeSA9IEdlbmVyYWwgKFdlYlBhcmFtIGFubm90YXRpb24pDQotDQotX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfaW1wbGVtZW50YXRpb25fZmVhdHVyZSA9IEphdmEgcmVwcmVzZW50YXRpb24NCi1fVUlfSVdlYk1ldGhvZF90eXBlID0gV2ViIE1ldGhvZA0KLV9VSV9JV2ViUGFyYW1fdHlwZSA9IFdlYiBQYXJhbQ0KLV9VSV9JV2ViVHlwZV90eXBlID0gV2ViIFR5cGUNCi1fVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBOYW1lDQotX1VJX0lXZWJNZXRob2RfZXhjbHVkZWRfZmVhdHVyZSA9IEV4Y2x1ZGVkDQotX1VJX0lXZWJQYXJhbV9raW5kX2ZlYXR1cmUgPSBNb2RlDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfd2ViTWV0aG9kc19mZWF0dXJlID0gV2ViIE1ldGhvZHMNCi1fVUlfSVdlYk1ldGhvZF9wYXJhbWV0ZXJzX2ZlYXR1cmUgPSBQYXJhbWV0ZXJzDQotX1VJX0lXZWJQYXJhbV90eXBlTmFtZV9mZWF0dXJlID0gVHlwZSBOYW1lDQotX1VJX0lXZWJQYXJhbV9wYXJ0TmFtZV9mZWF0dXJlID0gUGFydCBOYW1lDQotX1VJX0lXZWJQYXJhbV90YXJnZXROYW1lc3BhY2VfZmVhdHVyZSA9IFRhcmdldCBOYW1lc3BhY2UNCi1fVUlfSVdlYlBhcmFtX2hlYWRlcl9mZWF0dXJlID0gSGVhZGVyDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmdTdHlsZV9mZWF0dXJlID0gU3R5bGUNCi1fVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZ1VzZV9mZWF0dXJlID0gVXNlDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZV9mZWF0dXJlID0gUGFyYW1ldGVyIFN0eWxlDQotX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdTdHlsZV9mZWF0dXJlID0gU3R5bGUNCi1fVUlfSVdlYk1ldGhvZF9zb2FwQmluZGluZ1VzZV9mZWF0dXJlID0gVXNlDQotX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZV9mZWF0dXJlID0gUGFyYW1ldGVyIFN0eWxlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjk0ZDY4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/Pg0KLQ0KLTwhLS0NCi0gICAgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAgIA0KLSAgICBDb250cmlidXRvcnM6DQotICAgICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gLS0+DQotDQotPHBsdWdpbj4NCi0NCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4NCi0gICAgICA8ZmFjdG9yeQ0KLSAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLkRvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ig0KLSAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzPQ0KLSAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyDQotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyDQotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyDQotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyDQotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLQ0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0RvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5MjM1NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0RvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb21BZGFwdGVyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuDQotICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uDQotICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4NCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRG9tQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsNCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7DQotDQotCS8qKg0KLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOw0KLQ0KLQkvKioNCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0JLyoqDQotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsNCi0JCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7DQotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7DQotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NfSBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSURPTUl0ZW1Qcm92aWRlciBpZG9tSXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSURPTUFkYXB0ZXIoKSB7DQotCQlpZiAoaWRvbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaWRvbUl0ZW1Qcm92aWRlciA9IG5ldyBJRE9NSXRlbVByb3ZpZGVyKHRoaXMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGlkb21JdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50fSBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlciBpSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSUphdmFXZWJTZXJ2aWNlRWxlbWVudEFkYXB0ZXIoKSB7DQotCQlpZiAoaUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlciA9IG5ldyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyKHRoaXMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGlKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlfSBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlciBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUFkYXB0ZXIoKSB7DQotCQlpZiAoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlciA9IG5ldyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyKHRoaXMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kfSBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZEl0ZW1Qcm92aWRlciBpV2ViTWV0aG9kSXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKSB7DQotCQlpZiAoaVdlYk1ldGhvZEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaVdlYk1ldGhvZEl0ZW1Qcm92aWRlciA9IG5ldyBJV2ViTWV0aG9kSXRlbVByb3ZpZGVyKHRoaXMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGlXZWJNZXRob2RJdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW19IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBJV2ViUGFyYW1JdGVtUHJvdmlkZXIgaVdlYlBhcmFtSXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCkgew0KLQkJaWYgKGlXZWJQYXJhbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaVdlYlBhcmFtSXRlbVByb3ZpZGVyID0gbmV3IElXZWJQYXJhbUl0ZW1Qcm92aWRlcih0aGlzKTsNCi0JCX0NCi0NCi0JCXJldHVybiBpV2ViUGFyYW1JdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZX0gaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyIGlXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2V9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCWlmIChpV2ViU2VydmljZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaVdlYlNlcnZpY2VJdGVtUHJvdmlkZXIgPSBuZXcgSVdlYlNlcnZpY2VJdGVtUHJvdmlkZXIodGhpcyk7DQotCQl9DQotDQotCQlyZXR1cm4gaVdlYlNlcnZpY2VJdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3R9IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIgaVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0fS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViU2VydmljZVByb2plY3RBZGFwdGVyKCkgew0KLQkJaWYgKGlXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyID0gbmV3IElXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlcih0aGlzKTsNCi0JCX0NCi0NCi0JCXJldHVybiBpV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZX0gaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJUeXBlSXRlbVByb3ZpZGVyIGlXZWJUeXBlSXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGV9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJUeXBlQWRhcHRlcigpIHsNCi0JCWlmIChpV2ViVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaVdlYlR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgSVdlYlR5cGVJdGVtUHJvdmlkZXIodGhpcyk7DQotCQl9DQotDQotCQlyZXR1cm4gaVdlYlR5cGVJdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7DQotCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7DQotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7DQotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgew0KLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsNCi0JCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzPD8+KXR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7DQotCQkJCXJldHVybiBhZGFwdGVyOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7DQotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7DQotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KLQ0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsNCi0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIA0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCWlmIChpZG9tSXRlbVByb3ZpZGVyICE9IG51bGwpIGlkb21JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KLQkJaWYgKGlKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgaUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQotCQlpZiAoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlciAhPSBudWxsKSBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCi0JCWlmIChpV2ViTWV0aG9kSXRlbVByb3ZpZGVyICE9IG51bGwpIGlXZWJNZXRob2RJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KLQkJaWYgKGlXZWJQYXJhbUl0ZW1Qcm92aWRlciAhPSBudWxsKSBpV2ViUGFyYW1JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KLQkJaWYgKGlXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyICE9IG51bGwpIGlXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCi0JCWlmIChpV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkgaVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCi0JCWlmIChpV2ViVHlwZUl0ZW1Qcm92aWRlciAhPSBudWxsKSBpV2ViVHlwZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lET01JdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JRE9NSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwZTFjZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lET01JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk7DQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NfSBvYmplY3QuDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElET01JdGVtUHJvdmlkZXINCi0JZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyDQotCWltcGxlbWVudHMJDQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJDQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJDQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCi0JLyoqDQotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJRE9NSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCi0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KLQ0KLQkJfQ0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKERvbVBhY2thZ2UuTGl0ZXJhbHMuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMpOw0KLQkJfQ0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7DQotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yDQotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuDQotDQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgSURPTS5naWYuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSURPTSIpKTsgIC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0lET01fdHlwZSIpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCi0NCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRE9NLmNsYXNzKSkgew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUzoNCi0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCi0NCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQotCQkJCShEb21QYWNrYWdlLkxpdGVyYWxzLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTLA0KLQkJCQkgRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCkpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQotCQlyZXR1cm4gRG9tVWkuSU5TVEFOQ0U7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lET01Qcm9wZXJ0eVZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSURPTVByb3BlcnR5VmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzg2MmIwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSURPTVByb3BlcnR5VmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIHByb3BlcnR5IHZhbHVlLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGlkZW50aWZ5IHByb3BlcnR5IHZhbHVlcyBmb3IgV1MgRE9NIG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSURPTVByb3BlcnR5VmFsdWUgZXh0ZW5kcyBJSXRlbVByb3BlcnR5U291cmNlDQotew0KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0ZGJiOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk7DQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLmltcGwuRE9NSXRlbVByb3BlcnR5UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50fSBvYmplY3QuDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXINCi0JZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyDQotCWltcGxlbWVudHMJDQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJDQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJDQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCi0JLyoqDQotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCi0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KLQ0KLQkJCWFkZEltcGxlbWVudGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQkJYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJfQ0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW1wbGVtZW50YXRpb24gZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBsZW1lbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF9pbXBsZW1lbnRhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF9pbXBsZW1lbnRhdGlvbl9mZWF0dXJlIiwgIl9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCSBudWxsLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKG5ldyBET01JdGVtUHJvcGVydHlQcm92aWRlcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF9uYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X25hbWVfZmVhdHVyZSIsICJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIGRlZmluZXMgYXQgd2hpY2ggY2F0ZWdvcnkgdGhlIG5hbWUgc2hvdWxkIGdvIHRvLiBFeHRlbmRlciBvZg0KLQkgKiB0aGlzIGNsYXNzIHNob3VsZCBvdmVycmlkZSBpdCBpZiB3YW50cyB0aGUgbmFtZSB0byBiZSBzZXBhcmF0ZWQgaW4gZGlmZmVyZW50IA0KLQkgKiB0aGFuIGRlZmF1bHQgY2F0ZWdvcnkuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUNhdGVnb3J5KCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50LmdpZi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9JSmF2YVdlYlNlcnZpY2VFbGVtZW50IikpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCi0JCVN0cmluZyBsYWJlbCA9ICgoSUphdmFXZWJTZXJ2aWNlRWxlbWVudClvYmplY3QpLmdldE5hbWUoKTsNCi0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KLQkJCWdldFN0cmluZygiX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJA0KLQkJCWdldFN0cmluZygiX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQotDQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcykpIHsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT046DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU6DQotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCi0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KLQkJcmV0dXJuIERvbVVpLklOU1RBTkNFOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmODhiYzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLmltcGwuRE9NSXRlbVByb3BlcnR5UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlfSBvYmplY3QuDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXINCi0JZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyDQotCWltcGxlbWVudHMJDQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJDQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJDQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCi0JLyoqDQotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSANCi0Jew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBudWxsOw0KLQkJDQotCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQotDQotCQlhZGRJbXBsaWNpdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkSW1wbGVtZW50aW5nV2ViU2VydmljZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFRhcmdldE5hbWVzcGFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkU29hcEJpbmRpbmdTdHlsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkU29hcEJpbmRpbmdVc2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCQ0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW1wbGljaXQgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBsaWNpdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9pbXBsaWNpdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9pbXBsaWNpdF9mZWF0dXJlIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwNCi0JCQkJIG51bGwsDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wbGVtZW50aW5nV2ViU2VydmljZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfaW1wbGVtZW50aW5nV2ViU2VydmljZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfaW1wbGVtZW50aW5nV2ViU2VydmljZXNfZmVhdHVyZSIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUywNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSB0cnVlLA0KLQkJCQkgbnVsbCwNCi0JCQkJIG51bGwsDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXJnZXQgTmFtZXNwYWNlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFyZ2V0TmFtZXNwYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShuZXcgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXINCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3RhcmdldE5hbWVzcGFjZV9mZWF0dXJlIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0TmFtZUNhdGVnb3J5KCksDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIEJpbmRpbmcgU3R5bGUgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwQmluZGluZ1N0eWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nU3R5bGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmdTdHlsZV9mZWF0dXJlIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEUsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvYXAgQmluZGluZyBVc2UgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwQmluZGluZ1VzZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZ1VzZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZ1VzZV9mZWF0dXJlIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZyIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVfZmVhdHVyZSIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmciKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUyk7DQotCQl9DQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsNCi0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3INCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4NCi0NCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdpZi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfU0VJKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQotCQlTdHJpbmcgbGFiZWwgPSAoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upb2JqZWN0KS5nZXROYW1lKCk7DQotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCi0JCQlnZXRTdHJpbmcoIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQNCi0JCQlsYWJlbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KLQ0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MpKSB7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQ6DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUzoNCi0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCi0NCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQotCQkJCShEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMsDQotCQkJCSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCkpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQotCQlyZXR1cm4gRG9tVWkuSU5TVEFOQ0U7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVDYXRlZ29yeSgpDQotCXsNCi0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlQW5ub3RhdGlvbkNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYk1ldGhvZEl0ZW1Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJNZXRob2RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzgwMDU0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYk1ldGhvZEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aTsNCi0NCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbi5Eb21VaTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZH0gb2JqZWN0Lg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJV2ViTWV0aG9kSXRlbVByb3ZpZGVyIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcg0KLQlpbXBsZW1lbnRzCQ0KLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQ0KLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQ0KLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVdlYk1ldGhvZEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgDQotCXsNCi0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyAhPSBudWxsKSB7DQotCQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQkJfQ0KLQkJDQotCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQotCQkNCi0JCWFkZEV4Y2x1ZGVkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQlhZGRTb2FwQmluZGluZ1N0eWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQlhZGRTb2FwQmluZGluZ1VzZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJDQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBsZW1lbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSANCi0Jew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKA0KLQkJCW5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKA0KLQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJCSBnZXRTdHJpbmcoIl9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X2ltcGxlbWVudGF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF9pbXBsZW1lbnRhdGlvbl9mZWF0dXJlIiwgIl9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLA0KLQkJCQkJIGZhbHNlLA0KLQkJCQkJIGZhbHNlLA0KLQkJCQkJIGZhbHNlLA0KLQkJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCi0JCQkJCSBudWxsLA0KLQkJCQkJIG51bGwpDQotCQkJew0KLQkJCQkNCi0JCQkJQE92ZXJyaWRlIA0KLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkNCi0JCQkJew0KLQkJCQkJU3RyaW5nIHJldHVyblN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkDQotCQkJCQlTdHJpbmcgcGFyYW1ldGVycyA9ICIiOyAvLyROT04tTkxTLTEkDQotCQkJCQlJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKWdldFRhcmdldCgpOw0KLQkJCQkJCQ0KLQkJCQkJZm9yKElXZWJQYXJhbSB3ZWJQYXJhbSA6IHdlYk1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkpDQotCQkJCQl7DQotCQkJCQkJaWYod2ViUGFyYW0uZ2V0TmFtZSgpLmVxdWFscygicmV0dXJuIikpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQl7DQotCQkJCQkJCXJldHVyblN0cmluZyA9IGdldFR5cGVOYW1lKHdlYlBhcmFtLmdldFR5cGVOYW1lKCkpICsgIiAiOyAvLyROT04tTkxTLTEkDQotCQkJCQkJfQ0KLQkJCQkJCWVsc2UNCi0JCQkJCQl7DQotCQkJCQkJCXBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzICsgZ2V0VHlwZU5hbWUod2ViUGFyYW0uZ2V0VHlwZU5hbWUoKSkgKyAiLCAiOyAvLyROT04tTkxTLTEkDQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJCQ0KLQkJCQkJaWYgKHBhcmFtZXRlcnMubGVuZ3RoKCkgPiAwKSB7DQotCQkJCQkJcGFyYW1ldGVycyA9IHBhcmFtZXRlcnMuc3Vic3RyaW5nKDAsIHBhcmFtZXRlcnMubGFzdEluZGV4T2YoJywnKSk7DQotCQkJCQl9DQotCQkJCQkNCi0JCQkJCVN0cmluZyBtZXRob2ROYW1lID0gd2ViTWV0aG9kLmdldEltcGxlbWVudGF0aW9uKCk7IA0KLQkJCQkJaW50IHBvcyA9IG1ldGhvZE5hbWUuaW5kZXhPZignKCcpOw0KLQkJCQkJaWYgKHBvcyA+IC0xKSB7DQotCQkJCQkJbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7DQotCQkJCQl9DQotCQkJCQkNCi0JCQkJCXJldHVybiByZXR1cm5TdHJpbmcgKyBtZXRob2ROYW1lICsgJygnICsgcGFyYW1ldGVycyArICcpJzsNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpDQotCQkJCXsNCi0JCQkJCXJldHVybiB0eXBlTmFtZS5zdWJzdHJpbmcodHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOw0KLQkJCQl9DQotCQkJfSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeGNsdWRlZCBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZEV4Y2x1ZGVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViTWV0aG9kX2V4Y2x1ZGVkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViTWV0aG9kX2V4Y2x1ZGVkX2ZlYXR1cmUiLCAiX1VJX0lXZWJNZXRob2RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fRVhDTFVERUQsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvYXAgQmluZGluZyBTdHlsZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFNvYXBCaW5kaW5nU3R5bGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdTdHlsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVdlYk1ldGhvZF9zb2FwQmluZGluZ1N0eWxlX2ZlYXR1cmUiLCAiX1VJX0lXZWJNZXRob2RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZyIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIEJpbmRpbmcgVXNlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkU29hcEJpbmRpbmdVc2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdVc2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdVc2VfZmVhdHVyZSIsICJfVUlfSVdlYk1ldGhvZF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZyIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYk1ldGhvZF9zb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViTWV0aG9kX3NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVfZmVhdHVyZSIsICJfVUlfSVdlYk1ldGhvZF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZyIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuDQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcg0KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsNCi0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsNCi0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7DQotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUyk7DQotCQl9DQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsNCi0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3INCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4NCi0NCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyBXZWJfTWV0aG9kLmdpZi4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBJbWFnZXMuSU5TVEFOQ0UuZ2V0SW1hZ2UoSW1hZ2VzLklNR19XRUJfTUVUSE9EKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCi0JCVN0cmluZyBsYWJlbCA9ICgoSVdlYk1ldGhvZClvYmplY3QpLmdldE5hbWUoKTsNCi0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KLQkJCWdldFN0cmluZygiX1VJX0lXZWJNZXRob2RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJA0KLQkJCWxhYmVsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQotDQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVdlYk1ldGhvZC5jbGFzcykpIHsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0VYQ0xVREVEOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUzoNCi0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCi0NCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQotCQkJCShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19QQVJBTUVURVJTLA0KLQkJCQkgRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlBhcmFtKCkpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQotCQlyZXR1cm4gRG9tVWkuSU5TVEFOQ0U7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUNhdGVnb3J5KCkNCi0Jew0KLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX1dlYk1ldGhvZEFubm90YXRpb25DYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkDQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViUGFyYW1JdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViUGFyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjA3NWJhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlBhcmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZS5Qcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwuaW1wbC5ET01JdGVtUHJvcGVydHlQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4uRG9tVWk7DQotDQotLyoqDQotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbX0gb2JqZWN0Lg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJV2ViUGFyYW1JdGVtUHJvdmlkZXINCi0JZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyDQotCWltcGxlbWVudHMJDQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJDQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJDQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCi0JDQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVdlYlBhcmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgIT0gbnVsbCkgew0KLQkJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCi0JCX0NCi0JCQ0KLQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KLQ0KLQkJYWRkS2luZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkVHlwZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQlhZGRUYXJnZXROYW1lc3BhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZEhlYWRlclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJDQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBLaW5kIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkS2luZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYlBhcmFtX2tpbmRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJQYXJhbV9raW5kX2ZlYXR1cmUiLCAiX1VJX0lXZWJQYXJhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX0tJTkQsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgTmFtZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yT2xkKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViUGFyYW1fdHlwZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJQYXJhbV90eXBlTmFtZV9mZWF0dXJlIiwgIl9VSV9JV2ViUGFyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UWVBFX05BTUUsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCSBudWxsLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoDQotCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCQlnZXRTdHJpbmcoIl9VSV9JV2ViUGFyYW1fdHlwZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJQYXJhbV90eXBlTmFtZV9mZWF0dXJlIiwgIl9VSV9JV2ViUGFyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkJRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UWVBFX05BTUUsDQotCQkJCQlmYWxzZSwNCi0JCQkJCWZhbHNlLA0KLQkJCQkJZmFsc2UsDQotCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCQludWxsLA0KLQkJCQkJbnVsbCkgDQotCQkJew0KLQkJCQlAT3ZlcnJpZGUNCi0JCQkJcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZShFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQkJCQl7DQotCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSBudWxsOw0KLQkJCQkJDQotCQkJCQlmaW5hbCBPYmplY3QgdHlwZVNpZ25hdHVyZSA9IHN1cGVyLmdldFZhbHVlKG9iamVjdCwgZmVhdHVyZSk7DQotCQkJCQlpZiAodHlwZVNpZ25hdHVyZSAhPSBudWxsKQ0KLQkJCQkJewkJCQkJCQ0KLQkJCQkJCXR5cGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKHR5cGVTaWduYXR1cmUudG9TdHJpbmcoKSk7CQkJCQkJDQotCQkJCQl9DQotCQkJCQkNCi0JCQkJCXJldHVybiB0eXBlTmFtZTsNCi0JCQkJfQ0KLQkJCX0pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFydCBOYW1lIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKG5ldyBET01JdGVtUHJvcGVydHlQcm92aWRlcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYlBhcmFtX3BhcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViUGFyYW1fcGFydE5hbWVfZmVhdHVyZSIsICJfVUlfSVdlYlBhcmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0TmFtZUNhdGVnb3J5KCksDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXJnZXQgTmFtZXNwYWNlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFyZ2V0TmFtZXNwYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWZpbmFsIElQcm9wZXJ0eVN0YXRlIHN0YXRlID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChvYmplY3QsIElQcm9wZXJ0eVN0YXRlLmNsYXNzKTsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShuZXcgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXINCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJQYXJhbV90YXJnZXROYW1lc3BhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJQYXJhbV90YXJnZXROYW1lc3BhY2VfZmVhdHVyZSIsICJfVUlfSVdlYlBhcmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSwNCi0JCQkJIChzdGF0ZT09bnVsbCkgPyBmYWxzZSA6IHN0YXRlLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCi0JCQkJIGdldE5hbWVDYXRlZ29yeSgpLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGVhZGVyIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGVhZGVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViUGFyYW1faGVhZGVyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViUGFyYW1faGVhZGVyX2ZlYXR1cmUiLCAiX1VJX0lXZWJQYXJhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX0hFQURFUiwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwNCi0JCQkJIGdldE5hbWVDYXRlZ29yeSgpLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgV2ViX1BhcmFtLmdpZi4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIA0KLQl7DQotCQlTdHJpbmcgaW1hZ2VOYW1lID0gSW1hZ2VzLklNR19XRUJfUEFSQU1fSU47DQotCQkNCi0JCWlmICgob2JqZWN0IGluc3RhbmNlb2YgSVdlYlBhcmFtKSAmJiAoKElXZWJQYXJhbSkgb2JqZWN0KS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscygicmV0dXJuIikpIC8vJE5PTi1OTFMtMSQNCi0JCXsgDQotCQkJaW1hZ2VOYW1lID0gSW1hZ2VzLklNR19XRUJfUEFSQU1fT1VUOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKGltYWdlTmFtZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSANCi0JewkNCi0JCXJldHVybiAoKElXZWJQYXJhbSlvYmplY3QpLmdldE5hbWUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KLQ0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElXZWJQYXJhbS5jbGFzcykpIHsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fS0lORDoNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0hFQURFUjoNCi0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQotCQlyZXR1cm4gRG9tVWkuSU5TVEFOQ0U7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVDYXRlZ29yeSgpDQotCXsNCi0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9XZWJQYXJhbUFubm90YXRpb25DYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkDQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViU2VydmljZUl0ZW1Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4OTQwODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwuaW1wbC5ET01JdGVtUHJvcGVydHlQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4uRG9tVWk7DQotDQotLyoqDQotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlfSBvYmplY3QuDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyDQotCWV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcg0KLQlpbXBsZW1lbnRzCQ0KLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQ0KLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQ0KLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVdlYlNlcnZpY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCi0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCi0JCQ0KLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzICE9IG51bGwpIHsNCi0JCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQotCQl9DQotDQotCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQotDQotCQlhZGRTZXJ2aWNlRW5kcG9pbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFRhcmdldE5hbWVzcGFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFdzZGxMb2NhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJCQ0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmljZSBFbmRwb2ludCBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VFbmRwb2ludFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYlNlcnZpY2Vfc2VydmljZUVuZHBvaW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViU2VydmljZV9zZXJ2aWNlRW5kcG9pbnRfZmVhdHVyZSIsICJfVUlfSVdlYlNlcnZpY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgdHJ1ZSwNCi0JCQkJIG51bGwsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRhcmdldCBOYW1lc3BhY2UgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYXJnZXROYW1lc3BhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKG5ldyBET01JdGVtUHJvcGVydHlQcm92aWRlcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYlNlcnZpY2VfdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViU2VydmljZV90YXJnZXROYW1lc3BhY2VfZmVhdHVyZSIsICJfVUlfSVdlYlNlcnZpY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcnQgTmFtZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFBvcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShuZXcgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXINCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJTZXJ2aWNlX3BvcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViU2VydmljZV9wb3J0TmFtZV9mZWF0dXJlIiwgIl9VSV9JV2ViU2VydmljZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0TmFtZUNhdGVnb3J5KCksDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIExvY2F0aW9uIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbExvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViU2VydmljZV93c2RsTG9jYXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJTZXJ2aWNlX3dzZGxMb2NhdGlvbl9mZWF0dXJlIiwgIl9VSV9JV2ViU2VydmljZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTiwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSwNCi0JCQkJIGdldE5hbWVDYXRlZ29yeSgpLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgSVdlYlNlcnZpY2UuZ2lmLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBJbWFnZXMuSU5TVEFOQ0UuZ2V0SW1hZ2UoSW1hZ2VzLklNR19XRUJfU0VSVklDRSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KLQkJU3RyaW5nIGxhYmVsID0gKChJV2ViU2VydmljZSlvYmplY3QpLmdldE5hbWUoKTsNCi0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KLQkJCWdldFN0cmluZygiX1VJX0lXZWJTZXJ2aWNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQNCi0JCQlsYWJlbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCi0JCQ0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElXZWJTZXJ2aWNlLmNsYXNzKSkgew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVDoNCi0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsNCi0JCXJldHVybiBEb21VaS5JTlNUQU5DRTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUNhdGVnb3J5KCkNCi0Jew0KLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VBbm5vdGF0aW9uQ2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTY4MWU3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3R9IG9iamVjdC4NCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyDQotCWV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcg0KLQlpbXBsZW1lbnRzCQ0KLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQ0KLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQ0KLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCi0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KLQ0KLQkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCX0NCi0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViU2VydmljZVByb2plY3RfbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVdlYlNlcnZpY2VQcm9qZWN0X25hbWVfZmVhdHVyZSIsICJfVUlfSVdlYlNlcnZpY2VQcm9qZWN0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UsDQotCQkJCSBudWxsLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUyk7DQotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTKTsNCi0JCX0NCi0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgew0KLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcg0KLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLg0KLQ0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIElXZWJTZXJ2aWNlUHJvamVjdC5naWYuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIEltYWdlcy5JTlNUQU5DRS5nZXRJbWFnZShJbWFnZXMuSU1HX0RPTV9XU19QUk9WSURFUikpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQotCQlTdHJpbmcgbGFiZWwgPSAoKElXZWJTZXJ2aWNlUHJvamVjdClvYmplY3QpLmdldE5hbWUoKTsNCi0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KLQkJCWdldFN0cmluZygiX1VJX0lXZWJTZXJ2aWNlUHJvamVjdF90eXBlIikgOiAvLyROT04tTkxTLTEkDQotCQkJZ2V0U3RyaW5nKCJfVUlfSVdlYlNlcnZpY2VQcm9qZWN0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KLQ0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElXZWJTZXJ2aWNlUHJvamVjdC5jbGFzcykpIHsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU6DQotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KLQ0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCi0JCQkJKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUywNCi0JCQkJIERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCkpKTsNCi0NCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQotCQkJCShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMsDQotCQkJCSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQotCQlyZXR1cm4gRG9tVWkuSU5TVEFOQ0U7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmFiMzViOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk7DQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbi5Eb21VaTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGV9IG9iamVjdC4NCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYlR5cGVJdGVtUHJvdmlkZXINCi0JZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyDQotCWltcGxlbWVudHMJDQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJDQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJDQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCi0JLyoqDQotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJV2ViVHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCi0NCi0JCX0NCi0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIElXZWJUeXBlLmdpZi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9JV2ViVHlwZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQotCQlTdHJpbmcgbGFiZWwgPSAoKElXZWJUeXBlKW9iamVjdCkuZ2V0TmFtZSgpOw0KLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQotCQkJZ2V0U3RyaW5nKCJfVUlfSVdlYlR5cGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJA0KLQkJCWdldFN0cmluZygiX1VJX0lXZWJUeXBlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCi0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KLQkJcmV0dXJuIERvbVVpLklOU1RBTkNFOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JbWFnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzc1YTkwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4uRG9tVWk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLQ0KLS8qKg0KLSAqIEltYWdlcyBidW5kbGUuIFVzZSB0aGlzIGNsYXNzIHdoZW4geW91IG5lZWQgdG8gbG9hZCBzb21lIGltYWdlLiANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEltYWdlcw0KLXsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZXMgSU5TVEFOQ0UgPSBuZXcgSW1hZ2VzKCk7DQotCQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0VCX01FVEhPRAkJPSAiV2ViTWV0aG9kIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0VCX1BBUkFNX0lOCQk9ICJXZWJQYXJhbUluIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0VCX1BBUkFNX09VVAk9ICJXZWJQYXJhbU91dCI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dFQl9TRVJWSUNFCQk9ICJXZWJTZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0VCX1NFUlZJQ0VfR1JPVVAgPSAiV2ViU2VydmljZUdyb3VwIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VJCQkJCT0gIlNFSSI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFSV9HUk9VUAkJPSAiU0VJR3JvdXAiOyAvLyROT04tTkxTLTEkDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ET01fV1NfUFJPVklERVIJPSAiRE9NV1NQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VSUk9SX01BUktFUgkJPSAiZXJyb3Jfb2JqIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0FSTklOR19NQVJLRVIJPSAid2FybmluZ19vYmoiOyAvLyROT04tTkxTLTEkDQotDQotICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGljb25zQnVuZGxlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IG1JbWFnZVJlZ2lzdHJ5Ow0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICovDQotICAgIHB1YmxpYyBJbWFnZXMoKSANCi0gICAgew0KLQkJdHJ5IHsNCi0JCQlpY29uc0J1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4uV1NJbWFnZUJ1bmRsZSIpOyAvLyROT04tTkxTLTEkDQotCQl9IA0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7DQotCQkJKG5ldyBMb2dnZXIoKSkubG9nRXJyb3IoIlVuYWJsZSB0byBsb2FkIGltYWdlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnaW4hIiwgeCk7IC8vJE5PTi1OTFMtMSQNCi0JCQlpY29uc0J1bmRsZSA9IG51bGw7DQotCQl9DQotCX0NCi0gICAgDQotICAgIA0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpIA0KLSAgICB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIG1JbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX1dFQl9TRVJWSUNFLCBnZXRJbWFnZVJlc291cmNlKGljb25zQnVuZGxlDQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJJTUdfV0VCX1NFUlZJQ0UiKSkpOyAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIG1JbWFnZVJlZ2lzdHJ5LnB1dChJTUdfV0VCX1NFUlZJQ0VfR1JPVVAsIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIklNR19XRUJfU0VSVklDRV9HUk9VUCIpKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX1NFSSwgZ2V0SW1hZ2VSZXNvdXJjZShpY29uc0J1bmRsZQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiSU1HX1NFSSIpKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX1NFSV9HUk9VUCwgZ2V0SW1hZ2VSZXNvdXJjZShpY29uc0J1bmRsZQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiSU1HX1NFSV9HUk9VUCIpKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX0RPTV9XU19QUk9WSURFUiwgZ2V0SW1hZ2VSZXNvdXJjZShpY29uc0J1bmRsZQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiSU1HX0RPTV9XU19QUk9WSURFUiIpKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX1dFQl9NRVRIT0QsIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIklNR19XRUJfTUVUSE9EIikpKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIG1JbWFnZVJlZ2lzdHJ5LnB1dChJTUdfV0VCX1BBUkFNX0lOLCBnZXRJbWFnZVJlc291cmNlKGljb25zQnVuZGxlDQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJJTUdfV0VCX1BBUkFNX0lOIikpKTsgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIG1JbWFnZVJlZ2lzdHJ5LnB1dChJTUdfV0VCX1BBUkFNX09VVCwgZ2V0SW1hZ2VSZXNvdXJjZShpY29uc0J1bmRsZQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiSU1HX1dFQl9QQVJBTV9PVVQiKSkpOyAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgbUltYWdlUmVnaXN0cnkucHV0KElNR19FUlJPUl9NQVJLRVIsIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIklNR19FUlJPUl9NQVJLRVIiKSkpOyAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIG1JbWFnZVJlZ2lzdHJ5LnB1dChJTUdfV0FSTklOR19NQVJLRVIsIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIklNR19XQVJOSU5HX01BUktFUiIpKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICANCi0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIChuZXcgTG9nZ2VyKCkpLmxvZ0Vycm9yKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBpbWFnZSByZWdpc3RyeSAhIiwgZSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIA0KLSAgICB7DQotICAgICAgICBpZiAobUltYWdlUmVnaXN0cnkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBtSW1hZ2VSZWdpc3RyeTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpbWFnZU5hbWUpIA0KLSAgICB7DQotICAgICAgICByZXR1cm4gSU5TVEFOQ0UuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChpbWFnZU5hbWUpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZVJlc291cmNlQnlLZXkoU3RyaW5nIHJlc291cmNlTmFtZSkgew0KLSAgICAgICAgcmV0dXJuIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUuZ2V0U3RyaW5nKHJlc291cmNlTmFtZSkpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZVJlc291cmNlKFN0cmluZyByZXNvdXJjZU5hbWUpIA0KLSAgICB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgCVVSTCB1cmwgPSBEb21VaS5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VOYW1lKTsNCi0gICAgICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsNCi0gICAgICAgIH0gDQotICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7DQotICAgICAgICAgICAgKG5ldyBMb2dnZXIoKSkubG9nRXJyb3IoTWVzc2FnZUZvcm1hdC5mb3JtYXQoIlVuYWJsZSB0byBsb2NhdGUgcmVzb3VyY2UgezB9ISIscmVzb3VyY2VOYW1lKSwgbnBlKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9pbXBsL0RPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvaW50ZXJuYWwvaW1wbC9ET01JdGVtUHJvcGVydHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmIzMjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9pbXBsL0RPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5Qcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZS5Qcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3Rvcnk7DQotDQotLyoqDQotICogRXh0ZW5kcyB7QGxpbmsgUHJvcGVydHlEZXNjcmlwdG9yfSB0byByZXByZXNlbnQgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgRE9NIG9iamVjdHMuIA0KLSAqIFRoaXMgY2xhc3Mgb3ZlcnJpZGVzIGNyZWF0ZVByb3BlcnR5VmFsdWVXcmFwcGVyIGZvcm0ge0BsaW5rIFByb3BlcnR5RGVzY3JpcHRvcn0gdG8gcHJvdmlkZQ0KLSAqIGN1c3RvbSBwcm9wZXJ0eSB3cmFwcGVyIGNsYXNzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIA0KLXsNCi0JcHVibGljIERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LA0KLQkJCQlSZXNvdXJjZUxvY2F0b3IgcmVzb3VyY2VMb2NhdG9yLCANCi0JCQkJU3RyaW5nIGRpc3BsYXlOYW1lLA0KLQkJCQlTdHJpbmcgZGVzY3JpcHRpb24sIA0KLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgDQotCQkJCWJvb2xlYW4gaXNTZXR0YWJsZSwNCi0JCQkJYm9vbGVhbiBtdWx0aUxpbmUsIA0KLQkJCQlib29sZWFuIHNvcnRDaG9pY2VzLCANCi0JCQkJT2JqZWN0IHN0YXRpY0ltYWdlLA0KLQkJCQlTdHJpbmcgY2F0ZWdvcnksIA0KLQkJCQlTdHJpbmdbXSBmaWx0ZXJGbGFncykgDQotCXsNCi0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCByZXNvdXJjZUxvY2F0b3IsIGRpc3BsYXlOYW1lLCBkZXNjcmlwdGlvbiwgZmVhdHVyZSwNCi0JCQkJaXNTZXR0YWJsZSwgbXVsdGlMaW5lLCBzb3J0Q2hvaWNlcywgc3RhdGljSW1hZ2UsIGNhdGVnb3J5LCBmaWx0ZXJGbGFncyk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlUHJvcGVydHlWYWx1ZVdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIA0KLQl7DQotCQlyZXR1cm4gbmV3IERPTVByb3BlcnR5VmFsdWUoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgcHJvcGVydHlWYWx1ZSwgbnVsbCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0KQ0KLQl7DQotCQlmaW5hbCBJUHJvcGVydHlTdGF0ZSBzdGF0ZSA9IChJUHJvcGVydHlTdGF0ZSlQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQob2JqZWN0LCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlpZiAoc3RhdGUgIT0gbnVsbCkgew0KLQkJCXN1cGVyLmlzU2V0dGFibGUgPSBzdGF0ZS5pc0NoYW5nZWFibGUoZmVhdHVyZSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBzdXBlci5jYW5TZXRQcm9wZXJ0eShvYmplY3QpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG9iamVjdCkNCi0Jew0KLQkJZmluYWwgSVByb3BlcnR5RGVmYXVsdHMgZGVmYXVsdHMgPSAoSVByb3BlcnR5RGVmYXVsdHMpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KG9iamVjdCwgSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MpOw0KLQkJaWYgKGRlZmF1bHRzICE9IG51bGwpIHsNCi0JCQlmaW5hbCBPYmplY3QgZGVmYXVsdFZhbHVlID0gZGVmYXVsdHMuZ2V0RGVmYXVsdChmZWF0dXJlKTsNCi0JCQkoKEVPYmplY3Qpb2JqZWN0KS5lU2V0KGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSk7DQotCQl9IA0KLQkJZWxzZSB7DQotCQkJc3VwZXIucmVzZXRQcm9wZXJ0eVZhbHVlKG9iamVjdCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL2ltcGwvRE9NUHJvcGVydHlWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL2ltcGwvRE9NUHJvcGVydHlWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNGM1MjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9pbXBsL0RPTVByb3BlcnR5VmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5JRE9NUHJvcGVydHlWYWx1ZTsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRvciBvZiB7QGxpbmsgSURPTVByb3BlcnR5VmFsdWV9Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRE9NUHJvcGVydHlWYWx1ZSBleHRlbmRzIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUHJvcGVydHlWYWx1ZVdyYXBwZXIgaW1wbGVtZW50cyBJRE9NUHJvcGVydHlWYWx1ZSANCi17DQotCXB1YmxpYyBET01Qcm9wZXJ0eVZhbHVlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3Qgb2JqZWN0LCBPYmplY3QgcHJvcGVydHlWYWx1ZSwgT2JqZWN0IG5lc3RlZFByb3BlcnR5U291cmMpIA0KLQl7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBwcm9wZXJ0eVZhbHVlLCBuZXN0ZWRQcm9wZXJ0eVNvdXJjKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKSB7DQotCQlyZXR1cm4gZ2V0RWRpdGFibGVWYWx1ZShudWxsKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvaW50ZXJuYWwvcGx1Z2luL0RvbVVpLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvaW50ZXJuYWwvcGx1Z2luL0RvbVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5YTU3NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL3BsdWdpbi9Eb21VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW47DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgRG9tIGVkaXQgcGx1Z2luLg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEb21VaSBleHRlbmRzIEVNRlBsdWdpbg0KLXsNCi0JLyoqDQotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG9tVWkgSU5TVEFOQ0UgPSBuZXcgRG9tVWkoKTsNCi0NCi0JLyoqDQotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRG9tVWkoKQ0KLQl7DQotCQlzdXBlcg0KLQkJICAobmV3IFJlc291cmNlTG9jYXRvciBbXSANCi0JCSAgIHsNCi0JCSAgIH0pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKQ0KLQl7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpDQotCXsNCi0JCXJldHVybiBwbHVnaW47DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luDQotCXsNCi0JCS8qKg0KLQkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJcHVibGljIEltcGxlbWVudGF0aW9uKCkNCi0JCXsNCi0JCQlzdXBlcigpOw0KLQ0KLQkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuDQotCQkJLy8NCi0JCQlwbHVnaW4gPSB0aGlzOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgUGx1Z2luIGdldERlZmF1bHQoKQ0KLQl7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9wbHVnaW4vV1NJbWFnZUJ1bmRsZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL3BsdWdpbi9XU0ltYWdlQnVuZGxlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0YWFmMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL3BsdWdpbi9XU0ltYWdlQnVuZGxlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotSU1HX1dFQl9TRVJWSUNFPWljb25zL1dlYl9TZXJ2aWNlLmdpZg0KLUlNR19XRUJfU0VSVklDRV9HUk9VUD1pY29ucy9XZWJfU2VydmljZV9Hcm91cC5naWYNCi1JTUdfU0VJPWljb25zL1NFSS5naWYNCi1JTUdfU0VJX0dST1VQPWljb25zL1NFSV9Hcm91cC5naWYNCi1JTUdfRE9NX1dTX1BST1ZJREVSPWljb25zL1dlYl9TZXJ2aWNlX0l0ZW1fUHJvdmlkZXIuZ2lmDQotSU1HX1dFQl9NRVRIT0Q9aWNvbnMvV2ViX01ldGhvZC5naWYNCi1JTUdfV0VCX1BBUkFNX0lOPWljb25zL1dlYl9QYXJhbV9Jbi5naWYNCi1JTUdfV0VCX1BBUkFNX09VVD1pY29ucy9XZWJfUGFyYW1fT3V0LmdpZg0KLUlNR19FUlJPUl9NQVJLRVI9aWNvbnMvZXJyb3Jfb2JqLmdpZg0KLUlNR19XQVJOSU5HX01BUktFUj1pY29ucy93YXJuaW5nX29iai5naWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1YTBmZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNmVlYmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1RodSBEZWMgMTggMTE6MDA6MjYgR01UIDIwMDgNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmN2E2NjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotSW1wb3J0LVBhY2thZ2U6IGphdmF4Lmp3cywKLSBqYXZheC5qd3Muc29hcCwKLSBqYXZheC54bWwud3M7dmVyc2lvbj0iMi4xLjAiLAotIGphdmF4LnhtbC53cy5odHRwO3ZlcnNpb249IjIuMS4wIiwKLSBqYXZheC54bWwud3Muc29hcDt2ZXJzaW9uPSIyLjEuMCIsCi0gb3JnLmpkb207dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5qZG9tLmlucHV0O3ZlcnNpb249IjEuMC4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZhMDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDRlNjMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIGljb25zLyxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9lbGNsMTYvZmlsdGVyX3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL2VsY2wxNi9maWx0ZXJfcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGM5ZTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL2VsY2wxNi9maWx0ZXJfcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvZXRvb2wxNi9uZXdoYW5kbGVyX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9ldG9vbDE2L25ld2hhbmRsZXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjNTY3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9ldG9vbDE2L25ld2hhbmRsZXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL2V2aWV3MTYvYW5ub3RhdGlvbl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvZXZpZXcxNi9hbm5vdGF0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzNWQ2MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvZXZpZXcxNi9hbm5vdGF0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9ldmlldzE2L3Byb3BfcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvZXZpZXcxNi9wcm9wX3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExYzk5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9ldmlldzE2L3Byb3BfcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvYmluZGluZ19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvYmluZGluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTZlMmYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L2JpbmRpbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L2ZhbHNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L2ZhbHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkOWIwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi9mYWxzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi9odHRwYmluZGluZ19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvaHR0cGJpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyOGVmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi9odHRwYmluZGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvc29hcGJpbmRpbmdfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L3NvYXBiaW5kaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWY2YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvc29hcGJpbmRpbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L3RydWUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvdHJ1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWNiOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvdHJ1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy93aXpiYW4vbmV3X3dpei5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy93aXpiYW4vbmV3X3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNDEwZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvd2l6YmFuL25ld193aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2YWQ2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jcHJvcGVydGllcyBmaWxlIGZvciBKQVhXUyBVSQ0KLXBsdWdpbk5hbWU9SkFYLVdTIFRvb2xzIFVJDQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0NCi0NCi1BTk5PVEFUSU9OU19WSUVXX0NBVEVHT1JZX05BTUU9SkFYLVdTDQotQU5OT1RBVElPTlNfVklFV19OQU1FPUFubm90YXRpb24gUHJvcGVydGllcw0KLQ0KLSNKQVgtV1MgSGFuZGxlciBXaXphcmQNCi1KQVhXU19XSVpBUkRfQ0FURUdPUllfTkFNRT1KQVgtV1MNCi1ORVdfSkFYV1NfSEFORExFUl9MQUJFTD1KQVgtV1MgSGFuZGxlcg0KLU5FV19KQVhXU19IQU5ETEVSX19ERVNDUklQVElPTj1DcmVhdGUgYSBKQVgtV1MgSGFuZGxlcg0KLQ0KLUNPTkZJR1VSRV9IQU5ETEVSU19MQUJFTD1Db25maWd1cmUgSGFuZGxlcnMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2QzZWNiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/Pg0KLTxwbHVnaW4+DQotDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPg0KLSAgICAgIDxjYXRlZ29yeQ0KLSAgICAgICAgICAgIG5hbWU9IiVBTk5PVEFUSU9OU19WSUVXX0NBVEVHT1JZX05BTUUiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qd3N0LnVpIj4NCi0gICAgICA8L2NhdGVnb3J5Pg0KLSAgICAgIDx2aWV3DQotICAgICAgICAgICAgbmFtZT0iJUFOTk9UQVRJT05TX1ZJRVdfTkFNRSINCi0gICAgICAgICAgICBpY29uPSJpY29ucy9ldmlldzE2L3Byb3BfcHMuZ2lmIg0KLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MuandzdC51aSINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLnZpZXdzLkFubm90YXRpb25zVmlldyINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLnZpZXdzLkFubm90YXRpb25zVmlldyI+DQotICAgICAgPC92aWV3Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLSA8IS0tICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMiPg0KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuamR0LnVpLkphdmFQZXJzcGVjdGl2ZSI+DQotICAgICAgICAgPHZpZXcNCi0gICAgICAgICAgICAgICByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciDQotICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPSJzdGFjayINCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLnZpZXdzLkFubm90YXRpb25zVmlldyI+DQotICAgICAgICAgPC92aWV3Pg0KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+DQotICAgPC9leHRlbnNpb24+IC0tPg0KLQ0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplciI+DQotICAgICAgPGluaXRpYWxpemVyDQotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5XZWJTZXJ2aWNlQXR0cmlidXRlSW5pdGlhbGl6ZXIiPg0KLSAgICAgIDwvaW5pdGlhbGl6ZXI+DQotICAgICAgPGluaXRpYWxpemVyDQotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYk1ldGhvZCINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uLldlYk1ldGhvZEF0dHJpYnV0ZUluaXRpYWxpemVyIj4NCi0gICAgICA8L2luaXRpYWxpemVyPg0KLSAgICAgIDxpbml0aWFsaXplcg0KLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJQYXJhbSINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uLldlYlBhcmFtQXR0cmlidXRlSW5pdGlhbGl6ZXIiPg0KLSAgICAgIDwvaW5pdGlhbGl6ZXI+DQotICAgICAgPGluaXRpYWxpemVyDQotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlJlc3VsdCINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uLldlYlJlc3VsdEF0dHJpYnV0ZUluaXRpYWxpemVyIj4NCi0gICAgICA8L2luaXRpYWxpemVyPg0KLSAgICAgIDxpbml0aWFsaXplcg0KLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuaW5pdGlhbGl6YXRpb24uU09BUEJpbmRpbmdBdHRyaWJ1dGVJbml0aWFsaXplciI+DQotICAgICAgPC9pbml0aWFsaXplcj4gICAgICANCi0gICAgICA8aW5pdGlhbGl6ZXINCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXIiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5SZXF1ZXN0V3JhcHBlckF0dHJpYnV0ZUluaXRpYWxpemVyIj4NCi0gICAgICA8L2luaXRpYWxpemVyPg0KLSAgICAgIDxpbml0aWFsaXplcg0KLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXIiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5SZXNwb25zZVdyYXBwZXJBdHRyaWJ1dGVJbml0aWFsaXplciI+DQotICAgICAgPC9pbml0aWFsaXplcj4NCi0gICAgICA8aW5pdGlhbGl6ZXINCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC54bWwud3MuQmluZGluZ1R5cGUiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5CaW5kaW5nVHlwZUF0dHJpYnV0ZUluaXRpYWxpemVyIj4NCi0gICAgICA8L2luaXRpYWxpemVyPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgDQotICAgPGV4dGVuc2lvbiBpZD0iamF4d3NQcm9wb3NhbENvbXB1dGVyIg0KLSAgICAgICAgIG5hbWU9IkpBWC1XUyBQcm9wb3NhbHMiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5qYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiPg0KLSAgICAgIDxwcm9wb3NhbENhdGVnb3J5DQotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXZpZXcxNi9hbm5vdGF0aW9uX29iai5naWYiPg0KLSAgICAgIDwvcHJvcG9zYWxDYXRlZ29yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi0gICA8ZXh0ZW5zaW9uIGlkPSJKQVhXU0phdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciI+DQotICAgICAgPGphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcg0KLSAgICAgICAgICAgIGFjdGl2YXRlPSJ0cnVlIg0KLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS5qYXh3c1Byb3Bvc2FsQ29tcHV0ZXIiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb250ZW50YXNzaXN0LkFubm90YXRpb25Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciI+DQotICAgICAgICAgPHBhcnRpdGlvbg0KLSAgICAgICAgICAgICAgIHR5cGU9Il9fZGZ0bF9wYXJ0aXRpb25fY29udGVudF90eXBlIj4NCi0gICAgICAgICA8L3BhcnRpdGlvbj4NCi0gICAgICAgICA8cGFydGl0aW9uDQotICAgICAgICAgICAgICAgdHlwZT0iX19qYXZhX3N0cmluZyI+DQotICAgICAgICAgPC9wYXJ0aXRpb24+DQotICAgICAgPC9qYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI+DQotICAgPC9leHRlbnNpb24+DQotDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLnF1aWNrRml4UHJvY2Vzc29ycyI+DQotICAgICAgPHF1aWNrRml4UHJvY2Vzc29yDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uLkpBWFdTUXVpY2tGaXhQcm9jZXNzb3IiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uLkpBWFdTUXVpY2tGaXhQcm9jZXNzb3IiPg0KLSAgICAgICAgIDxoYW5kbGVkTWFya2VyVHlwZXM+DQotICAgICAgICAgICAgPG1hcmtlclR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5jb21waWxlLnByb2JsZW0iLz4NCi0gICAgICAgICAgICA8bWFya2VyVHlwZSBpZD0ib3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLm5vbnJlY29uY2lsZS5jb21waWxlLnByb2JsZW0iLz4NCi0gICAgICAgICA8L2hhbmRsZWRNYXJrZXJUeXBlcz4NCi0gICAgICA8L3F1aWNrRml4UHJvY2Vzc29yPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLQ0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uIj4NCi0gICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcg0KLSAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5jb21waWxlLnByb2JsZW0iDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uLkFQVENvbXBpbGVQcm9ibGVtTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciI+DQotICAgICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPg0KLSAgICAgIDxtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yDQotICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLm5vbnJlY29uY2lsZS5jb21waWxlLnByb2JsZW0iDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uLkFQVENvbXBpbGVQcm9ibGVtTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciI+DQotICAgICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPg0KLSAgICAgIDx3aXphcmQNCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkud2l6YXJkcy5jYXRlZ29yeSINCi0gICAgICAgICAgICBpY29uPSIkbmwkL2ljb25zL2V0b29sMTYvbmV3aGFuZGxlcl93aXouZ2lmIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkud2l6YXJkcy5OZXdKQVhXU0hhbmRsZXJXaXphcmQiDQotICAgICAgICAgICAgbmFtZT0iJU5FV19KQVhXU19IQU5ETEVSX0xBQkVMIj4NCi0gICAgICAgICA8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS53aXphcmRzLk5ld0pBWFdTSGFuZGxlcldpemFyZCI+DQotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJqYXZhdHlwZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICA8L2NsYXNzPg0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAlTkVXX0pBWFdTX0hBTkRMRVJfX0RFU0NSSVBUSU9ODQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8L3dpemFyZD4NCi0gICAgICA8Y2F0ZWdvcnkNCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLndpemFyZHMuY2F0ZWdvcnkiDQotICAgICAgICAgICAgbmFtZT0iJUpBWFdTX1dJWkFSRF9DQVRFR09SWV9OQU1FIg0KLSAgICAgICAgICAgIHBhcmVudENhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3Ij4NCi0gICAgICA8L2NhdGVnb3J5Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4NCi0gICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciNQb3B1cE1lbnU/YWZ0ZXI9YWRkaXRpb25zIj4NCi0gICAgICAgICA8Y29tbWFuZA0KLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLmNvbmZpZ3VyZS5oYW5kbGVycyINCi0gICAgICAgICAgICBpZD0iamF4d3MuY29uZmlndXJlLmhhbmRsZXJzIg0KLSAgICAgICAgICAgIGxhYmVsPSIlQ09ORklHVVJFX0hBTkRMRVJTX0xBQkVMIg0KLSAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4NCi0gICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJ0cnVlIi8+DQotICAgICAgICAgPC9jb21tYW5kPg0KLSAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICANCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+DQotICAgICAgPGNvbW1hbmQNCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLmNvbmZpZ3VyZS5oYW5kbGVycyINCi0gICAgICAgICAgICBuYW1lPSIlQ09ORklHVVJFX0hBTkRMRVJTX0xBQkVMIj4NCi0gICAgICA8L2NvbW1hbmQ+DQotICAgPC9leHRlbnNpb24+DQotICAgDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPg0KLSAgICAgIDxoYW5kbGVyDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5oYW5kbGVycy5Db25maWd1cmVIYW5kbGVyQ2hhaW5IYW5kbGVyIg0KLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLmNvbmZpZ3VyZS5oYW5kbGVycyI+DQotICAgICAgICAgPGFjdGl2ZVdoZW4+DQotICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy53ZWJzZXJ2aWNlLnNlbGVjdGVkIi8+DQotICAgICAgICAgPC9hY3RpdmVXaGVuPg0KLSAgICAgICAgIDxlbmFibGVkV2hlbj4NCi0gICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLndlYnNlcnZpY2Uuc2VsZWN0ZWQiLz4NCi0gICAgICAgICA8L2VuYWJsZWRXaGVuPg0KLSAgICAgIDwvaGFuZGxlcj4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4NCi0gICAgICA8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLndlYnNlcnZpY2Uuc2VsZWN0ZWQiPg0KLSAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPg0KLSAgICAgICAgICAgIDxhbmQ+DQotICAgICAgICAgICAgICAgPGNvdW50IHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICAgPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4NCi0gICAgICAgICAgICAgICAgICA8b3I+DQotICAgICAgICAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UiLz4NCi0gICAgICAgICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+DQotICAgICAgICAgICAgICAgICAgPC9vcj4NCi0gICAgICAgICAgICAgICA8L2l0ZXJhdGU+DQotICAgICAgICAgICAgPC9hbmQ+DQotICAgICAgICAgPC93aXRoPg0KLSAgICAgIDwvZGVmaW5pdGlvbj4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICANCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9KQVhXU1VJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA2NzYyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSkFYV1NVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQUREX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQlJPV1NFX0xBQkVMMDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0JST1dTRV9MQUJFTDE7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9CUk9XU0VfTEFCRUwyOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQlJPV1NFX0xBQkVMMzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0JST1dTRV9MQUJFTDQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9CUk9XU0VfTEFCRUw1OwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfRE9XTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0VESVRfQVJSQVlfVkFMVUVTX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfUkVNT1ZFX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfU0VMRUNUX0NMQVNTX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9ORVNURURfQVJSQVlTX05PVF9TVVBQT1JURUQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0VESVRJTkdfU1VQUE9SVF9OT1RfVkFMSURfTUVTU0FHRV9QUkVGSVg7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OU19WSUVXX0FOTk9UQVRJT05TX0NPTFVNTl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1ZJRVdfQU5OT1RBVElPTlNfTk9UX0FWQUlMQUJMRV9PTl9TRUxFQ1RJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfVklFV19BTk5PVEFUSU9OU19WQUxVRVNfQ09MVU1OX05BTUU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OU19WSUVXX0ZJTFRFUl9BQ1RJT05fTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OU19WSUVXX0ZJTFRFUl9BQ1RJT05fU0VMRUNUX0NBVEVHT1JJRVNfTUVTU0FHRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1ZJRVdfTk9fU1VJVEFCTEVfTElCUkFSWV9GT1VORDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OU19WSUVXX09USEVSX0FOTk9UQVRJT05fTElCUkFSSUVTX1VTRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTkZJR1VSRV9KQVZBXzFfNl9MSUJSQVJZOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0FOTk9UQVRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX01JU1NJTkdfTUVUSE9EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9VTklNUExFTUVOVEVEX01FVEhPRFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ0hBTkdFX01FVEhPRF9WSVNJQklMSVRZOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENIQU5HRV9NRVRIT0RfUkVUVVJOX1RZUEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1JFQVRFX0NPTlNUUlVDVE9SOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRV9BTk5PVEFUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRV9NRVRIT0Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX0ZJTkFMX01PRElGSUVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRV9JTExFR0FMX01PRElGSUVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRV9TVEFUSUNfTU9ESUZJRVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX01FTUJFUlZBTFVFUEFJUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVkVfQUxMX09USEVSX01FTUJFUlZBTFVFUEFJUlM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX1dJWkFSRF9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX1dJWkFSRF9QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfV0laQVJEX1BBR0VfREVTQ1JJUFRJT047Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19BRERfSEFORExFUl9XSVpBUkRfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19BRERfSEFORExFUl9XSVpBUkRfUEFHRV9ERVNDUklQVElPTjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX09SREVSX0hBTkRMRVJfV0laQVJEX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfT1JERVJfSEFORExFUl9XSVpBUkRfUEFHRV9ERVNDUklQVElPTjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0NPTkZJR1VSRV9IQU5ETEVSX1dJWkFSRF9USVRMRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQUREOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfUkVNT1ZFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9NT1ZFX1VQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfTU9WRV9ET1dOOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9OQU1FX0NPTFVNTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NMQVNTX0NPTFVNTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX1RZUEVfQ09MVU1OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfTE9HSUNBTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19QUk9UT0NPTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfVFlQRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19MT0dJQ0FMX0hBTkRMRVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfU09BUF9IQU5ETEVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQUREOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0VESVQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NIT09TRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQVNTT0NJQVRFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9XRUJfU0VSVklDRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRklMRV9QQVRIMTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRklMRV9QQVRIMjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRklMRV9QQVRIMzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQlJPV1NFMTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQlJPV1NFMjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQlJPV1NFMzsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0ZJTEVfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19FTlRFUl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0NIT09TRV9GT0xERVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfSU5WQUxJRF9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0ZJTEVfRVhJU1RTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0ZJTEVfUFJPSkVDVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19FTVBUWV9GSUxFX05BTUU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVF9ESUFMT0dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0VESVRfRElBTE9HX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUX0RJQUxPR19JTlZBTElEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUX0ZJTEVfTk9UX0ZPVU5EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUX0ZJTEVfTk9UX0ZPVU5EX0lOX1BST0pFQ1Q7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fV1NfRElBTE9HX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9XU19ESUFMT0dfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dTX0RJQUxPR19JTlZBTElEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9XU19OT1RfRk9VTkQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fSEFORExFUl9ESUFMT0dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0hBTkRMRVJfRElBTE9HX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9IQU5ETEVSX0RJQUxPR19JTlZBTElEOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX05FV19IQU5ETEVSX1BBVEhfRU1UUFk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0VYSVNUSU5HX0hBTkRMRVJfUEFUSF9FTVRQWTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fV1NfUEFUSF9FTVRQWTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfRVhURU5EX0lNUExFTUVOVF9IQU5ETEVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfTElCUkFSWV9DTEFTU1BBVEg7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKQVhXU1VJTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgSkFYV1NVSU1lc3NhZ2VzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvSkFYV1NVSU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTNmOGM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvSkFYV1NVSU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0FERF9MQUJFTD0mQWRkCi1BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0JST1dTRV9MQUJFTDA9JkJyb3dzZS4uLgotQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9CUk9XU0VfTEFCRUwxPUImcm93c2UuLi4KLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQlJPV1NFX0xBQkVMMj1CciZvd3NlLi4uCi1BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0JST1dTRV9MQUJFTDM9QnJvJndzZS4uLgotQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9CUk9XU0VfTEFCRUw0PUJyb3cmc2UuLi4KLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQlJPV1NFX0xBQkVMNT1Ccm93cyZlLi4uCi1BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0RPV05fTEFCRUw9JkRvd24KLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfRURJVF9BUlJBWV9WQUxVRVNfVElUTEU9RWRpdCBBcnJheSBWYWx1ZXMKLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfUkVNT1ZFX0xBQkVMPVJlJm1vdmUKLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfU0VMRUNUX0NMQVNTX1RJVExFPVNlbGVjdCBDbGFzcwotQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9VUF9MQUJFTD0mVXAKLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfTkVTVEVEX0FSUkFZU19OT1RfU1VQUE9SVEVEPU5lc3RlZCBBcnJheXMgd2l0aGluIEFycmF5cyBub3QgeWV0IHN1cHBvcnRlZAotQU5OT1RBVElPTl9FRElUSU5HX1NVUFBPUlRfTk9UX1ZBTElEX01FU1NBR0VfUFJFRklYPU5vdCBhIHZhbGlkIAotCi1BTk5PVEFUSU9OU19WSUVXX0FOTk9UQVRJT05TX05PVF9BVkFJTEFCTEVfT05fU0VMRUNUSU9OPUFubm90YXRpb25zIG5vdCBhdmFpbGFibGUgZm9yIGN1cnJlbnQgc2VsZWN0aW9uCi1BTk5PVEFUSU9OU19WSUVXX0FOTk9UQVRJT05TX1ZBTFVFU19DT0xVTU5fTkFNRT1WYWx1ZXMKLUFOTk9UQVRJT05TX1ZJRVdfQU5OT1RBVElPTlNfQ09MVU1OX05BTUU9QW5ub3RhdGlvbnMKLQotQU5OT1RBVElPTlNfVklFV19GSUxURVJfQUNUSU9OX05BTUU9RmlsdGVycy4uLgotQU5OT1RBVElPTlNfVklFV19GSUxURVJfQUNUSU9OX1NFTEVDVF9DQVRFR09SSUVTX01FU1NBR0U9U2VsZWN0IEFubm90YXRpb24gQ2F0ZWdvcmllcyB0byBGaWx0ZXIKLQotQU5OT1RBVElPTlNfVklFV19OT19TVUlUQUJMRV9MSUJSQVJZX0ZPVU5EPU5vIHN1aXRhYmxlIHswfSBsaWJyYXJ5IGNhbiBiZSBmb3VuZCBvbiB0aGUgcHJvamVjdHMgY2xhc3NwYXRoLlxuXG4KLQotQU5OT1RBVElPTlNfVklFV19PVEhFUl9BTk5PVEFUSU9OX0xJQlJBUklFU19VU0U9XG4oRm9yIHVzZSB3aXRoIG5vbiBKQVgtV1MgbGlicmFyaWVzIHBsZWFzZSBzZXR1cCB0aGUgcHJvamVjdCB3aXRoIHRoZSByZXF1aXJlZCBsaWJyYXJpZXMuKVxuXG4KLQotSkFYV1NfSEFORExFUl9XSVpBUkRfVElUTEU9TmV3IEpBWC1XUyBIYW5kbGVyCi1KQVhXU19IQU5ETEVSX1dJWkFSRF9QQUdFX1RJVExFPUpBWC1XUyBIYW5kbGVyCi1KQVhXU19IQU5ETEVSX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OPUNyZWF0ZSBhIG5ldyBKQVgtV1MgSGFuZGxlci4KLQotSkFYV1NfQUREX0hBTkRMRVJfV0laQVJEX1BBR0VfVElUTEU9Q29uZmlndXJlIEhhbmRsZXIgQ2hhaW4KLUpBWFdTX0FERF9IQU5ETEVSX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OPUNyZWF0ZSBvciBzZWxlY3QgYSBoYW5kbGVyIGNoYWluIGZpbGUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHdlYiBzZXJ2aWNlLgotCi1KQVhXU19PUkRFUl9IQU5ETEVSX1dJWkFSRF9QQUdFX1RJVExFPUNvbmZpZ3VyZSBIYW5kbGVyIENoYWluCi1KQVhXU19PUkRFUl9IQU5ETEVSX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OPUNvbmZpZ3VyZSB0aGUgcG9zaXRpb24gb2YgdGhlIGhhbmRsZXJzIGluIHRoZSBoYW5kbGVyIGNoYWluIGZpbGUuCi0KLUpBWFdTX0NPTkZJR1VSRV9IQU5ETEVSX1dJWkFSRF9USVRMRT1Db25maWd1cmUgSkFYLVdTIEhhbmRsZXIgQ2hhaW4KLQotSkFYV1NfSEFORExFUl9BREQ9JkFkZC4uLgotSkFYV1NfSEFORExFUl9SRU1PVkU9JlJlbW92ZS4uLgotSkFYV1NfSEFORExFUl9NT1ZFX1VQPU1vdmUgJlVwCi1KQVhXU19IQU5ETEVSX01PVkVfRE9XTj1Nb3ZlICZEb3duCi0KLUpBWFdTX0hBTkRMRVJfTkFNRV9DT0xVTU49TmFtZQotSkFYV1NfSEFORExFUl9DTEFTU19DT0xVTU49Q2xhc3MKLUpBWFdTX0hBTkRMRVJfVFlQRV9DT0xVTU49VHlwZQotCi1KQVhXU19MT0dJQ0FMPUxvZ2ljYWwKLUpBWFdTX1BST1RPQ09MPVByb3RvY29sCi0KLUpBWFdTX0hBTkRMRVJfVFlQRT0mSGFuZGxlciB0eXBlOgotSkFYV1NfTE9HSUNBTF9IQU5ETEVSPUxvZ2ljYWwgSGFuZGxlcgotSkFYV1NfU09BUF9IQU5ETEVSPVByb3RvY29sIEhhbmRsZXIgKFNPQVApCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT049Q29uZmlndXJhdGlvbgotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0FERD0mQWRkIHRoaXMgaGFuZGxlciB0byBhIGhhbmRsZXIgY2hhaW4KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEU9Q3JlYXRlIGEgbmV3IGhhbmRsZXIgY2hhaW4gJmZpbGUKLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUPUFkZCB0aGlzIGhhbmRsZXIgdG8gYW4gZSZ4aXN0aW5nIGhhbmRsZXIgY2hhaW4gZmlsZQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NIT09TRT1DaG9vc2UgYW4gZSZ4aXN0aW5nIGhhbmRsZXIgY2hhaW4gZmlsZQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0FTU09DSUFURT1Bc3NvY2lhdGUgdGhpcyBoYSZuZGxlciBjaGFpbiB3aXRoIGEgd2ViIHNlcnZpY2UKLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9XRUJfU0VSVklDRT1XZWIgU2VydmljZToKLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9GSUxFX1BBVEgxPUYmaWxlIHBhdGg6Ci1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRklMRV9QQVRIMj1GaWxlJiBwYXRoOgotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0ZJTEVfUEFUSDM9RmlsZSAmcGF0aDoKLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9CUk9XU0UxPSZCcm93c2UuLi4KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9CUk9XU0UyPUImcm93c2UuLi4KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9CUk9XU0UzPUJyb3dzZSYuLi4KLQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfVElUTEU9SGFuZGxlciBDaGFpbiBDcmVhdGlvbgotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfREVTQ1JJUFRJT049U2VsZWN0IHRoZSBwYXJlbnQgZm9sZGVyOgotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9OQU1FPUZpbGUgbmFtZToKLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0VOVEVSX05BTUU9SGFuZGxlciBjaGFpbiBmaWxlIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfQ0hPT1NFX0ZPTERFUj1DaG9vc2UgcGFyZW50IGZvbGRlci4KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0lOVkFMSURfTkFNRT1JbnZhbGlkIGhhbmRsZXIgY2hhaW4gZmlsZSBuYW1lLgotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9FWElTVFM9VGhlIHswfSBmaWxlIGFscmVhZHkgZXhpc3RzLgotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9QUk9KRUNUPVRoZSBoYW5kbGVyIGNoYWluIGZpbGUgbXVzdCByZXNpZGUgd2l0aGluIGEgc291cmNlIGZvbGRlciBpbiB0aGUgezB9IHByb2plY3QuCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19FTVBUWV9GSUxFX05BTUU9SGFuZGxlciBjaGFpbiBmaWxlIG5hbWUgY2Fubm90IGJlIGVtcHR5Ci0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUX0RJQUxPR19USVRMRT1IYW5kbGVyIENoYWluIFNlbGVjdGlvbgotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0VESVRfRElBTE9HX0RFU0NSSVBUSU9OPUNob29zZSBhIGhhbmRsZXIgY2hhaW46Ci1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVF9ESUFMT0dfSU5WQUxJRD1Ob3QgYSB2YWxpZCBoYW5kbGVyIGNoYWluIGZpbGUuCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVF9GSUxFX05PVF9GT1VORD1DYW5ub3QgZmluZCB0aGUgezB9IGhhbmRsZXIgY2hhaW4gZmlsZS4KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUX0ZJTEVfTk9UX0ZPVU5EX0lOX1BST0pFQ1Q9Q2Fubm90IGZpbmQgdGhlIHswfSBoYW5kbGVyIGNoYWluIGZpbGUgaW4gdGhlIHsxfSBwcm9qZWN0LgotCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fV1NfRElBTE9HX1RJVExFPVdlYiBTZXJ2aWNlIFNlbGVjdGlvbgotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dTX0RJQUxPR19ERVNDUklQVElPTj1DaG9vc2UgYSB3ZWIgc2VydmljZToKLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9XU19ESUFMT0dfSU5WQUxJRD1Ob3QgYSBXZWIgU2VydmljZS4KLQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0hBTkRMRVJfRElBTE9HX1RJVExFPUhhbmRsZXIgU2VsZWN0aW9uCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fSEFORExFUl9ESUFMT0dfREVTQ1JJUFRJT049Q2hvb3NlIGEgbG9naWNhbCBvciBzb2FwIGhhbmRsZXI6Ci1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fSEFORExFUl9ESUFMT0dfSU5WQUxJRD1Ob3QgYSBsb2dpY2FsIG9yIHNvYXAgaGFuZGxlci4KLQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX05FV19IQU5ETEVSX1BBVEhfRU1UUFk9TmV3IGhhbmRsZXIgY2hhaW4gcGF0aCBpcyBlbXB0eS4KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FWElTVElOR19IQU5ETEVSX1BBVEhfRU1UUFk9RXhpc2l0bmcgaGFuZGxlciBjaGFpbiBwYXRoIGlzIGVtcHR5LgotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dTX1BBVEhfRU1UUFk9V2ViIHNlcnZpY2UgcGF0aCBpcyBlbXB0eS4KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9XU19OT1RfRk9VTkQ9V2ViIHNlcnZpY2UgY2Fubm90IGJlIGZvdW5kLgotCi1KQVhXU19IQU5ETEVSX0VYVEVORF9JTVBMRU1FTlRfSEFORExFUj1UaGUgaGFuZGxlciBjbGFzcyBtdXN0IGltcGxlbWVudCBvciBleHRlbmQgZnJvbSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBMb2dpY2FsSGFuZGxlciBvciBTT0FQSGFuZGxlci4KLUpBWFdTX0hBTkRMRVJfTElCUkFSWV9DTEFTU1BBVEg9QSBKQVgtV1MgbGlicmFyeSBjYW5ub3QgYmUgZm91bmQgb24gdGhlIHByb2plY3RzIGNsYXNzcGF0aC4KLQotQ09ORklHVVJFX0pBVkFfMV82X0xJQlJBUlk9VG8gc2VsZWN0IGEgMS42IG9yIGFib3ZlIGNvbXBsaWFudCBKUkUgY29uZmlndXJlIHRoZSA8YSBocmVmPSIxIiA+SW5zdGFsbGVkIEpSRXM8L2E+IG9yIGNoYW5nZSB0aGUgSlJFIG9uIHRoZSA8YSBocmVmPSIyIiA+SmF2YSBidWlsZCBwYXRoPC9hPi4KLQotQUREX0FOTk9UQVRJT049QWRkIGFubm90YXRpb24gJydAezB9JycKLUFERF9NSVNTSU5HX01FVEhPRD1BZGQgbWlzc2luZyBtZXRob2QKLUFERF9VTklNUExFTUVOVEVEX01FVEhPRFM9QWRkIHVuaW1wbGVtZW50ZWQgbWV0aG9kcwotQ0hBTkdFX01FVEhPRF9WSVNJQklMSVRZPUNoYW5nZSBtZXRob2QgdmlzaWJpbGl0eSB0byAnJ3swfScnCi1DSEFOR0VfTUVUSE9EX1JFVFVSTl9UWVBFPUNoYW5nZSBtZXRob2QgcmV0dXJuIHR5cGUgdG8gbWF0Y2ggU0VJIG1ldGhvZCByZXR1cm4gdHlwZQotQ1JFQVRFX0NPTlNUUlVDVE9SPUNyZWF0ZSBjb25zdHJ1Y3RvciAnJ3swfSgpJycKLVJFTU9WRV9BTk5PVEFUSU9OPVJlbW92ZSBhbm5vdGF0aW9uICcnQHswfScnCi1SRU1PVkVfTUVUSE9EPVJlbW92ZSBtZXRob2QgJyd7MH0nJwotUkVNT1ZFX0ZJTkFMX01PRElGSUVSPVJlbW92ZSAnJ2ZpbmFsJycgbW9kaWZpZXIgb2YgJyd7MH0nJyguLikKLVJFTU9WRV9JTExFR0FMX01PRElGSUVSPVJlbW92ZSBJbGxlZ2FsIG1vZGlmaWVyCi1SRU1PVkVfU1RBVElDX01PRElGSUVSPVJlbW92ZSAnJ3N0YXRpYycnIG1vZGlmaWVyIG9mICcnezB9JycoLi4pCi1SRU1PVkVfTUVNQkVSVkFMVUVQQUlSPVJlbW92ZSBtZW1iZXIgdmFsdWUgcGFpciAnJ3swfScnCi1SRU1PVkVfQUxMX09USEVSX01FTUJFUlZBTFVFUEFJUlM9UmVtb3ZlIGFsbCBvdGhlciBtZW1iZXIgdmFsdWUgcGFpcnMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvSkFYV1NVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9KQVhXU1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjNjFkYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9KQVhXU1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhXU1VJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7DQotDQotCS8vIFRoZSBwbHVnLWluIElEDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkiOyAvLyROT04tTkxTLTEkDQotDQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JcHJpdmF0ZSBzdGF0aWMgSkFYV1NVSVBsdWdpbiBwbHVnaW47DQotCQ0KLQkvKioNCi0JICogVGhlIGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgSkFYV1NVSVBsdWdpbigpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7DQotCQlwbHVnaW4gPSB0aGlzOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJcGx1Z2luID0gbnVsbDsNCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSkFYV1NVSVBsdWdpbiBnZXREZWZhdWx0KCkgew0KLQkJcmV0dXJuIHBsdWdpbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4NCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoDQotCSAqDQotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoDQotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3INCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgew0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBwYXRoKTsNCi0JfQ0KLQkNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgew0KLSAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7DQotICAgICAgICBKQVhXU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsNCi0gICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsIA0KLSAgICAgICAgCQlleGNlcHRpb24udG9TdHJpbmcoKSwgZXhjZXB0aW9uKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hY3Rpb25zL0Fubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hY3Rpb25zL0Fubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjhmMzM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYWN0aW9ucy9Bbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkudmlld3MuQW5ub3RhdGlvbnNWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS52aWV3cy5Bbm5vdGF0aW9uc1ZpZXdDYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNWaWV3RmlsdGVyQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLSAgICBwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyOwotICAgIHByaXZhdGUgQW5ub3RhdGlvbnNWaWV3Q2F0ZWdvcnlGaWx0ZXIgY2F0ZWdvcnlGaWx0ZXI7Ci0gICAgCi0gICAgcHVibGljIEFubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbihBbm5vdGF0aW9uc1ZpZXcgYW5ub3RhdGlvbnNWaWV3LCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgc3VwZXIodGV4dCk7Ci0gICAgICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICAgICAgICB0aGlzLnNldEltYWdlRGVzY3JpcHRvcihKQVhXU1VJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZWxjbDE2L2ZpbHRlcl9wcy5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY2F0ZWdvcnlGaWx0ZXIgPSBuZXcgQW5ub3RhdGlvbnNWaWV3Q2F0ZWdvcnlGaWx0ZXIoYW5ub3RhdGlvbnNWaWV3LCB2aWV3ZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgTGlzdFNlbGVjdGlvbkRpYWxvZyBsaXN0U2VsZWN0aW9uRGlhbG9nID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2codmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uQ2F0ZWdvcmllcygpLCBuZXcgQW5ub3RhdGlvbnNDYXRlZ29yeURpYWxvZ0NvbnRlbnRQcm92aWRlcigpLAotICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uc0NhdGVnb3J5RGlhbG9nTGFiZWxQcm92aWRlcigpLCAKLSAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTlNfVklFV19GSUxURVJfQUNUSU9OX1NFTEVDVF9DQVRFR09SSUVTX01FU1NBR0UpOwotICAgICAgICAKLSAgICAgICAgbGlzdFNlbGVjdGlvbkRpYWxvZy5zZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMoY2F0ZWdvcnlGaWx0ZXIuZ2V0Q2F0ZWdvcmllcygpKTsKLSAgICAgICAgCi0gICAgICAgIGludCByZXR1cm5WYWx1ZSA9IGxpc3RTZWxlY3Rpb25EaWFsb2cub3BlbigpOwotICAgICAgICBpZiAocmV0dXJuVmFsdWUgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBsaXN0U2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpOwotICAgICAgICAgICAgY2F0ZWdvcnlGaWx0ZXIuZmlsdGVyQW5ub3RhdGlvbnMoQXJyYXlzLmFzTGlzdChyZXN1bHQpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbml0KElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgY2F0ZWdvcnlGaWx0ZXIuaW5pdChtZW1lbnRvKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgY2F0ZWdvcnlGaWx0ZXIuc2F2ZVN0YXRlKG1lbWVudG8pOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uc0NhdGVnb3J5RGlhbG9nQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKExpc3Q8U3RyaW5nPilpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFubm90YXRpb25zQ2F0ZWdvcnlEaWFsb2dMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvbnRlbnRhc3Npc3QvQW5ub3RhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvbnRlbnRhc3Npc3QvQW5ub3RhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2M2Y1MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb250ZW50YXNzaXN0L0Fubm90YXRpb25Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvbnRlbnRhc3Npc3Q7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5Db250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5KYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgaW1wbGVtZW50cyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIHsNCi0NCi0gICAgcHVibGljIEFubm90YXRpb25Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotICAgIHB1YmxpYyBMaXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0gICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCkgew0KLSAgICAgICAgICAgIHJldHVybiBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscygoSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCkgY29udGV4dCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgew0KLSAgICAgICAgQ29tcGxldGlvbkNvbnRleHQgY29tcGxldGlvbkNvbnRleHQgPSBjb250ZXh0LmdldENvcmVDb250ZXh0KCk7DQotICAgICAgICBpbnQgdG9rZW5TdGFydCA9IGNvbXBsZXRpb25Db250ZXh0LmdldE9mZnNldCgpOw0KLQ0KLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSBjb250ZXh0LmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBzb3VyY2UuZ2V0RWxlbWVudEF0KHRva2VuU3RhcnQpOw0KLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHN3aXRjaChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7DQotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT046DQotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFFbGVtZW50LlRZUEU6DQotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFFbGVtZW50LkZJRUxEOg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JKYXZhRWxlbWVudChBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbnMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFFbGVtZW50KSwgamF2YUVsZW1lbnQsIHRva2VuU3RhcnQpOw0KLSAgICAgICAgICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6DQotICAgICAgICAgICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gQW5ub3RhdGlvblV0aWxzLmdldExvY2FsVmFyaWFibGUoKElNZXRob2QpIGphdmFFbGVtZW50LCB0b2tlblN0YXJ0KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFZhcmlhYmxlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvckphdmFFbGVtZW50KEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9ucygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsVmFyaWFibGUpLCBsb2NhbFZhcmlhYmxlLCB0b2tlblN0YXJ0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0gIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9ySmF2YUVsZW1lbnQoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25zKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YUVsZW1lbnQpLCBqYXZhRWxlbWVudCwgdG9rZW5TdGFydCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7DQotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvckphdmFFbGVtZW50KExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMsDQotICAgICAgICAgICAgSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBpbnQgb2Zmc2V0KSB7DQotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7DQotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7DQotICAgICAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uOw0KLSAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gZ2V0TWVtYmVyVmFsdWVQYWlyRm9yUG9zaXRpb24obm9ybWFsQW5ub3RhdGlvbiwgb2Zmc2V0KTsNCi0gICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvckphdmFFbGVtZW50KG5vcm1hbEFubm90YXRpb24sIG1lbWJlclZhbHVlUGFpciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YUVsZW1lbnQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgew0KLSAgICAgICAgICAgICAgICBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIHNpbmdsZU1lbWJlckFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYW5ub3RhdGlvbjsNCi0gICAgICAgICAgICAgICAgaWYgKGlzV2l0aGluU2luZ2xlTWVtYmVyQW5ub3RhdGlvblZhbHVlKHNpbmdsZU1lbWJlckFubm90YXRpb24sIG9mZnNldCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9ySmF2YUVsZW1lbnQoc2luZ2xlTWVtYmVyQW5ub3RhdGlvbiwgamF2YUVsZW1lbnQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9ySmF2YUVsZW1lbnQoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLA0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgew0KLSAgICAgICAgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgPSBBbm5vdGF0aW9uc01hbmFnZXINCi0gICAgICAgIC5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXJGb3JOYW1lKGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKSk7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIoamF2YUVsZW1lbnQsDQotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9ySmF2YUVsZW1lbnQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLA0KLSAgICAgICAgICAgIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgew0KLSAgICAgICAgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgPSBBbm5vdGF0aW9uc01hbmFnZXINCi0gICAgICAgIC5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXJGb3JOYW1lKGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKSk7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGphdmFFbGVtZW50LA0KLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQotICAgIH0NCi0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotICAgIHByaXZhdGUgTWVtYmVyVmFsdWVQYWlyIGdldE1lbWJlclZhbHVlUGFpckZvclBvc2l0aW9uKE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiwgaW50IG9mZnNldCkgew0KLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBub3JtYWxBbm5vdGF0aW9uLnZhbHVlcygpOw0KLSAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgew0KLSAgICAgICAgICAgIEV4cHJlc3Npb24gdmFsdWUgPSBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICBpbnQgdmFsdWVTdGFydFBvc2l0aW9uID0gdmFsdWUuZ2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICAgICAgICAgIGludCB2YWx1ZUxlbmd0aCA9IHZhbHVlLmdldExlbmd0aCgpOw0KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gdmFsdWVTdGFydFBvc2l0aW9uDQotICAgICAgICAgICAgICAgICAgICAmJiBvZmZzZXQgPD0gdmFsdWVTdGFydFBvc2l0aW9uICsgdmFsdWVMZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpcjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNXaXRoaW5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uVmFsdWUoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uLCBpbnQgb2Zmc2V0KSB7DQotICAgICAgICBFeHByZXNzaW9uIHZhbHVlID0gc2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpOw0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpbnQgdmFsdWVTdGFydFBvc2l0aW9uID0gdmFsdWUuZ2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICAgICAgICAgIGludCB2YWx1ZUxlbmd0aCA9IHZhbHVlLmdldExlbmd0aCgpOw0KLSAgICAgICAgICAgIHJldHVybiAob2Zmc2V0ID49IHZhbHVlU3RhcnRQb3NpdGlvbiAmJiBvZmZzZXQgPD0gdmFsdWVTdGFydFBvc2l0aW9uICsgdmFsdWVMZW5ndGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLSAgICBwdWJsaWMgTGlzdCBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKENvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNlc3Npb25FbmRlZCgpIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXNzaW9uU3RhcnRlZCgpIHsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQVBUQ29tcGlsZVByb2JsZW1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQVBUQ29tcGlsZVByb2JsZW1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzlkNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0FQVENvbXBpbGVQcm9ibGVtTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLnV0aWwuRWNsaXBzZU1lc3NhZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db3JyZWN0aW9uRW5naW5lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxNYXJrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5jb3JyZWN0aW9uLkFzc2lzdENvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmNvcnJlY3Rpb24uSmF2YUNvcnJlY3Rpb25Qcm9jZXNzb3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmNvcnJlY3Rpb24uUHJvYmxlbUxvY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5jb3JyZWN0aW9uLkNvcnJlY3Rpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLkNvcnJlY3Rpb25NYXJrZXJSZXNvbHV0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLkNvbXBsZXRpb25Qcm9wb3NhbENvbXBhcmF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUludm9jYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhQ29tcGxldGlvblByb3Bvc2FsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklQcm9ibGVtTG9jYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcjI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0Ow0KLQ0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpDQotcHVibGljIGNsYXNzIEFQVENvbXBpbGVQcm9ibGVtTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yMiB7DQotDQotCXByaXZhdGUgZmluYWwgc3RhdGljIElNYXJrZXJSZXNvbHV0aW9uW10gTk9fUkVTT0xVVElPTlMgPSBuZXcgSU1hcmtlclJlc29sdXRpb25bMF07DQotDQotCXB1YmxpYyBib29sZWFuIGhhc1Jlc29sdXRpb25zKElNYXJrZXIgbWFya2VyKSB7DQotCQlpbnQgaWQgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElKYXZhTW9kZWxNYXJrZXIuSUQsIC0xKTsNCi0gICAgICAgIGlmIChpZCA9PSBFY2xpcHNlTWVzc2FnZXIuQVBUX1FVSUNLX0ZJWF9QUk9CTEVNX0lEKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgew0KLQkJaWYgKCFoYXNSZXNvbHV0aW9ucyhtYXJrZXIpKSB7DQotCQkJcmV0dXJuIE5PX1JFU09MVVRJT05TOw0KLQkJfQ0KLQkJDQotCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdChtYXJrZXIpOw0KLQkJDQotCQlpZiAoY29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHsNCi0JCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KChJRmlsZSkgY29tcGlsYXRpb25Vbml0LmdldFJlc291cmNlKCkpOw0KLQkJCWlmIChlZGl0b3JJbnB1dCAhPSBudWxsKSB7DQotCQkJCUlQcm9ibGVtTG9jYXRpb24gcHJvYmxlbUxvY2F0aW9uID0gY3JlYXRlUHJvYmxlbUxvY2F0aW9uKG1hcmtlcik7DQotCQkJCWlmIChwcm9ibGVtTG9jYXRpb24gIT0gbnVsbCkgew0KLQkJCQkJSUludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0ID0gbmV3IEFzc2lzdENvbnRleHQoY29tcGlsYXRpb25Vbml0LA0KLQkJCQkJCQlwcm9ibGVtTG9jYXRpb24uZ2V0T2Zmc2V0KCksIHByb2JsZW1Mb2NhdGlvbi5nZXRMZW5ndGgoKSk7DQotCQkJCQkNCi0JCQkJCUxpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXBsZXRpb25Qcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPigpOw0KLQkJCQkJDQotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb3JyZWN0aW9uUHJvY2Vzc29yLmNvbGxlY3RDb3JyZWN0aW9ucyhpbnZvY2F0aW9uQ29udGV4dCwgDQotCQkJCQkJCW5ldyBJUHJvYmxlbUxvY2F0aW9uW10geyBwcm9ibGVtTG9jYXRpb24gfSwgY29tcGxldGlvblByb3Bvc2Fscyk7DQotICAgICAgICAgICAgICAgICAgICANCi0JCQkJCWlmIChzdGF0dXMuaXNPSygpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChjb21wbGV0aW9uUHJvcG9zYWxzLCBuZXcgQ29tcGxldGlvblByb3Bvc2FsQ29tcGFyYXRvcigpKTsNCi0NCi0gICAgCQkJCQlJTWFya2VyUmVzb2x1dGlvbltdIG1hcmtlclJlc29sdXRpb25zID0gbmV3IElNYXJrZXJSZXNvbHV0aW9uW2NvbXBsZXRpb25Qcm9wb3NhbHMuc2l6ZSgpXTsNCi0gICAgCQkJCQlmb3IgKGludCBpPSAwOyBpIDwgY29tcGxldGlvblByb3Bvc2Fscy5zaXplKCk7IGkrKykgew0KLSAgICAJCQkJCQltYXJrZXJSZXNvbHV0aW9uc1tpXSA9IG5ldyBDb3JyZWN0aW9uTWFya2VyUmVzb2x1dGlvbihjb21waWxhdGlvblVuaXQsIA0KLSAgICAJCQkJCQkJCXByb2JsZW1Mb2NhdGlvbi5nZXRPZmZzZXQoKSwgcHJvYmxlbUxvY2F0aW9uLmdldExlbmd0aCgpLCANCi0gICAgCQkJCQkJCQljb21wbGV0aW9uUHJvcG9zYWxzLmdldChpKSwgbWFya2VyKTsNCi0gICAgCQkJCQl9DQotICAgIAkJCQkJcmV0dXJuIG1hcmtlclJlc29sdXRpb25zOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIE5PX1JFU09MVVRJT05TOw0KLQl9DQotDQotCXByaXZhdGUgSVByb2JsZW1Mb2NhdGlvbiBjcmVhdGVQcm9ibGVtTG9jYXRpb24oSU1hcmtlciBtYXJrZXIpIHsNCi0JCXRyeSB7DQotCQkJaW50IGlkID0gbWFya2VyLmdldEF0dHJpYnV0ZShJSmF2YU1vZGVsTWFya2VyLklELCAtMSk7DQotCQkJaW50IG9mZnNldCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJULCAtMSk7DQotCQkJaW50IGVuZCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgLTEpOw0KLQkJCWludCBzZXZlcml0eSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9JTkZPKTsNCi0JCQlTdHJpbmdbXSBhcmd1bWVudHMgPSBDb3JyZWN0aW9uRW5naW5lLmdldFByb2JsZW1Bcmd1bWVudHMobWFya2VyKTsNCi0JCQlTdHJpbmcgbWFya2VyVHlwZSA9IG1hcmtlci5nZXRUeXBlKCk7DQotCQkJaWYgKGlkICE9IC0xICYmIG9mZnNldCAhPSAtMSAmJiBlbmQgIT0gLTEgJiYgYXJndW1lbnRzICE9IG51bGwpIHsNCi0JCQkJaW50IGxlbmd0aCA9IGVuZCAtIG9mZnNldDsNCi0JCQkJYm9vbGVhbiBpc0Vycm9yID0gKHNldmVyaXR5ID09IElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOw0KLQkJCQlyZXR1cm4gbmV3IFByb2JsZW1Mb2NhdGlvbihvZmZzZXQsIGxlbmd0aCwgaWQsIGFyZ3VtZW50cywgaXNFcnJvciwgbWFya2VyVHlwZSk7DQotCQkJfQ0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgew0KLQkJCUpBWFdTVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoSU1hcmtlciBtYXJrZXIpIHsNCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG1hcmtlci5nZXRSZXNvdXJjZSgpOw0KLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsNCi0gICAgICAgICAgICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUoKElGaWxlKSByZXNvdXJjZSk7DQotCQkJaWYgKGphdmFFbGVtZW50ICE9IG51bGwgJiYgamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7DQotCQkJCXJldHVybiAoSUNvbXBpbGF0aW9uVW5pdCkgamF2YUVsZW1lbnQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0Fic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0Fic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTYyMzhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9BYnN0cmFjdEphdmFDb3JyZWN0aW9uUHJvcHNvYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLklVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFDb3JyZWN0aW9uUHJvcHNvYWwgaW1wbGVtZW50cyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0KLSAgICBwcml2YXRlIGludCByZWxldmFuY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheVN0cmluZzsKLSAgICBwcml2YXRlIEltYWdlIGltYWdlOwotICAgIHByaXZhdGUgVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZTsKLQotICAgIHByb3RlY3RlZCBJSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQ7Ci0gICAgCi0gICAgcHVibGljIEFic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbChJSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQsIFN0cmluZyBkaXNwbGF5U3RyaW5nLCBpbnQgcmVsZXZhbmNlLCBJbWFnZSBpbWFnZSkgewotICAgICAgICB0aGlzLmludm9jYXRpb25Db250ZXh0ID0gaW52b2NhdGlvbkNvbnRleHQ7Ci0gICAgICAgIHRoaXMuZGlzcGxheVN0cmluZyA9IGRpc3BsYXlTdHJpbmc7Ci0gICAgICAgIHRoaXMucmVsZXZhbmNlID0gcmVsZXZhbmNlOwotICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0UmVsZXZhbmNlKCkgewotICAgICAgICByZXR1cm4gcmVsZXZhbmNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRFZGl0cyhUZXh0RmlsZUNoYW5nZSB0ZXh0Q2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLSAgICAKLSAgICBwcml2YXRlIFRleHRGaWxlQ2hhbmdlIGdldFRleHRDaGFuZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0ZXh0Q2hhbmdlID09IG51bGwpIHsKLSAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgICAgICB0ZXh0Q2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKGdldERpc3BsYXlTdHJpbmcoKSwgKElGaWxlKSBjb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgICAgICB0ZXh0Q2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0gICAgICAgICAgICB0ZXh0Q2hhbmdlLnNldEtlZXBQcmV2aWV3RWRpdHModHJ1ZSk7Ci0gICAgICAgICAgICB0ZXh0Q2hhbmdlLnNldFNhdmVNb2RlKFRleHRGaWxlQ2hhbmdlLkxFQVZFX0RJUlRZKTsKLSAgICAgICAgICAgIGFkZEVkaXRzKHRleHRDaGFuZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXh0Q2hhbmdlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhcHBseShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLSAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgSVVuZG9NYW5hZ2VyIG1hbmFnZXI9IFJlZmFjdG9yaW5nQ29yZS5nZXRVbmRvTWFuYWdlcigpOwotICAgICAgICBib29sZWFuIHN1Y2Nlc3NmdWwgPSBmYWxzZTsKLSAgICAgICAgQ2hhbmdlIHVuZG9DaGFuZ2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGV4dENoYW5nZSA9IGdldFRleHRDaGFuZ2UoKTsKLSAgICAgICAgICAgIHRleHRDaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotICAgICAgICAgICAgUmVmYWN0b3JpbmdTdGF0dXMgdmFsaWQgPSB0ZXh0Q2hhbmdlLmlzVmFsaWQobW9uaXRvcik7Ci0gICAgICAgICAgICBpZiAodmFsaWQuaXNPSygpKSB7Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5hYm91dFRvUGVyZm9ybUNoYW5nZSh0ZXh0Q2hhbmdlKTsKLSAgICAgICAgICAgICAgICB1bmRvQ2hhbmdlID0gdGV4dENoYW5nZS5wZXJmb3JtKG1vbml0b3IpOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtYW5hZ2VyLmNoYW5nZVBlcmZvcm1lZCh0ZXh0Q2hhbmdlLCBzdWNjZXNzZnVsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodW5kb0NoYW5nZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1bmRvQ2hhbmdlLmluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShtb25pdG9yKTsKLSAgICAgICAgICAgIG1hbmFnZXIuYWRkVW5kbyh1bmRvQ2hhbmdlLmdldE5hbWUoKSwgdW5kb0NoYW5nZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgcHVibGljIElDb250ZXh0SW5mb3JtYXRpb24gZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBkaXNwbGF5U3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGltYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0FkZEFubm90YXRpb25Ub1R5cGVDb3JyZWN0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9BZGRBbm5vdGF0aW9uVG9UeXBlQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTFhOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0FkZEFubm90YXRpb25Ub1R5cGVDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5JbXBvcnRSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5Db2RlU3R5bGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBbm5vdGF0aW9uVG9UeXBlQ29ycmVjdGlvblByb3Bvc2FsIGV4dGVuZHMgQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsIHsKLQotICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzczsKLSAgICAKLSAgICBwdWJsaWMgQWRkQW5ub3RhdGlvblRvVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzLCBTdHJpbmcgZGlzcGxheVN0cmluZywgaW50IHJlbGV2YW5jZSwgSW1hZ2UgaW1hZ2UpIHsKLSAgICAgICAgc3VwZXIoaW52b2NhdGlvbkNvbnRleHQsIGRpc3BsYXlTdHJpbmcsIHJlbGV2YW5jZSwgaW1hZ2UpOwotICAgICAgICB0aGlzLmFubm90YXRpb25DbGFzcyA9IGFubm90YXRpb25DbGFzczsKLSAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEVkaXRzKFRleHRGaWxlQ2hhbmdlIHRleHRDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0QVNUUm9vdCgpOwotICAgICAgICAKLSAgICAgICAgQVNUIGFzdCA9IGFzdFJvb3QuZ2V0QVNUKCk7Ci0KLSAgICAgICAgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgPSAKLSAgICAgICAgICAgIEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKGFubm90YXRpb25DbGFzcykuCi0gICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5nZXRNZW1iZXJWYWx1ZVBhaXJzKAotICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKSwgYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotICAgICAgICAKLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBhbm5vdGF0aW9uQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpLAotICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMpOwotICAgICAgICAKLSAgICAgICAgdGV4dENoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoY29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgSW1wb3J0UmV3cml0ZSBpbXBvcnRSZXdyaXRlID0gQ29kZVN0eWxlQ29uZmlndXJhdGlvbi5jcmVhdGVJbXBvcnRSZXdyaXRlKGNvbXBpbGF0aW9uVW5pdCwgdHJ1ZSk7Ci0gICAgICAgIGltcG9ydFJld3JpdGUuYWRkSW1wb3J0KGFubm90YXRpb25DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICBpZiAoaW1wb3J0UmV3cml0ZS5oYXNSZWNvcmRlZENoYW5nZXMoKSkgewotICAgICAgICAgICAgVGV4dEVkaXQgaW1wb3J0VGV4dEVkaXQgPSBpbXBvcnRSZXdyaXRlLnJld3JpdGVJbXBvcnRzKG51bGwpOwotICAgICAgICAgICAgdGV4dENoYW5nZS5hZGRFZGl0KGltcG9ydFRleHRFZGl0KTsgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQWRkVW5pbXBsZW1lbnRlZE1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0FkZFVuaW1wbGVtZW50ZWRNZXRob2RDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3MmEwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQWRkVW5pbXBsZW1lbnRlZE1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSU1ldGhvZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuSW1wb3J0UmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5MaXN0UmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LmNvZGVtYW5pcHVsYXRpb24uQ29kZUdlbmVyYXRpb25TZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LmNvZGVtYW5pcHVsYXRpb24uU3R1YlV0aWxpdHkyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5KYXZhUHJlZmVyZW5jZXNTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU2hhcmVkQVNUUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBBZGRVbmltcGxlbWVudGVkTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsIGV4dGVuZHMgQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsIHsKLQotICAgIHByaXZhdGUgQVNUTm9kZSB0eXBlRGVjbGFyYXRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2U7Ci0KLSAgICBwdWJsaWMgQWRkVW5pbXBsZW1lbnRlZE1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQsIEFTVE5vZGUgdHlwZURlY2xhcmF0aW9uLCAKLSAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSwgU3RyaW5nIGRpc3BsYXlTdHJpbmcsIGludCByZWxldmFuY2UsIEltYWdlIGltYWdlKSB7Ci0gICAgICAgIHN1cGVyKGludm9jYXRpb25Db250ZXh0LCBkaXNwbGF5U3RyaW5nLCByZWxldmFuY2UsIGltYWdlKTsKLSAgICAgICAgdGhpcy5lbmRwb2ludEludGVyZmFjZSA9IGVuZHBvaW50SW50ZXJmYWNlOwotICAgICAgICB0aGlzLnR5cGVEZWNsYXJhdGlvbiA9IHR5cGVEZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRFZGl0cyhUZXh0RmlsZUNoYW5nZSB0ZXh0Q2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElNZXRob2RCaW5kaW5nW10gdW5pbXBsZW1lbnRlZE1ldGhvZHMgPSBnZXRVbmltcGxlbWVudGVkTWV0aG9kcyh0eXBlRGVjbGFyYXRpb24sIGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgaWYgKHVuaW1wbGVtZW50ZWRNZXRob2RzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IGludm9jYXRpb25Db250ZXh0LmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICAKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRBU1RSb290KCk7Ci0gICAgICAgIAotICAgICAgICBBU1QgYXN0ID0gYXN0Um9vdC5nZXRBU1QoKTsKLSAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFzdCk7Ci0gICAgICAgIAotICAgICAgICBDb2RlR2VuZXJhdGlvblNldHRpbmdzIHNldHRpbmdzID0gSmF2YVByZWZlcmVuY2VzU2V0dGluZ3MuZ2V0Q29kZUdlbmVyYXRpb25TZXR0aW5ncyhjb21waWxhdGlvblVuaXQuZ2V0SmF2YVByb2plY3QoKSk7Ci0gICAgICAgIHNldHRpbmdzLm92ZXJyaWRlQW5ub3RhdGlvbiA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gPSAoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbjsKLSAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiwgCi0gICAgICAgICAgICAgICAgYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24uZ2V0Qm9keURlY2xhcmF0aW9uc1Byb3BlcnR5KCkpOwotIAotICAgICAgICBJbXBvcnRSZXdyaXRlIGltcG9ydFJld3JpdGUgPSBJbXBvcnRSZXdyaXRlLmNyZWF0ZShhc3RSb290LCB0cnVlKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVuaW1wbGVtZW50ZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gdW5pbXBsZW1lbnRlZE1ldGhvZHNbaV07Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IFN0dWJVdGlsaXR5Mi5jcmVhdGVJbXBsZW1lbnRhdGlvblN0dWIoY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0UmV3cml0ZSwgaW1wb3J0UmV3cml0ZS5nZXREZWZhdWx0SW1wb3J0UmV3cml0ZUNvbnRleHQoKSwgbWV0aG9kQmluZGluZywKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSwgc2V0dGluZ3MsIGZhbHNlKTsKLSAgICAgICAgICAgIGxpc3RSZXdyaXRlLmluc2VydExhc3QobWV0aG9kRGVjbGFyYXRpb24sIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHRleHRDaGFuZ2UuYWRkRWRpdChyZXdyaXRlci5yZXdyaXRlQVNUKCkpOwotICAgICAgICBpZiAoaW1wb3J0UmV3cml0ZS5oYXNSZWNvcmRlZENoYW5nZXMoKSkgewotICAgICAgICAgICAgdGV4dENoYW5nZS5hZGRFZGl0KGltcG9ydFJld3JpdGUucmV3cml0ZUltcG9ydHMobnVsbCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJTWV0aG9kQmluZGluZ1tdIGdldE1ldGhvZHNUb0ltcGxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFVuaW1wbGVtZW50ZWRNZXRob2RzKHR5cGVEZWNsYXJhdGlvbiwgZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElNZXRob2RCaW5kaW5nW10gZ2V0VW5pbXBsZW1lbnRlZE1ldGhvZHMoQVNUTm9kZSB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSkgewotICAgICAgICBMaXN0PElNZXRob2RCaW5kaW5nPiBtZXRob2RCaW5kaW5ncyA9IG5ldyBBcnJheUxpc3Q8SU1ldGhvZEJpbmRpbmc+KCk7Ci0gICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24uZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBpbXBsZW1lbnRhdGlvbkNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHR5cGVEZWNsYXJhdGlvbi5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvbkNvbXBpbGF0aW9uVW5pdC5nZXRKYXZhRWxlbWVudCgpIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGltcGxlbWVudGF0aW9uQ29tcGlsYXRpb25Vbml0LmdldEphdmFFbGVtZW50KCkuZ2V0SmF2YVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgSVR5cGUgc2VpVHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZWlUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgc2VpID0gc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBzZWlDb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc2VpLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IGltcGxlbWVudGF0aW9uTWV0aG9kcyA9IGdldE1ldGhvZERlY2xhcmF0aW9ucygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25Db21waWxhdGlvblVuaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNZXRob2REZWNsYXJhdGlvbj4gc2VpTWV0aG9kcyA9IGdldE1ldGhvZERlY2xhcmF0aW9ucyhzZWlDb21waWxhdGlvblVuaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBzZWlNZXRob2QgOiBzZWlNZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbXBsZW1lbnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gaW1wbE1ldGhvZCA6IGltcGxlbWVudGF0aW9uTWV0aG9kcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbm5vdGF0aW9uVXRpbHMuY29tcGFyZU1ldGhvZHMoc2VpTWV0aG9kLCBpbXBsTWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW1wbGVtZW50ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQmluZGluZ3MuYWRkKHNlaU1ldGhvZC5yZXNvbHZlQmluZGluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGhvZEJpbmRpbmdzLnRvQXJyYXkobmV3IElNZXRob2RCaW5kaW5nW21ldGhvZEJpbmRpbmdzLnNpemUoKV0pOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IGdldE1ldGhvZERlY2xhcmF0aW9ucyhDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kRGVjbGFyYXRpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIG1ldGhvZERlY2xhcmF0aW9ucy5hZGQobWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbnM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQ2hhbmdlTW9kaWZpZXJDb3JyZWN0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9DaGFuZ2VNb2RpZmllckNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzRjN2VmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9DaGFuZ2VNb2RpZmllckNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuTGlzdFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgQ2hhbmdlTW9kaWZpZXJDb3JyZWN0aW9uUHJvcG9zYWwgZXh0ZW5kcyBBYnN0cmFjdEphdmFDb3JyZWN0aW9uUHJvcHNvYWwgewotICAgIAotICAgIHByaXZhdGUgSUJpbmRpbmcgYmluZGluZzsKLSAgICBwcml2YXRlIGludCBpbmNsdWRlZE1vZGlmaWVyczsKLSAgICBwcml2YXRlIGludCBleGNsdWRlZE1vZGlmaWVyczsKLSAgICAKLSAgICAKLSAgICBwdWJsaWMgQ2hhbmdlTW9kaWZpZXJDb3JyZWN0aW9uUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0LCBJQmluZGluZyBiaW5kaW5nLCAKLSAgICAgICAgICAgIGludCBpbmNsdWRlZE1vZGlmaWVycywgaW50IGV4Y2x1ZGVkTW9kaWZpZXJzLCBTdHJpbmcgZGlzcGxheVN0cmluZywgaW50IHJlbGV2YW5jZSwgSW1hZ2UgaW1hZ2UpIHsKLSAgICAgICAgc3VwZXIoaW52b2NhdGlvbkNvbnRleHQsIGRpc3BsYXlTdHJpbmcsIHJlbGV2YW5jZSwgaW1hZ2UpOwotICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwotICAgICAgICB0aGlzLmluY2x1ZGVkTW9kaWZpZXJzID0gaW5jbHVkZWRNb2RpZmllcnM7Ci0gICAgICAgIHRoaXMuZXhjbHVkZWRNb2RpZmllcnMgPSBleGNsdWRlZE1vZGlmaWVyczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgdm9pZCBhZGRFZGl0cyhUZXh0RmlsZUNoYW5nZSB0ZXh0Q2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0QVNUUm9vdCgpOwotICAgICAgICAKLSAgICAgICAgQVNUIGFzdCA9IGFzdFJvb3QuZ2V0QVNUKCk7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOwotCi0gICAgICAgIEFTVE5vZGUgZGVjbGFyaW5nTm9kZSA9IGFzdFJvb3QuZmluZERlY2xhcmluZ05vZGUoYmluZGluZyk7Ci0gICAgICAgIAotICAgICAgICBpbnQgY29uc2lkZXJlZE1vZGlmaWVyRmxhZ3MgPSBpbmNsdWRlZE1vZGlmaWVycyB8IGV4Y2x1ZGVkTW9kaWZpZXJzOyAKLSAgICAgICAgaW50IG5ld01vZGlmaWVyRmxhZ3MgPSBpbmNsdWRlZE1vZGlmaWVycyAmIGNvbnNpZGVyZWRNb2RpZmllckZsYWdzOwotCi0gICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gZ2V0TGlzdFJld3JpdGUoZGVjbGFyaW5nTm9kZSwgcmV3cml0ZXIpOwotICAgICAgICBpZiAobGlzdFJld3JpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxBU1ROb2RlPiBvcmlnaW5hbExpc3QgPSBsaXN0UmV3cml0ZS5nZXRPcmlnaW5hbExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoQVNUTm9kZSBhc3ROb2RlIDogb3JpZ2luYWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBNb2RpZmllcikgewotICAgICAgICAgICAgICAgICAgICBNb2RpZmllciBtb2RpZmllciA9IChNb2RpZmllcikgYXN0Tm9kZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyRmxhZyA9IG1vZGlmaWVyLmdldEtleXdvcmQoKS50b0ZsYWdWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvbnNpZGVyZWRNb2RpZmllckZsYWdzICYgbW9kaWZpZXJGbGFnKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5ld01vZGlmaWVyRmxhZ3MgJiBtb2RpZmllckZsYWcpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0UmV3cml0ZS5yZW1vdmUobW9kaWZpZXIsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW9kaWZpZXJGbGFncyAmPSB+bW9kaWZpZXJGbGFnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBMaXN0PE1vZGlmaWVyPiBtb2RpZmVycyA9IGFzdC5uZXdNb2RpZmllcnMobmV3TW9kaWZpZXJGbGFncyk7Ci0gICAgICAgICAgICBBU1ROb2RlIGxhc3RBbm5vdGF0aW9uID0gZ2V0TGFzdEFubm90YXRpb24obGlzdFJld3JpdGUpOwotICAgICAgICAgICAgZm9yIChNb2RpZmllciBtb2RpZmllciA6IG1vZGlmZXJzKSB7Ci0gICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyRmxhZyA9IG1vZGlmaWVyLmdldEtleXdvcmQoKS50b0ZsYWdWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICgobW9kaWZpZXJGbGFnICYgKE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlBSSVZBVEUgfCBNb2RpZmllci5QUk9URUNURUQpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0QW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0UmV3cml0ZS5pbnNlcnRBZnRlcihtb2RpZmllciwgbGFzdEFubm90YXRpb24sIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAJbGlzdFJld3JpdGUuaW5zZXJ0Rmlyc3QobW9kaWZpZXIsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0ZXh0Q2hhbmdlLmFkZEVkaXQocmV3cml0ZXIucmV3cml0ZUFTVCgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIEFTVE5vZGUgZ2V0TGFzdEFubm90YXRpb24oTGlzdFJld3JpdGUgbGlzdFJld3JpdGUpIHsKLSAgICAgICAgQVNUTm9kZSBsYXN0QW5ub3RhdGlvbiA9IG51bGw7Ci0gICAgICAgIExpc3Q8QVNUTm9kZT4gcmV3cml0dGVuTGlzdCA9IGxpc3RSZXdyaXRlLmdldFJld3JpdHRlbkxpc3QoKTsKLSAgICAgICAgZm9yIChBU1ROb2RlIGFzdE5vZGUgOiByZXdyaXR0ZW5MaXN0KSB7Ci0gICAgICAgICAgICBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIElFeHRlbmRlZE1vZGlmaWVyKSB7Ci0gICAgICAgICAgICAgICAgSUV4dGVuZGVkTW9kaWZpZXIgZXh0ZW5kZWRNb2RpZmllciA9IChJRXh0ZW5kZWRNb2RpZmllcikgYXN0Tm9kZTsKLSAgICAgICAgICAgICAgICBpZiAoZXh0ZW5kZWRNb2RpZmllci5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgICAgICBsYXN0QW5ub3RhdGlvbiA9IGFzdE5vZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsYXN0QW5ub3RhdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0UmV3cml0ZSBnZXRMaXN0UmV3cml0ZShBU1ROb2RlIGFzdE5vZGUsIEFTVFJld3JpdGUgYXN0UmV3cml0ZSkgewotICAgICAgICBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgYXN0Tm9kZTsKLSAgICAgICAgICAgIHJldHVybiBhc3RSZXdyaXRlLmdldExpc3RSZXdyaXRlKG1ldGhvZERlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIGFzdE5vZGU7Ci0gICAgICAgICAgICByZXR1cm4gYXN0UmV3cml0ZS5nZXRMaXN0UmV3cml0ZSh0eXBlRGVjbGFyYXRpb24sIFR5cGVEZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQ2hhbmdlUmV0dXJuVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0NoYW5nZVJldHVyblR5cGVDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2ZjU1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQ2hhbmdlUmV0dXJuVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5JbXBvcnRSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5Db2RlU3R5bGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TaGFyZWRBU1RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgQ2hhbmdlUmV0dXJuVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbCBleHRlbmRzIEFic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbCB7Ci0JCi0JcHJpdmF0ZSBUeXBlRGVjbGFyYXRpb24gaW1wbFR5cGVEZWNsYXJhdGlvbjsKLQlwcml2YXRlIE1ldGhvZERlY2xhcmF0aW9uIGltcGxNZXRob2REZWNsYXJhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBlbmRwb2ludEludGVyZmFjZTsKLQkKLQlwdWJsaWMgQ2hhbmdlUmV0dXJuVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbCgKLQkJCUlJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCwgVHlwZURlY2xhcmF0aW9uIGltcGxUeXBlRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIGltcGxNZXRob2REZWNsYXJhdGlvbiwgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlLCBTdHJpbmcgZGlzcGxheVN0cmluZywKLQkJCWludCByZWxldmFuY2UsIEltYWdlIGltYWdlKSB7Ci0JCXN1cGVyKGludm9jYXRpb25Db250ZXh0LCBkaXNwbGF5U3RyaW5nLCByZWxldmFuY2UsIGltYWdlKTsKLQkgICAgdGhpcy5pbXBsVHlwZURlY2xhcmF0aW9uID0gaW1wbFR5cGVEZWNsYXJhdGlvbjsKLQkgICAgdGhpcy5pbXBsTWV0aG9kRGVjbGFyYXRpb24gPSBpbXBsTWV0aG9kRGVjbGFyYXRpb247Ci0JICAgIHRoaXMuZW5kcG9pbnRJbnRlcmZhY2UgPSBlbmRwb2ludEludGVyZmFjZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRFZGl0cyhUZXh0RmlsZUNoYW5nZSB0ZXh0Q2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZERlY2xhcmF0aW9uID0gZ2V0U0VJTWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJaWYgKHNlaU1ldGhvZERlY2xhcmF0aW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0QVNUUm9vdCgpOwotICAgICAgICAKLSAgICAgICAgQVNUIGFzdCA9IGFzdFJvb3QuZ2V0QVNUKCk7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOwotICAgICAgICBJVHlwZUJpbmRpbmcgcmV0dXJuVHlwZSA9IHNlaU1ldGhvZERlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCkuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICBJbXBvcnRSZXdyaXRlIGltcG9ydFJld3JpdGUgPSBDb2RlU3R5bGVDb25maWd1cmF0aW9uLmNyZWF0ZUltcG9ydFJld3JpdGUoY29tcGlsYXRpb25Vbml0LCB0cnVlKTsKLSAgICAgICAgVHlwZSB0eXBlID0gaW1wb3J0UmV3cml0ZS5hZGRJbXBvcnQocmV0dXJuVHlwZSwgYXN0KTsKLSAgICAgICAgcmV3cml0ZXIuc2V0KGltcGxNZXRob2REZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24uUkVUVVJOX1RZUEUyX1BST1BFUlRZLCB0eXBlLCBudWxsKTsKLSAgICAgICAgcmV3cml0ZXIuc2V0KGltcGxNZXRob2REZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24uRVhUUkFfRElNRU5TSU9OU19QUk9QRVJUWSwgbmV3IEludGVnZXIoMCksIG51bGwpOwotICAgICAgICAKLSAgICAgICAgdGV4dENoYW5nZS5hZGRFZGl0KHJld3JpdGVyLnJld3JpdGVBU1QoKSk7Ci0gICAgICAgIGlmIChpbXBvcnRSZXdyaXRlLmhhc1JlY29yZGVkQ2hhbmdlcygpKSB7Ci0gICAgICAgIAl0ZXh0Q2hhbmdlLmFkZEVkaXQoaW1wb3J0UmV3cml0ZS5yZXdyaXRlSW1wb3J0cyhudWxsKSk7Ci0gICAgICAgIH0KLQl9Ci0KLSAgICBwcml2YXRlIE1ldGhvZERlY2xhcmF0aW9uIGdldFNFSU1ldGhvZERlY2xhcmF0aW9uKCkgewotICAgICAgICBpZiAoaW1wbFR5cGVEZWNsYXJhdGlvbi5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0IGltcGxDb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBpbXBsVHlwZURlY2xhcmF0aW9uLmdldFBhcmVudCgpOwotICAgICAgICAgICAgaWYgKGltcGxDb21waWxhdGlvblVuaXQuZ2V0SmF2YUVsZW1lbnQoKSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBpbXBsQ29tcGlsYXRpb25Vbml0LmdldEphdmFFbGVtZW50KCkuZ2V0SmF2YVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgSVR5cGUgc2VpVHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZWlUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgc2VpQ29tcGlsYXRpb25Vbml0ID0gc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBzZWlBU1RSb290ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNlaUNvbXBpbGF0aW9uVW5pdCwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBzZWlNZXRob2REZWNsYXJhdGlvbnMgPSBnZXRNZXRob2REZWNsYXJhdGlvbnMoc2VpQVNUUm9vdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZERlY2xhcmF0aW9uIDogc2VpTWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJaWYgKEFubm90YXRpb25VdGlscy5jb21wYXJlTWV0aG9kcyhpbXBsTWV0aG9kRGVjbGFyYXRpb24sIHNlaU1ldGhvZERlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgCQlyZXR1cm4gc2VpTWV0aG9kRGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLQl9Ci0KLSAgICBwcml2YXRlIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IGdldE1ldGhvZERlY2xhcmF0aW9ucyhDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kRGVjbGFyYXRpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIG1ldGhvZERlY2xhcmF0aW9ucy5hZGQobWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0pBWFdTUXVpY2tGaXhQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9KQVhXU1F1aWNrRml4UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYzczMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0pBWFdTUXVpY2tGaXhQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUE1lc3NhZ2VIYW5kbGVyczsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLnV0aWwuRWNsaXBzZU1lc3NhZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LkphdmFFbGVtZW50SW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklQcm9ibGVtTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JUXVpY2tGaXhQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotQFN1cHByZXNzV2FybmluZ3MoeyAicmVzdHJpY3Rpb24iLCAiZGVwcmVjYXRpb24iIH0pCi1wdWJsaWMgY2xhc3MgSkFYV1NRdWlja0ZpeFByb2Nlc3NvciBpbXBsZW1lbnRzIElRdWlja0ZpeFByb2Nlc3NvciB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb3JyZWN0aW9ucyhJQ29tcGlsYXRpb25Vbml0IHVuaXQsIGludCBwcm9ibGVtSWQpIHsKLSAgICAgICAgaWYgKHByb2JsZW1JZCA9PSBFY2xpcHNlTWVzc2FnZXIuQVBUX1FVSUNLX0ZJWF9QUk9CTEVNX0lEKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIElKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0Q29ycmVjdGlvbnMoSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb25bXSBsb2NhdGlvbnMpCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAobG9jYXRpb25zID09IG51bGwgfHwgbG9jYXRpb25zLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+KCk7Ci0KLSAgICAgICAgU2V0PFN0cmluZz4gaGFuZGxlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChJUHJvYmxlbUxvY2F0aW9uIHByb2JsZW1Mb2NhdGlvbiA6IGxvY2F0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nW10gcHJvYmxlbUFyZ3VtZW50cyA9IHByb2JsZW1Mb2NhdGlvbi5nZXRQcm9ibGVtQXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAocHJvYmxlbUFyZ3VtZW50cy5sZW5ndGggPj0gMikgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9ibGVtID0gcHJvYmxlbUFyZ3VtZW50c1sxXTsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlZC5hZGQocHJvYmxlbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcyhjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2Fscyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3Bvc2Fscy50b0FycmF5KG5ldyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3MoSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb24gcHJvYmxlbUxvY2F0aW9uLAotICAgICAgICAgICAgTGlzdDxJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbD4gcHJvcG9zYWxzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHByb2JsZW0gPSBwcm9ibGVtTG9jYXRpb24uZ2V0UHJvYmxlbUFyZ3VtZW50cygpWzFdOwotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQpKSB7Ci0gICAgICAgICAgICBhZGRVbmltcGxlbWVudGVkTWV0aG9kc1Byb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9TVVBQT1JURURfT05fQ0xBU1NFU19XSVRIX1dFQlNFUlZJQ0UpKSB7Ci0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uVG9UeXBlUHJvcG9zYWwoY29udGV4dCwgcHJvcG9zYWxzLCBXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fTkFNRV9BVFRSSUJVVEUpCi0gICAgICAgICAgICAgICAgfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9QT1JUTkFNRV9TRUkpCi0gICAgICAgICAgICAgICAgfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9TRVJWSUNFTkFNRV9TRUkpCi0gICAgICAgICAgICAgICAgfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTkRQT0lOVElOVEVSRkFDRV9TRUkpCi0gICAgICAgICAgICAgICAgfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX0VYQ0xVREVfTk9UX0FMTE9XRURfT05fU0VJKSkgewotICAgICAgICAgICAgYWRkUmVtb3ZlTWVtYmVyVmFsdWVQYWlyUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfRVhDTFVERV9TUEVDSUZJRURfTk9fT1RIRVJfQVRUUklCVVRFU19BTExPV0VEKSkgewotICAgICAgICAgICAgYWRkUmVtb3ZlTWVtYmVyVmFsdWVQYWlyUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJNRVRIT0RTKSkgewotICAgICAgICAgICAgYWRkUmVtb3ZlQW5ub3RhdGlvblByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzLCBXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19TT0FQQklORElORykKLSAgICAgICAgICAgICAgICB8fCBwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19OT19SUENfU1RZTEVfT05fTUVUSE9EUykpIHsKLSAgICAgICAgICAgIGFkZFJlbW92ZUFubm90YXRpb25Qcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJSRVNVTFQpKSB7Ci0gICAgICAgICAgICBhZGRSZW1vdmVBbm5vdGF0aW9uUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIFdlYlJlc3VsdC5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQlBBUkFNKSkgewotICAgICAgICAgICAgYWRkUmVtb3ZlQW5ub3RhdGlvblByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX09ORVdBWSkpIHsKLSAgICAgICAgICAgIGFkZFJlbW92ZUFubm90YXRpb25Qcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTCkpIHsKLSAgICAgICAgICAgIGFkZENoYW5nZU1vZGlmaWVyUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIDUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfREVGQVVMVF9QVUJMSUNfQ09OU1RSVUNUT1IpKSB7Ci0gICAgICAgICAgICBhZGRDb25zdHJ1Y3RvclByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzLCA1KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1dFQlNFUlZJQ0VQUk9WSURFUl9DT01CSU5BVElPTikpIHsKLSAgICAgICAgICAgIGFkZFJlbW92ZUFubm90YXRpb25Qcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgV2ViU2VydmljZVByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5IQU5ETEVSX0NIQUlOX1NPQVBfTUVTU0FHRV9IQU5ETEVSUykpIHsKLSAgICAgICAgICAgIGFkZFJlbW92ZUFubm90YXRpb25Qcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgU09BUE1lc3NhZ2VIYW5kbGVycy5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9PVkVSUklERV9GSU5BTElaRSkpIHsKLSAgICAgICAgICAgIGFkZFJlbW92ZU1ldGhvZFByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUykKLSAgICAgICAgICAgICAgICB8fCBwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfTk9fU1RBVElDX01PRElGSUVSX0FMTE9XRUQpCi0gICAgICAgICAgICAgICAgfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX0ZJTkFMX01PRElGSUVSX0FMTE9XRUQpKSB7Ci0gICAgICAgICAgICBhZGRDaGFuZ2VNb2RpZmllclByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzLCA1KTsKLSAgICAgICAgICAgIGFkZFJlbW92ZUFubm90YXRpb25Qcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfUkVEVUNFRF9WSVNJQklMSVRZKSkgewotICAgICAgICAgICAgYWRkQ2hhbmdlTW9kaWZpZXJQcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX0lOQ09NUEFUSUJMRV9SRVRVUk5fVFlQRSkpIHsKLSAgICAgICAgICAgIGFkZENoYW5nZVJldHVyblR5cGVQcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2Fscyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQW5ub3RhdGlvblRvVHlwZVByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0KLSAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuQUREX0FOTk9UQVRJT04sIGFubm90YXRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICBJbWFnZSBpbWFnZSA9IEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fQ0hBTkdFKTsKLSAgICAgICAgcHJvcG9zYWxzLmFkZChuZXcgQWRkQW5ub3RhdGlvblRvVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbChjb250ZXh0LCBhbm5vdGF0aW9uQ2xhc3MsIGRpc3BsYXlTdHJpbmcsIDUsIGltYWdlKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFJlbW92ZU1ldGhvZFByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvYmxlbUxvY2F0aW9uIHByb2JsZW1Mb2NhdGlvbiwKLSAgICAgICAgICAgIExpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscykgewotCi0gICAgICAgIEFTVE5vZGUgc2VsZWN0ZWROb2RlID0gcHJvYmxlbUxvY2F0aW9uLmdldENvdmVyaW5nTm9kZShjb250ZXh0LmdldEFTVFJvb3QoKSk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkTm9kZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pIHsKLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBzZWxlY3RlZE5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBBU1ROb2RlIHBhcmVudE5vZGUgPSBub3JtYWxBbm5vdGF0aW9uLmdldFBhcmVudCgpOwotICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIHNlbGVjdGVkTm9kZSA9ICgoTWV0aG9kRGVjbGFyYXRpb24pIHBhcmVudE5vZGUpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBwYXJlbnROb2RlOwotICAgICAgICAgICAgICAgIHNlbGVjdGVkTm9kZSA9ICgoTWV0aG9kRGVjbGFyYXRpb24pIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0UGFyZW50KCkpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZWxlY3RlZE5vZGUgaW5zdGFuY2VvZiBTaW1wbGVOYW1lKSB7Ci0gICAgICAgICAgICBTaW1wbGVOYW1lIG1ldGhvZE5hbWUgPSAoU2ltcGxlTmFtZSkgc2VsZWN0ZWROb2RlOwotICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuUkVNT1ZFX01FVEhPRCwgbWV0aG9kTmFtZS5nZXRJZGVudGlmaWVyKCkpOwotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKTsKLQotICAgICAgICAgICAgcHJvcG9zYWxzLmFkZChuZXcgUmVtb3ZlTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsKGNvbnRleHQsIG1ldGhvZE5hbWUsIGRpc3BsYXlTdHJpbmcsIDUsIGltYWdlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUmVtb3ZlQW5ub3RhdGlvblByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvYmxlbUxvY2F0aW9uIHByb2JsZW1Mb2NhdGlvbiwKLSAgICAgICAgICAgIExpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscywgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb24pIHsKLQotICAgICAgICBBU1ROb2RlIGNvdmVyaW5nTm9kZSA9IHByb2JsZW1Mb2NhdGlvbi5nZXRDb3ZlcmluZ05vZGUoY29udGV4dC5nZXRBU1RSb290KCkpOwotICAgICAgICBBU1ROb2RlIHBhcmVudE5vZGUgPSBjb3ZlcmluZ05vZGUuZ2V0UGFyZW50KCk7Ci0KLSAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuUkVNT1ZFX0FOTk9UQVRJT04sIGFubm90YXRpb24uZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKTsKLSAgICAgICAgcHJvcG9zYWxzLmFkZChuZXcgUmVtb3ZlQW5ub3RhdGlvbkNvcnJlY3Rpb25Qcm9wb3NhbChjb250ZXh0LCBhbm5vdGF0aW9uLCBwYXJlbnROb2RlLCBkaXNwbGF5U3RyaW5nLCA1LCBpbWFnZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRSZW1vdmVNZW1iZXJWYWx1ZVBhaXJQcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2JsZW1Mb2NhdGlvbiBwcm9ibGVtTG9jYXRpb24sCi0gICAgICAgICAgICBMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMsIGJvb2xlYW4gcmVtb3ZlQWxsT3RoZXJNVlBzKSB7Ci0KLSAgICAgICAgQVNUTm9kZSBjb3ZlcmluZ05vZGUgPSBwcm9ibGVtTG9jYXRpb24uZ2V0Q292ZXJpbmdOb2RlKGNvbnRleHQuZ2V0QVNUUm9vdCgpKTsKLQotICAgICAgICBpZiAoY292ZXJpbmdOb2RlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgTWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gKE1lbWJlclZhbHVlUGFpcikgY292ZXJpbmdOb2RlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuUkVNT1ZFX01FTUJFUlZBTFVFUEFJUiwgbWVtYmVyVmFsdWVQYWlyCi0gICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgaWYgKHJlbW92ZUFsbE90aGVyTVZQcykgewotICAgICAgICAgICAgICAgIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuUkVNT1ZFX0FMTF9PVEhFUl9NRU1CRVJWQUxVRVBBSVJTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKTsKLSAgICAgICAgICAgIHByb3Bvc2Fscy5hZGQobmV3IFJlbW92ZU1lbWJlclZhbHVlUGFpckNvcnJlY3Rpb25Qcm9wb3NhbChjb250ZXh0LCBtZW1iZXJWYWx1ZVBhaXIsCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUFsbE90aGVyTVZQcywgZGlzcGxheVN0cmluZywgNSwgaW1hZ2UpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRVbmltcGxlbWVudGVkTWV0aG9kc1Byb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvYmxlbUxvY2F0aW9uIHByb2JsZW1Mb2NhdGlvbiwKLSAgICAgICAgICAgIExpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscykgewotCi0gICAgICAgIEFTVE5vZGUgZW5kcG9pbnRJbnRlcmZhY2VWYWx1ZSA9IHByb2JsZW1Mb2NhdGlvbi5nZXRDb3ZlcmluZ05vZGUoY29udGV4dC5nZXRBU1RSb290KCkpOwotICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2VWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwpIHsKLSAgICAgICAgICAgIEFTVE5vZGUgZW5kcG9pbnRJbnRlcmZhY2VNVlAgPSBlbmRwb2ludEludGVyZmFjZVZhbHVlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgQVNUTm9kZSB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IGVuZHBvaW50SW50ZXJmYWNlTVZQLmdldFBhcmVudCgpOwotICAgICAgICAgICAgQVNUTm9kZSB0eXBlRGVjbGFyYXRpb24gPSB3ZWJTZXJ2aWNlQW5ub3RhdGlvbi5nZXRQYXJlbnQoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gKChTdHJpbmdMaXRlcmFsKSBlbmRwb2ludEludGVyZmFjZVZhbHVlKS5nZXRMaXRlcmFsVmFsdWUoKTsKLQotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0NIQU5HRSk7Ci0gICAgICAgICAgICBwcm9wb3NhbHMuYWRkKG5ldyBBZGRVbmltcGxlbWVudGVkTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsKGNvbnRleHQsIHR5cGVEZWNsYXJhdGlvbiwgZW5kcG9pbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5BRERfVU5JTVBMRU1FTlRFRF9NRVRIT0RTLCA1LCBpbWFnZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENoYW5nZU1vZGlmaWVyUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb24gcHJvYmxlbUxvY2F0aW9uLAotICAgICAgICAgICAgTGlzdDxJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbD4gcHJvcG9zYWxzLCBpbnQgcmVsZXZhbmNlKSB7Ci0KLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBjb250ZXh0LmdldEFTVFJvb3QoKTsKLSAgICAgICAgQVNUTm9kZSBzZWxlY3RlZE5vZGUgPSBwcm9ibGVtTG9jYXRpb24uZ2V0Q292ZXJpbmdOb2RlKGFzdFJvb3QpOwotCi0gICAgICAgIGlmICghKHNlbGVjdGVkTm9kZSBpbnN0YW5jZW9mIFNpbXBsZU5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJQmluZGluZyBiaW5kaW5nID0gKChTaW1wbGVOYW1lKSBzZWxlY3RlZE5vZGUpLnJlc29sdmVCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nTmFtZSA9IGJpbmRpbmcuZ2V0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSAiIjsKLQotICAgICAgICAgICAgaW50IGV4Y2x1ZGVkTW9kaWZpZXJzID0gMDsKLSAgICAgICAgICAgIGludCBpbmNsdWRlZE1vZGlmaWVycyA9IDA7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwcm9ibGVtID0gcHJvYmxlbUxvY2F0aW9uLmdldFByb2JsZW1Bcmd1bWVudHMoKVsxXTsKLQotICAgICAgICAgICAgaWYocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfT05fUFVCTElDX01FVEhPRFMpCi0gICAgICAgICAgICAgICAgICAgIHx8IHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9SRURVQ0VEX1ZJU0lCSUxJVFkpKSB7Ci0gICAgICAgICAgICAgICAgZXhjbHVkZWRNb2RpZmllcnMgPSB+KE1vZGlmaWVyLlBVQkxJQyk7Ci0gICAgICAgICAgICAgICAgaW5jbHVkZWRNb2RpZmllcnMgPSBNb2RpZmllci5QVUJMSUMgOwotICAgICAgICAgICAgICAgIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuQ0hBTkdFX01FVEhPRF9WSVNJQklMSVRZLCAicHVibGljIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX0ZJTkFMX01PRElGSUVSX0FMTE9XRUQpKSB7Ci0gICAgICAgICAgICAgICAgZXhjbHVkZWRNb2RpZmllcnMgPSBNb2RpZmllci5GSU5BTDsKLSAgICAgICAgICAgICAgICBkaXNwbGF5U3RyaW5nID0gSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLlJFTU9WRV9GSU5BTF9NT0RJRklFUiwgYmluZGluZ05hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfTk9fU1RBVElDX01PRElGSUVSX0FMTE9XRUQpKSB7Ci0gICAgICAgICAgICAgICAgZXhjbHVkZWRNb2RpZmllcnMgPSBNb2RpZmllci5TVEFUSUM7Ci0gICAgICAgICAgICAgICAgZGlzcGxheVN0cmluZyA9IEpBWFdTVUlNZXNzYWdlcy5iaW5kKEpBWFdTVUlNZXNzYWdlcy5SRU1PVkVfU1RBVElDX01PRElGSUVSLCBiaW5kaW5nTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTCkpIHsKLSAgICAgICAgICAgICAgICBleGNsdWRlZE1vZGlmaWVycyA9IE1vZGlmaWVyLkFCU1RSQUNUIHwgTW9kaWZpZXIuRklOQUw7Ci0gICAgICAgICAgICAgICAgZGlzcGxheVN0cmluZyA9IEpBWFdTVUlNZXNzYWdlcy5SRU1PVkVfSUxMRUdBTF9NT0RJRklFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0NIQU5HRSk7Ci0gICAgICAgICAgICBwcm9wb3NhbHMuYWRkKG5ldyBDaGFuZ2VNb2RpZmllckNvcnJlY3Rpb25Qcm9wb3NhbChjb250ZXh0LCBiaW5kaW5nLCBpbmNsdWRlZE1vZGlmaWVycywKLSAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWRNb2RpZmllcnMsIGRpc3BsYXlTdHJpbmcsIDUsIGltYWdlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ29uc3RydWN0b3JQcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2JsZW1Mb2NhdGlvbiBwcm9ibGVtTG9jYXRpb24sCi0gICAgICAgICAgICBMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMsIGludCByZWxldmFuY2UpIHsKLQotICAgICAgICBDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IGNvbnRleHQuZ2V0QVNUUm9vdCgpOwotICAgICAgICBBU1ROb2RlIHNlbGVjdGVkTm9kZSA9IHByb2JsZW1Mb2NhdGlvbi5nZXRDb3ZlcmluZ05vZGUoYXN0Um9vdCk7Ci0KLSAgICAgICAgSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gKChBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbikgc2VsZWN0ZWROb2RlLmdldFBhcmVudCgpKS5yZXNvbHZlQmluZGluZygpOwotICAgICAgICBpZiAodHlwZUJpbmRpbmcgIT0gbnVsbCAmJiB0eXBlQmluZGluZy5pc0Zyb21Tb3VyY2UoKSkgewotICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuQ1JFQVRFX0NPTlNUUlVDVE9SLAotICAgICAgICAgICAgICAgICAgICB0eXBlQmluZGluZy5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBJbWFnZSBpbWFnZSA9IEphdmFFbGVtZW50SW1hZ2VQcm92aWRlci5nZXREZWNvcmF0ZWRJbWFnZShKYXZhUGx1Z2luSW1hZ2VzLkRFU0NfTUlTQ19QVUJMSUMsCi0gICAgICAgICAgICAgICAgICAgIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkNPTlNUUlVDVE9SLCBKYXZhRWxlbWVudEltYWdlUHJvdmlkZXIuU01BTExfU0laRSk7Ci0KLSAgICAgICAgICAgIHByb3Bvc2Fscy5hZGQobmV3IE5ld0RlZmF1bHRDb25zdHJ1Y3RvckNvcnJlY3Rpb25Qcm9wb3NhbChjb250ZXh0LCB0eXBlQmluZGluZywgZGlzcGxheVN0cmluZywgNSwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDaGFuZ2VSZXR1cm5UeXBlUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb24gcHJvYmxlbUxvY2F0aW9uLAotICAgICAgICAgICAgTGlzdDxJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbD4gcHJvcG9zYWxzKSB7Ci0KLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBjb250ZXh0LmdldEFTVFJvb3QoKTsKLSAgICAgICAgQVNUTm9kZSBzZWxlY3RlZE5vZGUgPSBwcm9ibGVtTG9jYXRpb24uZ2V0Q292ZXJpbmdOb2RlKGFzdFJvb3QpOwotCi0gICAgICAgIGlmICghKHNlbGVjdGVkTm9kZSBpbnN0YW5jZW9mIFNpbXBsZU5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBpbXBsTWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pKChTaW1wbGVOYW1lKSBzZWxlY3RlZE5vZGUpLmdldFBhcmVudCgpOwotICAgICAgICBUeXBlRGVjbGFyYXRpb24gaW1wbFR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24paW1wbE1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmVudCgpOwotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGltcGxUeXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpLCBXZWJTZXJ2aWNlLmNsYXNzKTsKLQotICAgICAgICBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgImVuZHBvaW50SW50ZXJmYWNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuQ0hBTkdFX01FVEhPRF9SRVRVUk5fVFlQRTsKLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0NIQU5HRSk7Ci0gICAgICAgIHByb3Bvc2Fscy5hZGQobmV3IENoYW5nZVJldHVyblR5cGVDb3JyZWN0aW9uUHJvcG9zYWwoY29udGV4dCwgaW1wbFR5cGVEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICBpbXBsTWV0aG9kRGVjbGFyYXRpb24sIGVuZHBvaW50SW50ZXJmYWNlLCBkaXNwbGF5U3RyaW5nLCA1LCBpbWFnZSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9OZXdEZWZhdWx0Q29uc3RydWN0b3JDb3JyZWN0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9OZXdEZWZhdWx0Q29uc3RydWN0b3JDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyMDczMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vTmV3RGVmYXVsdENvbnN0cnVjdG9yQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5CbG9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5MaXN0UmV3cml0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkNvZGVHZW5lcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklJbnZvY2F0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCi0NCi1wdWJsaWMgY2xhc3MgTmV3RGVmYXVsdENvbnN0cnVjdG9yQ29ycmVjdGlvblByb3Bvc2FsIGV4dGVuZHMgQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsIHsNCi0NCi0JcHJpdmF0ZSBJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmc7DQotCQ0KLQlwdWJsaWMgTmV3RGVmYXVsdENvbnN0cnVjdG9yQ29ycmVjdGlvblByb3Bvc2FsKA0KLQkJCUlJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCwgSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBTdHJpbmcgZGlzcGxheVN0cmluZywNCi0JCQlpbnQgcmVsZXZhbmNlLCBJbWFnZSBpbWFnZSkgew0KLQkJc3VwZXIoaW52b2NhdGlvbkNvbnRleHQsIGRpc3BsYXlTdHJpbmcsIHJlbGV2YW5jZSwgaW1hZ2UpOw0KLQkJdGhpcy50eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0gICAgcHVibGljIHZvaWQgYWRkRWRpdHMoVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRBU1RSb290KCk7DQotICAgICAgICBBU1QgYXN0ID0gYXN0Um9vdC5nZXRBU1QoKTsNCi0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOw0KLQ0KLQkJQVNUTm9kZSB0eXBlRGVjbGFyYXRpb24gPSBhc3RSb290LmZpbmREZWNsYXJpbmdOb2RlKHR5cGVCaW5kaW5nKTsNCi0NCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7DQotDQotCQlTaW1wbGVOYW1lIG5ld05hbWVOb2RlID0gYXN0Lm5ld1NpbXBsZU5hbWUodHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsNCi0NCi0JCW1ldGhvZERlY2xhcmF0aW9uLnNldENvbnN0cnVjdG9yKHRydWUpOw0KLQ0KLQkJbWV0aG9kRGVjbGFyYXRpb24ubW9kaWZpZXJzKCkuYWRkQWxsKGFzdC5uZXdNb2RpZmllcnMoTW9kaWZpZXIuUFVCTElDKSk7DQotDQotCQltZXRob2REZWNsYXJhdGlvbi5zZXROYW1lKG5ld05hbWVOb2RlKTsNCi0NCi0JCUJsb2NrIGJvZHkgPSBhc3QubmV3QmxvY2soKTsNCi0NCi0JCVN0cmluZyBwbGFjZUhvbGRlciA9IENvZGVHZW5lcmF0aW9uLmdldE1ldGhvZEJvZHlDb250ZW50KGludm9jYXRpb25Db250ZXh0LmdldENvbXBpbGF0aW9uVW5pdCgpLA0KLSAgICAgICAgICAgICAgICB0eXBlQmluZGluZy5nZXROYW1lKCksIG5ld05hbWVOb2RlLmdldElkZW50aWZpZXIoKSwgdHJ1ZSwgIiIsIFN0cmluZy52YWx1ZU9mKCdcbicpKTsNCi0JCWlmIChwbGFjZUhvbGRlciAhPSBudWxsKSB7DQotCQkgICAgQVNUTm9kZSB0b2RvTm9kZSA9IHJld3JpdGVyLmNyZWF0ZVN0cmluZ1BsYWNlaG9sZGVyKHBsYWNlSG9sZGVyLCBBU1ROb2RlLlJFVFVSTl9TVEFURU1FTlQpOw0KLQkJICAgIGJvZHkuc3RhdGVtZW50cygpLmFkZCh0b2RvTm9kZSk7DQotCQl9DQotCQltZXRob2REZWNsYXJhdGlvbi5zZXRCb2R5KGJvZHkpOw0KLQkJDQotCQlDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHkgPSAoKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLmdldEJvZHlEZWNsYXJhdGlvbnNQcm9wZXJ0eSgpOw0KLQkJTGlzdDxBU1ROb2RlPiBtZW1iZXJzID0gKExpc3Q8QVNUTm9kZT4pIHR5cGVEZWNsYXJhdGlvbi5nZXRTdHJ1Y3R1cmFsUHJvcGVydHkocHJvcGVydHkpOw0KLQkJTGlzdEl0ZXJhdG9yPEFTVE5vZGU+IG1lbWJlcnNJdGVyYXRvciA9IG1lbWJlcnMubGlzdEl0ZXJhdG9yKCk7DQotCQlpbnQgaW5zZXJ0QXQgPSAwOw0KLQkJd2hpbGUgKG1lbWJlcnNJdGVyYXRvci5oYXNQcmV2aW91cygpKSB7DQotCQkJQVNUTm9kZSBhc3ROb2RlID0gKEFTVE5vZGUpIG1lbWJlcnNJdGVyYXRvci5wcmV2aW91cygpOw0KLQkJCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gJiYgKChNZXRob2REZWNsYXJhdGlvbikgYXN0Tm9kZSkuaXNDb25zdHJ1Y3RvcigpKSB7DQotCQkJCWluc2VydEF0ID0gbWVtYmVyc0l0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSArIDE7DQotCQkJfQ0KLQkJfQ0KLQkJTGlzdFJld3JpdGUgbGlzdFJld3JpdGVyPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZSh0eXBlRGVjbGFyYXRpb24sIHByb3BlcnR5KTsNCi0JCWxpc3RSZXdyaXRlci5pbnNlcnRBdChtZXRob2REZWNsYXJhdGlvbiwgaW5zZXJ0QXQsIG51bGwpOw0KLQkJdGV4dENoYW5nZS5hZGRFZGl0KHJld3JpdGVyLnJld3JpdGVBU1QoKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL1JlbW92ZUFubm90YXRpb25Db3JyZWN0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9SZW1vdmVBbm5vdGF0aW9uQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MTYyZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL1JlbW92ZUFubm90YXRpb25Db3JyZWN0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25Db3JyZWN0aW9uUHJvcG9zYWwgZXh0ZW5kcyBBYnN0cmFjdEphdmFDb3JyZWN0aW9uUHJvcHNvYWwgewotCi0gICAgcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbjsKLSAgICBwcml2YXRlIEFTVE5vZGUgcGFyZW50Tm9kZTsKLQotICAgIHB1YmxpYyBSZW1vdmVBbm5vdGF0aW9uQ29ycmVjdGlvblByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uLCBBU1ROb2RlIHBhcmVudE5vZGUsIFN0cmluZyBkaXNwbGF5U3RyaW5nLAotICAgICAgICAgICAgaW50IHJlbGV2YW5jZSwgSW1hZ2UgaW1hZ2UpIHsKLSAgICAgICAgc3VwZXIoaW52b2NhdGlvbkNvbnRleHQsIGRpc3BsYXlTdHJpbmcsIHJlbGV2YW5jZSwgaW1hZ2UpOwotICAgICAgICB0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotICAgICAgICB0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEVkaXRzKFRleHRGaWxlQ2hhbmdlIHRleHRDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKHBhcmVudE5vZGUuZ2V0QVNUKCkpOwotCi0gICAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgQW5ub3RhdGlvbikgewotICAgICAgICAgICAgQW5ub3RhdGlvbiBqZHREb21Bbm5vdGF0aW9uID0gKEFubm90YXRpb24pIHBhcmVudE5vZGU7Ci0gICAgICAgICAgICByZXdyaXRlci5yZW1vdmUoamR0RG9tQW5ub3RhdGlvbiwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgcGFyZW50Tm9kZTsKLSAgICAgICAgICAgIEFubm90YXRpb24gamR0RG9tQW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCkuZ2V0SmF2YUVsZW1lbnQoKSwgYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBpZiAoamR0RG9tQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV3cml0ZXIucmVtb3ZlKGpkdERvbUFubm90YXRpb24sIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudE5vZGUuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBwYXJlbnROb2RlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgQW5ub3RhdGlvbiBqZHREb21Bbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCkuZ2V0SmF2YUVsZW1lbnQoKSwgYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBpZiAoamR0RG9tQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV3cml0ZXIucmVtb3ZlKGpkdERvbUFubm90YXRpb24sIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGV4dENoYW5nZS5hZGRFZGl0KHJld3JpdGVyLnJld3JpdGVBU1QoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vUmVtb3ZlTWVtYmVyVmFsdWVQYWlyQ29ycmVjdGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vUmVtb3ZlTWVtYmVyVmFsdWVQYWlyQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYWVjNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL1JlbW92ZU1lbWJlclZhbHVlUGFpckNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlTWVtYmVyVmFsdWVQYWlyQ29ycmVjdGlvblByb3Bvc2FsIGV4dGVuZHMgQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsIHsKLSAgICAKLSAgICBwcml2YXRlIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZUFsbE90aGVyTVZQczsKLSAgICAKLSAgICBwdWJsaWMgUmVtb3ZlTWVtYmVyVmFsdWVQYWlyQ29ycmVjdGlvblByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCwKLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIsIGJvb2xlYW4gcmVtb3ZlQWxsT3RoZXJNVlBzLCBTdHJpbmcgZGlzcGxheVN0cmluZywgaW50IHJlbGV2YW5jZSwgCi0gICAgICAgICAgICBJbWFnZSBpbWFnZSkgewotICAgICAgICBzdXBlcihpbnZvY2F0aW9uQ29udGV4dCwgZGlzcGxheVN0cmluZywgcmVsZXZhbmNlLCBpbWFnZSk7Ci0gICAgICAgIHRoaXMubWVtYmVyVmFsdWVQYWlyID0gbWVtYmVyVmFsdWVQYWlyOwotICAgICAgICB0aGlzLnJlbW92ZUFsbE90aGVyTVZQcyA9IHJlbW92ZUFsbE90aGVyTVZQczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgdm9pZCBhZGRFZGl0cyhUZXh0RmlsZUNoYW5nZSB0ZXh0Q2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgbWVtYmVyVmFsdWVQYWlyLmdldFBhcmVudCgpOwotCi0gICAgICAgICAgICBBU1RSZXdyaXRlIGFzdFJld3JpdGUgPSBBU1RSZXdyaXRlLmNyZWF0ZShhbm5vdGF0aW9uLmdldEFTVCgpKTsKLSAgICAgICAgICAgIGlmIChyZW1vdmVBbGxPdGhlck1WUHMpIHsKLSAgICAgICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb24udmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgb3RoZXJNZW1iZXJWYWx1ZVBhaXIgOiBtZW1iZXJWYWx1ZVBhaXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghb3RoZXJNZW1iZXJWYWx1ZVBhaXIuZXF1YWxzKG1lbWJlclZhbHVlUGFpcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzdFJld3JpdGUucmVtb3ZlKG90aGVyTWVtYmVyVmFsdWVQYWlyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXN0UmV3cml0ZS5yZW1vdmUobWVtYmVyVmFsdWVQYWlyLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRleHRDaGFuZ2UuYWRkRWRpdChhc3RSZXdyaXRlLnJld3JpdGVBU1QoKSk7ICAgCi0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9SZW1vdmVNZXRob2RDb3JyZWN0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9SZW1vdmVNZXRob2RDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmODA0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vUmVtb3ZlTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JTWV0aG9kQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFJlbW92ZU1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbCBleHRlbmRzIEFic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbCB7Ci0KLSAgICBwcml2YXRlIFNpbXBsZU5hbWUgbWV0aG9kTmFtZTsKLSAgICAKLSAgICBwdWJsaWMgUmVtb3ZlTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCwgU2ltcGxlTmFtZSBtZXRob2ROYW1lLAotICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcsIGludCByZWxldmFuY2UsIEltYWdlIGltYWdlKSB7Ci0gICAgICAgIHN1cGVyKGludm9jYXRpb25Db250ZXh0LCBkaXNwbGF5U3RyaW5nLCByZWxldmFuY2UsIGltYWdlKTsKLSAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRFZGl0cyhUZXh0RmlsZUNoYW5nZSB0ZXh0Q2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElCaW5kaW5nIGJpbmRpbmcgPSBtZXRob2ROYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0QVNUUm9vdCgpOwotICAgICAgICBJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gKChJTWV0aG9kQmluZGluZykgYmluZGluZykuZ2V0TWV0aG9kRGVjbGFyYXRpb24oKTsKLSAgICAgICAgQVNUTm9kZSBkZWNsYXJhdGlvbiA9IGFzdFJvb3QuZmluZERlY2xhcmluZ05vZGUobWV0aG9kQmluZGluZyk7Ci0gICAgICAgIEFTVCBhc3QgPSBhc3RSb290LmdldEFTVCgpOwotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLSAgICAgICAgcmV3cml0ZXIucmVtb3ZlKGRlY2xhcmF0aW9uLCBudWxsKTsKLSAgICAgICAgdGV4dENoYW5nZS5hZGRFZGl0KHJld3JpdGVyLnJld3JpdGVBU1QoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL0JpbmRpbmdUeXBlQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vQmluZGluZ1R5cGVBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzVhMWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vQmluZGluZ1R5cGVBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5WQUxVRTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHlsZWRTdHJpbmc7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nVHlwZUF0dHJpYnV0ZUluaXRpYWxpemVyIGV4dGVuZHMgQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBCaW5kaW5nX1NPQVAxMUhUVFBfQklORElORyA9ICJTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkciOyAvLyROT04tTkxTLTEkDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQQmluZGluZ19TT0FQMTJIVFRQX0JJTkRJTkcgPSAiU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUEJpbmRpbmdfU09BUDExSFRUUF9NVE9NX0JJTkRJTkcgPSAiU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkciOyAvLyROT04tTkxTLTEkDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQQmluZGluZ19TT0FQMTJIVFRQX01UT01fQklORElORyA9ICJTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORyI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBCaW5kaW5nX0hUVFBfQklORElORyA9ICJIVFRQQmluZGluZy5IVFRQX0JJTkRJTkciOyAvLyROT04tTkxTLTEkDQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0JJTkRJTkcgPSAiamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmciOyAvLyROT04tTkxTLTEkDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0JJTkRJTkcgPSAiamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmciOyAvLyROT04tTkxTLTEkDQotDQotICAgIHB1YmxpYyBCaW5kaW5nVHlwZUF0dHJpYnV0ZUluaXRpYWxpemVyKCkgew0KLSAgICAgICAgSkFYV1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChTT0FQX0JJTkRJTkcsDQotICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9vYmoxNi9zb2FwYmluZGluZ19vYmouZ2lmIikuY3JlYXRlSW1hZ2UoKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgIEpBWFdTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5wdXQoSFRUUF9CSU5ESU5HLA0KLSAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvb2JqMTYvaHR0cGJpbmRpbmdfb2JqLmdpZiIpLmNyZWF0ZUltYWdlKCkpOyAvLyROT04tTkxTLTEkDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0TWVtYmVyVmFsdWVQYWlycyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFTVCBhc3QsDQotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgew0KLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsNCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7DQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHZhbHVlID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIFZBTFVFLCBnZXREZWZhdWx0KCkpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpcnM7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwNCi0gICAgICAgICAgICBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIHNpbmdsZU1lbWJlckFubm90YXRpb24pIHsNCi0gICAgICAgIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvblByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsNCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7DQotICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gc2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgYWRkUXVhbGlmaWVkTmFtZUJpbmRpbmdzQ29tcGxldGlvblByb3Bvc2Fscyhjb21wbGV0aW9uUHJvcG9zYWxzLCBleHByZXNzaW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY29tcGxldGlvblByb3Bvc2FsczsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsDQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcikgew0KLSAgICAgICAgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9uUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPigpOw0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsNCi0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKSBqYXZhRWxlbWVudDsNCi0gICAgICAgICAgICBTdHJpbmcgbWVtYmVyVmFsdWVQYWlyTmFtZSA9IG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpOw0KLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhWQUxVRSkpIHsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKS50b1N0cmluZygpOw0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKE1JU1NJTkdfSURFTlRJRkVSKSB8fCB2YWx1ZS5jaGFyQXQoMCkgIT0gJ1wiJykgew0KLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBiaW5kaW5ncyA9IGdldFNob3J0TmFtZUJpbmRpbmdzTWFwKCk7DQotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBiaW5kaW5nc0l0ZXIgPSBiaW5kaW5ncy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYmluZGluZ3NJdGVyLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gYmluZGluZ0VudHJ5ID0gYmluZGluZ3NJdGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcG9zYWwgPSBiaW5kaW5nRW50cnkuZ2V0S2V5KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgPSBiaW5kaW5nRW50cnkuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVwbGFjZW1lbnRPZmZzZXQgPSBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKS5nZXRTdGFydFBvc2l0aW9uKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcGxhY2VtZW50TGVuZ3RoID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkuZ2V0TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBKQVhXU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKG5ldyBCaW5kaW5nVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCwgdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIGltYWdlLCBuZXcgU3R5bGVkU3RyaW5nKHByb3Bvc2FsKSwgNSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBhZGRRdWFsaWZpZWROYW1lQmluZGluZ3NDb21wbGV0aW9uUHJvcG9zYWxzKGNvbXBsZXRpb25Qcm9wb3NhbHMsIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY29tcGxldGlvblByb3Bvc2FsczsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkUXVhbGlmaWVkTmFtZUJpbmRpbmdzQ29tcGxldGlvblByb3Bvc2FscyhMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXBsZXRpb25Qcm9wb3NhbHMsIEV4cHJlc3Npb24gdmFsdWUpIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYmluZGluZ3MgPSBnZXRRdWFsaWZpZWROYW1lQmluZGluZ3NNYXAoKTsNCi0gICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGJpbmRpbmdzSXRlciA9IGJpbmRpbmdzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgIHdoaWxlIChiaW5kaW5nc0l0ZXIuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBiaW5kaW5nRW50cnkgPSBiaW5kaW5nc0l0ZXIubmV4dCgpOw0KLSAgICAgICAgICAgIFN0cmluZyBwcm9wb3NhbCA9IGJpbmRpbmdFbnRyeS5nZXRLZXkoKTsNCi0gICAgICAgICAgICBJbWFnZSBpbWFnZSA9IEpBWFdTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoYmluZGluZ0VudHJ5LmdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCwgdmFsdWUsIGltYWdlLCBnZXREaXNwbGF5U3RyaW5nKHByb3Bvc2FsKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsNCi0gICAgICAgIHJldHVybiBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZyhTdHJpbmcgYmluZGluZykgew0KLSAgICAgICAgaWYgKGJpbmRpbmcuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gU09BUEJpbmRpbmdfU09BUDExSFRUUF9CSU5ESU5HOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJpbmRpbmcuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gU09BUEJpbmRpbmdfU09BUDEySFRUUF9CSU5ESU5HOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJpbmRpbmcuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKSkgew0KLSAgICAgICAgICAgIHJldHVybiBTT0FQQmluZGluZ19TT0FQMTFIVFRQX01UT01fQklORElORzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiaW5kaW5nLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gU09BUEJpbmRpbmdfU09BUDEySFRUUF9NVE9NX0JJTkRJTkc7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYmluZGluZy5lcXVhbHMoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKSkgew0KLSAgICAgICAgICAgIHJldHVybiBIVFRQQmluZGluZ19IVFRQX0JJTkRJTkc7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYmluZGluZzsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UXVhbGlmaWVkTmFtZUJpbmRpbmdzTWFwKCkgew0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBiaW5kaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLSAgICAgICAgYmluZGluZ3MucHV0KFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsNCi0gICAgICAgIGJpbmRpbmdzLnB1dChTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7DQotICAgICAgICBiaW5kaW5ncy5wdXQoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7DQotICAgICAgICBiaW5kaW5ncy5wdXQoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7DQotICAgICAgICBiaW5kaW5ncy5wdXQoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HLCBIVFRQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmdzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTaG9ydE5hbWVCaW5kaW5nc01hcCgpIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYmluZGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgIGJpbmRpbmdzLnB1dCgiU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HIiwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsNCi0gICAgICAgIGJpbmRpbmdzLnB1dCgiU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HIiwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsNCi0gICAgICAgIGJpbmRpbmdzLnB1dCgiU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkciLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgYmluZGluZ3MucHV0KCJTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORyIsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7DQotICAgICAgICBiaW5kaW5ncy5wdXQoIkhUVFBCaW5kaW5nLkhUVFBfQklORElORyIsIEhUVFBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7DQotICAgICAgICByZXR1cm4gYmluZGluZ3M7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9CaW5kaW5nVHlwZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9CaW5kaW5nVHlwZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2ZmMDg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vQmluZGluZ1R5cGVDb21wbGV0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkltcG9ydFJld3JpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0eWxlZFN0cmluZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLQ0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpDQotcHVibGljIGNsYXNzIEJpbmRpbmdUeXBlQ29tcGxldGlvblByb3Bvc2FsIGV4dGVuZHMgSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXBsYWNlbWVudFN0cmluZzsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZTsNCi0gICAgDQotICAgIHB1YmxpYyBCaW5kaW5nVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LA0KLSAgICAgICAgICAgIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBJbWFnZSBpbWFnZSwgU3R5bGVkU3RyaW5nIGRpc3BsYXlTdHJpbmcsDQotICAgICAgICAgICAgaW50IHJlbGV2YW5jZSwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHJlcGxhY2VtZW50U3RyaW5nLCBjb21waWxhdGlvblVuaXQsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIA0KLSAgICAgICAgCQlyZWxldmFuY2UsIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOw0KLSAgICAgICAgdGhpcy5mdWxseVF1YWxpZmllZFR5cGVOYW1lID0gZnVsbHlRdWFsaWZpZWRUeXBlTmFtZTsNCi0gICAgICAgIHRoaXMucmVwbGFjZW1lbnRTdHJpbmcgPSByZXBsYWNlbWVudFN0cmluZzsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUmVwbGFjZW1lbnRTdHJpbmcoSURvY3VtZW50IGRvY3VtZW50LCBjaGFyIHRyaWdnZXIsIGludCBvZmZzZXQsIA0KLSAgICAgICAgICAgIEltcG9ydFJld3JpdGUgaW1wb3J0UmV3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsNCi0gICAgCQ0KLSAgICAgICAgaWYgKGltcG9ydFJld3JpdGUgIT0gbnVsbCAmJiBmdWxseVF1YWxpZmllZFR5cGVOYW1lICE9IG51bGwgJiYgcmVwbGFjZW1lbnRTdHJpbmcgIT0gbnVsbCkgeyAgICAgICAgDQotICAgICAgICAJaWYgKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUuaW5kZXhPZignLicpICE9IC0xKSB7DQotICAgICAgICAgICAgICAgIElUeXBlW10gdHlwZXM9IGltcG9ydFJld3JpdGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0VHlwZXMoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHR5cGVzLmxlbmd0aCA+IDAgJiYgdHlwZXNbMF0uZ2V0U291cmNlUmFuZ2UoKS5nZXRPZmZzZXQoKSA8PSBvZmZzZXQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW1wb3J0QWRkZWQgPSAhaW1wb3J0UmV3cml0ZS5hZGRJbXBvcnQoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkuZXF1YWxzKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBvcnRBZGRlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgCXNldFJlcGxhY2VtZW50U3RyaW5nKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUNCi0JCQkJCQkJCSsgcmVwbGFjZW1lbnRTdHJpbmcuc3Vic3RyaW5nKHJlcGxhY2VtZW50U3RyaW5nLmxhc3RJbmRleE9mKCcuJykpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbXBvcnRBZGRlZDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1JlcXVlc3RXcmFwcGVyQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vUmVxdWVzdFdyYXBwZXJBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2Y2ZDcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vUmVxdWVzdFdyYXBwZXJBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuaW5pdGlhbGl6YXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5DTEFTU19OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkRPVF9DSEFSQUNURVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuSkFYV1NfU1VCUEFDS0FHRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5MT0NBTF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk9QRVJBVElPTl9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlRBUkdFVF9OQU1FU1BBQ0U7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUmVxdWVzdFdyYXBwZXJBdHRyaWJ1dGVJbml0aWFsaXplciBleHRlbmRzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBU1QgYXN0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZmluZFByaW1hcnlUeXBlKCk7Ci0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBjbGFzc05hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgQ0xBU1NfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3NOYW1lKHR5cGUsIG1ldGhvZCkpOwotCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbG9jYWxOYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIExPQ0FMX05BTUUsCi0gICAgICAgICAgICAgICAgICAgIGdldExvY2FsTmFtZSh0eXBlLCBtZXRob2QpKTsKLQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICAgICBUQVJHRVRfTkFNRVNQQUNFLCBnZXRUYXJnZXROYW1lc3BhY2UodHlwZSkpOwotCi0gICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChjbGFzc05hbWVWYWx1ZVBhaXIpOwotICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobG9jYWxOYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpcnM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcikgewotICAgICAgICAKLSAgICAgICAgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9uUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPigxKTsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gbWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpLmZpbmRQcmltYXJ5VHlwZSgpOwotCi0gICAgICAgICAgICBTdHJpbmcgbWVtYmVyVmFsdWVQYWlyTmFtZSA9IG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpOwotCi0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoQ0xBU1NfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0Q2xhc3NOYW1lKHR5cGUsIG1ldGhvZCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKExPQ0FMX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldExvY2FsTmFtZSh0eXBlLCBtZXRob2QpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhUQVJHRVRfTkFNRVNQQUNFKSkgewotICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChnZXRUYXJnZXROYW1lc3BhY2UodHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21wbGV0aW9uUHJvcG9zYWxzOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKElUeXBlIHR5cGUpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBwYWNrYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWlsZGVyKHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIGlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lLmFwcGVuZChET1RfQ0hBUkFDVEVSKTsgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBwYWNrYWdlTmFtZS5hcHBlbmQoSkFYV1NfU1VCUEFDS0FHRSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lLmFwcGVuZChET1RfQ0hBUkFDVEVSKTsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKElUeXBlIHR5cGUsIElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VOYW1lKHR5cGUpICsgbWV0aG9kTmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKQotICAgICAgICAgICAgICAgICsgbWV0aG9kTmFtZS5zdWJzdHJpbmcoMSkgKyBKQVhXU1V0aWxzLmFjY291bnRGb3JPdmVybG9hZGVkTWV0aG9kcyhtZXRob2QpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExvY2FsTmFtZShJVHlwZSB0eXBlLCBJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKFdlYk1ldGhvZC5jbGFzcywgbWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uLCBPUEVSQVRJT05fTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmdldEVsZW1lbnROYW1lKCkgKyBKQVhXU1V0aWxzLmFjY291bnRGb3JPdmVybG9hZGVkTWV0aG9kcyhtZXRob2QpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZShJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcywgdHlwZSk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uLCBUQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgdGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBKRFRVdGlscy5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUodHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vUmVzcG9uc2VXcmFwcGVyQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vUmVzcG9uc2VXcmFwcGVyQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwMDM3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1Jlc3BvbnNlV3JhcHBlckF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUkVTUE9OU0VfU1VGRklYOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUmVzcG9uc2VXcmFwcGVyQXR0cmlidXRlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBSZXF1ZXN0V3JhcHBlckF0dHJpYnV0ZUluaXRpYWxpemVyIHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKElUeXBlIHR5cGUsIElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpICsgUkVTUE9OU0VfU1VGRklYOwotICAgICAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VOYW1lKHR5cGUpICsgbWV0aG9kTmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKQotICAgICAgICAgICAgICAgICsgbWV0aG9kTmFtZS5zdWJzdHJpbmcoMSkgKyBKQVhXU1V0aWxzLmFjY291bnRGb3JPdmVybG9hZGVkTWV0aG9kcyhtZXRob2QpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExvY2FsTmFtZShJVHlwZSB0eXBlLCBJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKFdlYk1ldGhvZC5jbGFzcywgbWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uLCBPUEVSQVRJT05fTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZSArIFJFU1BPTlNFX1NVRkZJWDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmdldEVsZW1lbnROYW1lKCkgKyBSRVNQT05TRV9TVUZGSVggCi0gICAgICAgICAgICAgICAgICAgICsgSkFYV1NVdGlscy5hY2NvdW50Rm9yT3ZlcmxvYWRlZE1ldGhvZHMobWV0aG9kKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1NPQVBCaW5kaW5nQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vU09BUEJpbmRpbmdBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDExMjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vU09BUEJpbmRpbmdBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBBUkFNRVRFUl9TVFlMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5TVFlMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5VU0U7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ0F0dHJpYnV0ZUluaXRpYWxpemVyIGV4dGVuZHMgQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0TWVtYmVyVmFsdWVQYWlycyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFTVCBhc3QsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgU1RZTEUsIFN0eWxlLkRPQ1VNRU5UKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgVVNFLCBVc2UuTElURVJBTCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgUEFSQU1FVEVSX1NUWUxFLCBQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsKLSAgICAgICAgCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHN0eWxlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodXNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIpOwotICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1dlYk1ldGhvZEF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1dlYk1ldGhvZEF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMWVhOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJNZXRob2RBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuaW5pdGlhbGl6YXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5BQ1RJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZEF0dHJpYnV0ZUluaXRpYWxpemVyIGV4dGVuZHMgQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIHsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBU1QgYXN0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotCi0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gbWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpLmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgb3BlcmF0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIAotICAgICAgICAgICAgICAgICAgICBPUEVSQVRJT05fTkFNRSwgZ2V0T3BlcmF0aW9uTmFtZVZhbHVlKHR5cGUsIG1ldGhvZCkpOwotCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgYWN0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIAotICAgICAgICAgICAgICAgICAgICBBQ1RJT04sIGdldEFjdGlvblZhbHVlKHR5cGUsIG1ldGhvZCkpOwotCi0gICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChvcGVyYXRpb25WYWx1ZVBhaXIpOwotICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoYWN0aW9uVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXJzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpIHsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvblByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKS5maW5kUHJpbWFyeVR5cGUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIG1lbWJlclZhbHVlUGFpck5hbWUgPSBtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKTsKLQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKE9QRVJBVElPTl9OQU1FKSkgewotICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChnZXRPcGVyYXRpb25OYW1lVmFsdWUodHlwZSwgbWV0aG9kKSwgCi0gICAgICAgICAgICAgICAgCQltZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoQUNUSU9OKSkgewotICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChnZXRBY3Rpb25WYWx1ZSh0eXBlLCBtZXRob2QpLAotICAgICAgICAgICAgICAgIAkJbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21wbGV0aW9uUHJvcG9zYWxzOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWVWYWx1ZShJVHlwZSB0eXBlLCBJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpICsgSkFYV1NVdGlscy5hY2NvdW50Rm9yT3ZlcmxvYWRlZE1ldGhvZHMobWV0aG9kKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAJSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QWN0aW9uVmFsdWUoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICByZXR1cm4gInVybjoiICsgbWV0aG9kTmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgbWV0aG9kTmFtZS5zdWJzdHJpbmcoMSkgKyBKQVhXU1V0aWxzLmFjY291bnRGb3JPdmVybG9hZGVkTWV0aG9kcyhtZXRob2QpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgIAlKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJQYXJhbUF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1dlYlBhcmFtQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY5MTZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1dlYlBhcmFtQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuQVJHOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkhFQURFUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk9QRVJBVElPTl9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBBUlRfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UQVJHRVRfTkFNRVNQQUNFOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLQotcHVibGljIGNsYXNzIFdlYlBhcmFtQXR0cmlidXRlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIEFTVCBhc3QsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLQotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRSkgewotICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgcGFyYW1ldGVyID0gKElMb2NhbFZhcmlhYmxlKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIE5BTUUsIGdldE5hbWUocGFyYW1ldGVyKSk7Ci0gICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpIHsKLQotICAgICAgICBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXBsZXRpb25Qcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+KCk7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRSkgewotICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgcGFyYW1ldGVyID0gKElMb2NhbFZhcmlhYmxlKSBqYXZhRWxlbWVudDsKLQotICAgICAgICAgICAgU3RyaW5nIG1lbWJlclZhbHVlUGFpck5hbWUgPSBtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKTsKLQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKE5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldE5hbWUocGFyYW1ldGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhQQVJUX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldFBhcnROYW1lKHBhcmFtZXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoVEFSR0VUX05BTUVTUEFDRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0VGFyZ2V0TmFtZXNwYWNlKHBhcmFtZXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZShJTG9jYWxWYXJpYWJsZSBwYXJhbWV0ZXIpIHsKLSAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgcGFyYW1ldGVyLmdldFBhcmVudCgpOwotICAgICAgICBpZiAoaGFzRG9jdW1lbnRCYXJlU09BUEJpbmRpbmcobWV0aG9kKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdlYk1ldGhvZE9wZXJhdGlvbk5hbWUobWV0aG9kKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG1ldGhvZE5hbWVzID0gQXJyYXlzLmFzTGlzdChtZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gQVJHICsgbWV0aG9kTmFtZXMuaW5kZXhPZihwYXJhbWV0ZXIuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlci5nZXRFbGVtZW50TmFtZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFBhcnROYW1lKElMb2NhbFZhcmlhYmxlIHBhcmFtZXRlcikgewotICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyLAotICAgICAgICAgICAgICAgIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgTkFNRSk7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldE5hbWUocGFyYW1ldGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoSUxvY2FsVmFyaWFibGUgcGFyYW1ldGVyKSB7Ci0gICAgICAgIGlmIChoYXNEb2N1bWVudFdyYXBwZWRTT0FQQmluZGluZyhwYXJhbWV0ZXIpICYmICFpc0hlYWRlcihwYXJhbWV0ZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldERlZmF1bHRUYXJnZXROYW1lc3BhY2UocGFyYW1ldGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0TmFtZXNwYWNlKElMb2NhbFZhcmlhYmxlIHBhcmFtZXRlcikgewotICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBwYXJhbWV0ZXIuZ2V0UGFyZW50KCk7Ci0gICAgICAgIElUeXBlIHR5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOwotICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwKLSAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uLCBUQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZSh0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0hlYWRlcihJTG9jYWxWYXJpYWJsZSBwYXJhbWV0ZXIpIHsKLSAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlciwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCb29sZWFuIGhlYWRlciA9IEFubm90YXRpb25VdGlscy5nZXRCb29sZWFuVmFsdWUoYW5ub3RhdGlvbiwgSEVBREVSKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEb2N1bWVudFdyYXBwZWRTT0FQQmluZGluZyhJTG9jYWxWYXJpYWJsZSBwYXJhbWV0ZXIpIHsKLSAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgcGFyYW1ldGVyLmdldFBhcmVudCgpOwotCi0gICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChhbm5vdGF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIHR5cGVBbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmICh0eXBlQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZCh0eXBlQW5ub3RhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgewotICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oamF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50QmFyZShhbm5vdGF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSAgSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICByZXR1cm4gaGFzRG9jdW1lbnRCYXJlU09BUEJpbmRpbmcobWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V2ViTWV0aG9kT3BlcmF0aW9uTmFtZShJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kLAotICAgICAgICAgICAgICAgIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb24sIE9QRVJBVElPTl9OQU1FKTsKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1dlYlJlc3VsdEF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1dlYlJlc3VsdEF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjU5NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJSZXN1bHRBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuaW5pdGlhbGl6YXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5IRUFERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5PUEVSQVRJT05fTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5QQVJUX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUkVTUE9OU0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUkVUVVJOOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlRBUkdFVF9OQU1FU1BBQ0U7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJSZXN1bHRBdHRyaWJ1dGVJbml0aWFsaXplciBleHRlbmRzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciB7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBqYXZhRWxlbWVudDsKLQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgTkFNRSwgZ2V0TmFtZShtZXRob2QpKTsKLSAgICAgICAgCi0gICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB7Ci0KLSAgICAgICAgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9uUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPigpOwotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGphdmFFbGVtZW50OwotCi0gICAgICAgICAgICBTdHJpbmcgbWVtYmVyVmFsdWVQYWlyTmFtZSA9IG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpOwotCi0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0TmFtZShtZXRob2QpLCBtZW1iZXJWYWx1ZVBhaXIKLSAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKFBBUlRfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0UGFydE5hbWUobWV0aG9kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhUQVJHRVRfTkFNRVNQQUNFKSkgewotICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChnZXRUYXJnZXROYW1lc3BhY2UobWV0aG9kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcGxldGlvblByb3Bvc2FsczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZShJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBpZiAoaGFzRG9jdW1lbnRCYXJlU09BUEJpbmRpbmcobWV0aG9kKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldE9wZXJhdGlvbk5hbWUobWV0aG9kKSArIFJFU1BPTlNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBSRVRVUk47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0T3BlcmF0aW9uTmFtZShJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKFdlYk1ldGhvZC5jbGFzcywgbWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uLCBPUEVSQVRJT05fTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZyhJQW5ub3RhdGFibGUgYW5ub3RhdGFibGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihTT0FQQmluZGluZy5jbGFzcywgYW5ub3RhdGFibGUpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKGFubm90YXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFubm90YXRhYmxlIGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGFubm90YXRhYmxlOwotICAgICAgICAgICAgICAgIHJldHVybiBoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZygoSVR5cGUpIG1ldGhvZC5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFydE5hbWUoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihXZWJSZXN1bHQuY2xhc3MsIG1ldGhvZCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldE5hbWUobWV0aG9kKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgaWYgKGhhc0RvY3VtZW50V3JhcHBlZFNPQVBCaW5kaW5nKG1ldGhvZCkgJiYgIWlzSGVhZGVyKG1ldGhvZCkpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFRhcmdldE5hbWVzcGFjZShtZXRob2QpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEb2N1bWVudFdyYXBwZWRTT0FQQmluZGluZyhJQW5ub3RhdGFibGUgYW5ub3RhdGFibGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihTT0FQQmluZGluZy5jbGFzcywgYW5ub3RhdGFibGUpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRXcmFwcGVkKGFubm90YXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFubm90YXRhYmxlIGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGFubm90YXRhYmxlOwotICAgICAgICAgICAgICAgIHJldHVybiBoYXNEb2N1bWVudFdyYXBwZWRTT0FQQmluZGluZygoSVR5cGUpIG1ldGhvZC5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0hlYWRlcihJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKFdlYlJlc3VsdC5jbGFzcywgbWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBCb29sZWFuIGhlYWRlciA9IEFubm90YXRpb25VdGlscy5nZXRCb29sZWFuVmFsdWUoYW5ub3RhdGlvbiwgSEVBREVSKTsKLSAgICAgICAgICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlci5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRUYXJnZXROYW1lc3BhY2UoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgSVR5cGUgdHlwZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcywgdHlwZSk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uLCBUQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKGdldFBhY2thZ2VOYW1lKHR5cGUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQYWNrYWdlTmFtZShJVHlwZSB0eXBlKSB7Ci0gICAgICAgIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJTZXJ2aWNlQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViU2VydmljZUF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNjM1ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJTZXJ2aWNlQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRU5EUE9JTlRfSU5URVJGQUNFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk5BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUE9SVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBPUlRfU1VGRklYOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNFUlZJQ0VfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5TRVJWSUNFX1NVRkZJWDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UQVJHRVRfTkFNRVNQQUNFOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VBdHRyaWJ1dGVJbml0aWFsaXplciBleHRlbmRzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBU1QgYXN0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICAKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudDsKLSAgICAKLSAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBOQU1FLCBnZXROYW1lKHR5cGUpKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBvcnROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIFBPUlRfTkFNRSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQb3J0TmFtZSh0eXBlKSk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBzZXJ2aWNlTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBTRVJWSUNFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlTmFtZSh0eXBlKSk7Ci0gICAgCi0gICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRBUkdFVF9OQU1FU1BBQ0UsIGdldFRhcmdldE5hbWVzcGFjZSh0eXBlKSk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzQ2xhc3MoKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwb3J0TmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHNlcnZpY2VOYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAJSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB7Ci0KLSAgICAgICAgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9uUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPigpOwotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSkgamF2YUVsZW1lbnQ7Ci0KLSAgICAgICAgICAgIFN0cmluZyBtZW1iZXJWYWx1ZVBhaXJOYW1lID0gbWVtYmVyVmFsdWVQYWlyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhFTkRQT0lOVF9JTlRFUkZBQ0UpKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBnZXRJbnRlcmZhY2VzKHR5cGUpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGFuSW50ZXJmYWNlIDogaW50ZXJmYWNlcykgewotICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoYW5JbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCksIEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTaGFyZWRJbWFnZXMuSU1HX09CSlNfSU5URVJGQUNFKSwgYW5JbnRlcmZhY2UpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0TmFtZSh0eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoUE9SVF9OQU1FKSkgewotICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChnZXRQb3J0TmFtZSh0eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoU0VSVklDRV9OQU1FKSkgewotICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChnZXRTZXJ2aWNlTmFtZSh0eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoVEFSR0VUX05BTUVTUEFDRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0VGFyZ2V0TmFtZXNwYWNlKHR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcGxldGlvblByb3Bvc2FsczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoSVR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gdHlwZS5nZXRFbGVtZW50TmFtZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKElUeXBlIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHR5cGUuZ2V0RWxlbWVudE5hbWUoKSArIFBPUlRfU1VGRklYOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKElUeXBlIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHR5cGUuZ2V0RWxlbWVudE5hbWUoKSArIFNFUlZJQ0VfU1VGRklYOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZShJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBKRFRVdGlscy5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUodHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0SW50ZXJmYWNlcyhJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgSVR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeSh0eXBlLmdldEphdmFQcm9qZWN0KCksIG51bGwpOwotICAgICAgICAgICAgSVR5cGVbXSBhbGxJbnRlcmZhY2VzID0gdHlwZUhpZXJhcmNoeS5nZXRBbGxJbnRlcmZhY2VzKCk7Ci0gICAgICAgICAgICBmb3IgKElUeXBlIGFJbnRlcmZhY2UgOiBhbGxJbnRlcmZhY2VzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhSW50ZXJmYWNlLmlzQmluYXJ5KCkgJiYgYUludGVyZmFjZS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBhSW50ZXJmYWNlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArPSAiLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IHBhY2thZ2VOYW1lICsgYUludGVyZmFjZS5nZXRQcmltYXJ5RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludGVyZmFjZXMuYWRkKHF1YWxpZmllZE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbnRlcmZhY2VzOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgIAlKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvZGlhbG9ncy9IYW5kbGVyQ2hhaW5TZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvZGlhbG9ncy9IYW5kbGVyQ2hhaW5TZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5MjJjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2RpYWxvZ3MvSGFuZGxlckNoYWluU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NIYW5kbGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIEhhbmRsZXJDaGFpblNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0ZJTEVfRVhURU5TSU9OID0gInhtbCI7ICAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIElTdGF0dXMgb2tfc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIEhhbmRsZXJDaGFpblNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotICAgICAgICBzdXBlcihwYXJlbnQsIGxhYmVsUHJvdmlkZXIsIGNvbnRlbnRQcm92aWRlcik7Ci0gICAgICAgIHNldFRpdGxlKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVF9ESUFMT0dfVElUTEUpOwotICAgICAgICBzZXRNZXNzYWdlKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVF9ESUFMT0dfREVTQ1JJUFRJT04pOwotICAgICAgICBzZXRBbGxvd011bHRpcGxlKGZhbHNlKTsKLSAgICAgICAgc2V0VmFsaWRhdG9yKG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGVkID0gc2VsZWN0aW9uWzBdOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgc2VsZWN0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoWE1MX0ZJTEVfRVhURU5TSU9OKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NIYW5kbGVyVXRpbHMuaXNIYW5kbGVyQ2hhaW5GaWxlKGZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBva19zdGF0dXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVF9ESUFMT0dfSU5WQUxJRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2RpYWxvZ3MvTmV3SGFuZGxlckNoYWluRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2RpYWxvZ3MvTmV3SGFuZGxlckNoYWluRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzA1OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9kaWFsb2dzL05ld0hhbmRsZXJDaGFpbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIE5ld0hhbmRsZXJDaGFpbkRpYWxvZyBleHRlbmRzIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGltcGxlbWVudHMgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB7Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgb2tfc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlckNoYWluRmlsZU5hbWUgPSAiaGFuZGxlci1jaGFpbi54bWwiOyAgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIE5ld0hhbmRsZXJDaGFpbkRpYWxvZyhTaGVsbCBwYXJlbnQsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0gICAgICAgICAgICBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBsYWJlbFByb3ZpZGVyLCBjb250ZW50UHJvdmlkZXIpOwotICAgICAgICBzZXRUaXRsZShKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfVElUTEUpOwotICAgICAgICBzZXRNZXNzYWdlKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19ERVNDUklQVElPTik7Ci0gICAgICAgIHNldEFsbG93TXVsdGlwbGUoZmFsc2UpOwotICAgICAgICBzZXRWYWxpZGF0b3IodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICAgIENvbXBvc2l0ZSBmaWxlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgZmlsZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBmaWxlQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBMYWJlbCBoYW5kbGVDaGFpbkxhYmVsID0gbmV3IExhYmVsKGZpbGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgaGFuZGxlQ2hhaW5MYWJlbC5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19GSUxFX05BTUUpOwotICAgICAgICBUZXh0IG5ld0hhbmRsZXJDaGFpblRleHQgPSBuZXcgVGV4dChmaWxlQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQuc2V0VGV4dChoYW5kbGVyQ2hhaW5GaWxlTmFtZSk7Ci0gICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5rZXlSZWxlYXNlZChlKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5GaWxlTmFtZSA9ICgoVGV4dCkgZS53aWRnZXQpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVPS1N0YXR1cygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0pOwotICAgICAgICB1cGRhdGVPS1N0YXR1cygpOwotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotICAgICAgICBpZiAoaGFuZGxlckNoYWluRmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRU5URVJfTkFNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgSVN0YXR1cyByZXN1bHQgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKGhhbmRsZXJDaGFpbkZpbGVOYW1lLCBJUmVzb3VyY2UuRklMRSk7Ci0gICAgICAgIGlmICghcmVzdWx0LmlzT0soKSkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24ubGVuZ3RoID09IDAgfHwgc2VsZWN0aW9uWzBdIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0NIT09TRV9GT0xERVIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFoYW5kbGVyQ2hhaW5GaWxlTmFtZS5lbmRzV2l0aCgiLnhtbCIpKSB7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0lOVkFMSURfTkFNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZ2V0RmlsZVBhdGgoKSk7Ci0gICAgICAgIGlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotICAgICAgICAgICAgaWYgKHBhdGgubGFzdFNlZ21lbnQoKSAhPSBudWxsICYmIHBhdGgubGFzdFNlZ21lbnQoKS5lcXVhbHMoIi54bWwiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRU1QVFlfRklMRV9OQU1FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAod29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0ZJTEVfRVhJU1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkZpbGVOYW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb2tfc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyQ2hhaW5GaWxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCkgewotICAgICAgICBPYmplY3QgZWxlbWVudCA9IGdldEZpcnN0UmVzdWx0KCk7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChJSmF2YVByb2plY3QpIGVsZW1lbnQpLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yQ2hhcgotICAgICAgICAgICAgKyBoYW5kbGVyQ2hhaW5GaWxlTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChJSmF2YUVsZW1lbnQpIGVsZW1lbnQpLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvckNoYXIKLSAgICAgICAgICAgICsgaGFuZGxlckNoYWluRmlsZU5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIHJldHVybiAoKElSZXNvdXJjZSkgZWxlbWVudCkuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBoYW5kbGVyQ2hhaW5GaWxlTmFtZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFuZGxlckNoYWluRmlsZU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9maWx0ZXJzL05ld0hhbmRsZXJDaGFpblZpZXdlckZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9maWx0ZXJzL05ld0hhbmRsZXJDaGFpblZpZXdlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTg1NWFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvZmlsdGVycy9OZXdIYW5kbGVyQ2hhaW5WaWV3ZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTmV3SGFuZGxlckNoYWluVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0ZJTEVfRVhURU5TSU9OID0gInhtbCI7ICAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmlsdGVyRmlsZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZpbHRlckNvbXBpbGF0aW9uVW5pdHM7Ci0KLSAgICBwdWJsaWMgTmV3SGFuZGxlckNoYWluVmlld2VyRmlsdGVyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiBmaWx0ZXJGaWxlcywgYm9vbGVhbiBmaWx0ZXJDb21waWxhdGlvblVuaXRzKSB7Ci0gICAgICAgIHRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLSAgICAgICAgdGhpcy5maWx0ZXJGaWxlcyA9IGZpbHRlckZpbGVzOwotICAgICAgICB0aGlzLmZpbHRlckNvbXBpbGF0aW9uVW5pdHMgPSBmaWx0ZXJDb21waWxhdGlvblVuaXRzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGphdmFQcm9qZWN0LmVxdWFscyhlbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0gICAgICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmaWx0ZXJGaWxlcyAmJiBlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBlbGVtZW50OwotICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmlzQWNjZXNzaWJsZSgpICYmIGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhYTUxfRklMRV9FWFRFTlNJT04pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWZpbHRlckNvbXBpbGF0aW9uVW5pdHMgJiYgZWxlbWVudCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OwotICAgICAgICAgICAgICAgIElUeXBlIHR5cGUgPSBjb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNDbGFzcygpIHx8IHR5cGUuaXNJbnRlcmZhY2UoKSAmJiAhdHlwZS5pc0Fubm90YXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvaGFuZGxlcnMvQ29uZmlndXJlSGFuZGxlckNoYWluSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9oYW5kbGVycy9Db25maWd1cmVIYW5kbGVyQ2hhaW5IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MDY5MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9oYW5kbGVycy9Db25maWd1cmVIYW5kbGVyQ2hhaW5IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkud2l6YXJkcy5Db25maWd1cmVIYW5kbGVyV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbTJSZXNvdXJjZU1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyZUhhbmRsZXJDaGFpbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0gICAgcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKGV2ZW50KTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgICAgICBpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElUeXBlIHR5cGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJV2ViU2VydmljZSB3ZWJTZXJ2aWNlID0gKElXZWJTZXJ2aWNlKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IERvbTJSZXNvdXJjZU1hcHBlci5JTlNUQU5DRS5maW5kVHlwZSh3ZWJTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRG9tMlJlc291cmNlTWFwcGVyLklOU1RBTkNFLmZpbmRUeXBlKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJlSGFuZGxlcldpemFyZCBjb25maWd1cmVIYW5kbGVyV2l6YXJkID0gbmV3IENvbmZpZ3VyZUhhbmRsZXJXaXphcmQodHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZVNoZWxsKGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCBjb25maWd1cmVIYW5kbGVyV2l6YXJkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25BcnJheUNlbGxFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDI0MWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EaWFsb2dDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvblN0YXR1c0RpYWxvZzsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25BcnJheUNlbGxFZGl0b3IgZXh0ZW5kcyBEaWFsb2dDZWxsRWRpdG9yIHsKLSAgICBwcml2YXRlIE1ldGhvZCBtZXRob2Q7Ci0gICAgcHJpdmF0ZSBPYmplY3RbXSB2YWx1ZXM7Ci0KLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiBvcmlnaW5hbFZhbHVlczsKLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiB1cGRhdGVkVmFsdWVzOwotCi0gICAgcHJpdmF0ZSAgQW5ub3RhdGlvbkFycmF5RGlhbG9nIGFubm90YXRpb25BcnJheURpYWxvZzsKLSAgICBwcml2YXRlIGludCBicm93c2VfYnV0dG9uX2NvdW50ID0gMDsKLQotICAgIGJvb2xlYW4gY2FuY2VsbGVkOwotCi0gICAgcHVibGljIEFubm90YXRpb25BcnJheUNlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0W10gdmFsdWVzKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcy5jbG9uZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlbkRpYWxvZ0JveChDb250cm9sIGNlbGxFZGl0b3JXaW5kb3cpIHsKLSAgICAgICAgYW5ub3RhdGlvbkFycmF5RGlhbG9nID0gbmV3IEFubm90YXRpb25BcnJheURpYWxvZyhjZWxsRWRpdG9yV2luZG93LmdldFNoZWxsKCksIHZhbHVlcyk7Ci0gICAgICAgIGludCByZXR1cm5WYWx1ZSA9IGFubm90YXRpb25BcnJheURpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgaWYgKHJldHVyblZhbHVlID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgY2FuY2VsbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkFycmF5RGlhbG9nLmdldFJlc3VsdCgpOwotICAgICAgICB9IGlmIChyZXR1cm5WYWx1ZSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0gICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0gICAgICAgIGlmICh1cGRhdGVkVmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRlbnRzKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3RbXSkgewotICAgICAgICAgICAgT2JqZWN0W10gdmFsdWVzID0gKE9iamVjdFtdKXZhbHVlOwotICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgZ2V0RGVmYXVsdExhYmVsKCkuc2V0VGV4dCgiW117Li4ufSIpOyAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnZXREZWZhdWx0TGFiZWwoKS5zZXRUZXh0KCJbXXt9Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPYmplY3QgZG9HZXRWYWx1ZSgpIHsKLSAgICAgICAgaWYgKGNhbmNlbGxlZCB8fCB1cGRhdGVkVmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFZhbHVlcyAhPSBudWxsID8gb3JpZ2luYWxWYWx1ZXMudG9BcnJheSgpIDogbmV3IE9iamVjdFswXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXBkYXRlZFZhbHVlcy50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9TZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc3VwZXIuZG9TZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIHRoaXMudmFsdWVzID0gKE9iamVjdFtdKXZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQW5ub3RhdGlvbkFycmF5RGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uU3RhdHVzRGlhbG9nIHsKLSAgICAgICAgcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotICAgICAgICBwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0gICAgICAgIHByaXZhdGUgQnV0dG9uIHVwQnV0dG9uOwotICAgICAgICBwcml2YXRlIEJ1dHRvbiBkb3duQnV0dG9uOwotICAgICAgICBwcml2YXRlIFRhYmxlIGFycmF5VmFsdWVzVGFibGU7Ci0gICAgICAgIHByaXZhdGUgVGFibGVWaWV3ZXIgYXJyYXlWYWx1ZXNUYWJsZVZpZXdlcjsKLQotICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIENvbnRyb2w+IGNvbnRyb2xzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb250cm9sPigpOwotCi0gICAgICAgIHB1YmxpYyBBbm5vdGF0aW9uQXJyYXlEaWFsb2coU2hlbGwgcGFyZW50LCBPYmplY3RbXSB2YWx1ZXMpIHsKLSAgICAgICAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKLSAgICAgICAgICAgIHNldFRpdGxlKEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0VESVRfQVJSQVlfVkFMVUVTX1RJVExFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZXMoT2JqZWN0W10gdmFsdWVzKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlZFZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKElBbm5vdGF0aW9uKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbi5nZXRNZW1iZXJWYWx1ZVBhaXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWFwPFN0cmluZyxPYmplY3Q+PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgOiBtZW1iZXJWYWx1ZVBhaXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZW1iZXJOYW1lID0gbWVtYmVyVmFsdWVQYWlyLmdldE1lbWJlck5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1lbWJlclZhbHVlID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbXZwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlS2luZCgpID09IElNZW1iZXJWYWx1ZVBhaXIuS19TVFJJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12cHMucHV0KG1lbWJlck5hbWUsIG1lbWJlclZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWVLaW5kKCkgPT0gSU1lbWJlclZhbHVlUGFpci5LX0NMQVNTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdnBzLnB1dChtZW1iZXJOYW1lLCBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSArICIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFMaXN0LmFkZChtdnBzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxWYWx1ZXMuYWRkKGFMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzLmFkZChhTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhDbGFzcy5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWVzLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nID0gKFN0cmluZyl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWVzLmFkZChzdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFZhbHVlcy5hZGQoc3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAgICAgQ29tcG9zaXRlIG1haW5Db21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLSAgICAgICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDgwMDsKLSAgICAgICAgICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgICAgIENvbXBvc2l0ZSB0eXBlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICAgICAgdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB0eXBlQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBjb21wb25lbnRUeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50VHlwZS5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgIExhYmVsIGNvbXBvbnRUeXBlTGFiZWwgPSBuZXcgTGFiZWwodHlwZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgIGNvbXBvbnRUeXBlTGFiZWwuc2V0VGV4dCgiQCIgKyBjb21wb25lbnRUeXBlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgICAgICAgICBjb21wb250VHlwZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IGNvbXBvbmVudFR5cGUuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0eXBlQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsLnNldFRleHQobWV0aG9kLmdldE5hbWUoKSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlRW50cnlGaWVsZHMobWV0aG9kLCB0eXBlQ29tcG9zaXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHR5cGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICBsYWJlbC5zZXRUZXh0KG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBjcmVhdGVFbnRyeUZpZWxkcyhtZXRob2QsIHR5cGVDb21wb3NpdGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotICAgICAgICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICAgICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgIGFkZEJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0FERF9MQUJFTCk7Ci0gICAgICAgICAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0PEVudHJ5PFN0cmluZywgQ29udHJvbD4+IGVudHJ5U2V0ID0gY29udHJvbHMuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgQ29udHJvbD4+IGl0ZXJhdG9yID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBhTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWFwPFN0cmluZyxPYmplY3Q+PigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBDb250cm9sPiBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgdGV4dEZpZWxkID0gKFRleHQpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIHRleHRGaWVsZC5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VHlwZS5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLnB1dChtZXRob2QuZ2V0TmFtZSgpLCB0ZXh0RmllbGQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFMaXN0LmFkZChtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMuYWRkKHRleHRGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCdXR0b24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgYnV0dG9uLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VHlwZS5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5wdXQobWV0aG9kLmdldE5hbWUoKSwgYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUxpc3QuYWRkKG1lbWJlclZhbHVlUGFpcnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMuYWRkKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMuYWRkKGFMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcnJheVZhbHVlc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgICAgICByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICAgICAgcmVtb3ZlQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfUkVNT1ZFX0xBQkVMKTsKLSAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGFycmF5VmFsdWVzVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gYXJyYXlWYWx1ZXNUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFZhbHVlcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgICAgICB1cEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgICAgICB1cEJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX1VQX0xBQkVMKTsKLSAgICAgICAgICAgIHVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbW92ZVNlbGVjdGVkRWxlbWVtdFVwKGdldFNlbGVjdGVkRWxlbWVudCgpLCBnZXRUYWJsZVZpZXdlcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICB1cEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAgICAgZG93bkJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgICAgICBkb3duQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfRE9XTl9MQUJFTCk7Ci0gICAgICAgICAgICBkb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbW92ZVNlbGVjdGVkRWxlbWVtdERvd24oZ2V0U2VsZWN0ZWRFbGVtZW50KCksIGdldFRhYmxlVmlld2VyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICBkb3duQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgICAgICBDb21wb3NpdGUgdmFsdWVzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotICAgICAgICAgICAgdmFsdWVzQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0gICAgICAgICAgICB2YWx1ZXNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgICAgIExhYmVsIHZhbHVlc0xhYmVsID0gbmV3IExhYmVsKHZhbHVlc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgdmFsdWVzTGFiZWwuc2V0VGV4dChtZXRob2QuZ2V0TmFtZSgpICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICBhcnJheVZhbHVlc1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHZhbHVlc0NvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwKLSAgICAgICAgICAgICAgICAgICAgfCBTV1QuSF9TQ1JPTEwpOwotICAgICAgICAgICAgYXJyYXlWYWx1ZXNUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpc3Q8Pz4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpLmdldFNpbXBsZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25OYW1lICs9ICIoIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXNMaXN0ID0gKExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4pZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlc0l0ZXJhdG9yID0gdmFsdWVzTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlc0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdmFsdWVzTWFwID0gdmFsdWVzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0ID0gdmFsdWVzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gaXRlcmF0b3IgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1N0cmluZyA9IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICYmICF2YWx1ZS50b1N0cmluZygpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRzV2l0aCgiLmNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uTmFtZSArPSBlbnRyeS5nZXRLZXkoKSArICI9XCIiICsgdmFsdWUgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25OYW1lICs9IGVudHJ5LmdldEtleSgpICsgIj0iICsgdmFsdWU7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25OYW1lICs9ICIsICI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbk5hbWUgKz0gIikiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmdldENvbXBvbmVudFR5cGUoKS5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0FOTk9UQVRJT04pOwotICAgICAgICAgICAgICAgICAgICB9IGlmIChyZXR1cm5UeXBlLmVxdWFscyhDbGFzcy5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19DTEFTUyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZJTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGFycmF5VmFsdWVzVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGFycmF5VmFsdWVzVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGl0ZW1Db3VudCA9IGFycmF5VmFsdWVzVGFibGUuZ2V0SXRlbUNvdW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDAgJiYgaXRlbUNvdW50IDw9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgZG93bkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwICYmIGl0ZW1Db3VudCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgZG93bkJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMCAmJiBpbmRleCA8IGl0ZW1Db3VudCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb3duQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4ID09IGl0ZW1Db3VudCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb3duQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBhcnJheVZhbHVlc1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlWYWx1ZXNDb250ZW50UHJvdmlkZXIoKSk7Ci0KLSAgICAgICAgICAgIGFycmF5VmFsdWVzVGFibGUgPSBhcnJheVZhbHVlc1RhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICAgICAgYXJyYXlWYWx1ZXNUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAgICAgYXJyYXlWYWx1ZXNUYWJsZVZpZXdlci5zZXRJbnB1dCh2YWx1ZXMpOwotCi0gICAgICAgICAgICB1cEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIGRvd25CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBtYWluQ29tcG9zaXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY3JlYXRlRW50cnlGaWVsZHMoTWV0aG9kIG1ldGhvZCwgQ29tcG9zaXRlIHR5cGVDb21wb3NpdGUpIHsKLSAgICAgICAgICAgIC8vVE9ETyBIYW5kbGUgRU5VTVMKLSAgICAgICAgICAgIENsYXNzPD8+IHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IG1ldGhvZC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAvL1N0cmluZyBvciBTdHJpbmdbXQotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKFN0cmluZy5jbGFzcykgfHwgcmV0dXJuVHlwZS5pc0FycmF5KCkgJiYgcmV0dXJuVHlwZS5nZXRDb21wb25lbnRUeXBlKCkuZXF1YWxzKFN0cmluZy5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICBUZXh0IHRleHQgPSBuZXcgVGV4dCh0eXBlQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICAgICAgICAgICAgICB0ZXh0LnNldERhdGEobWV0aG9kKTsKLSAgICAgICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgICAgICAgICAgdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZ1tdICYmICgoU3RyaW5nW10pIGRlZmF1bHRWYWx1ZSkubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IChTdHJpbmdbXSkgZGVmYXVsdFZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRUZXh0KHZhbHVlc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldFRleHQoZGVmYXVsdFZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRyb2xzLnB1dChtZXRob2QuZ2V0TmFtZSgpLCB0ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQ2xhc3Mgb3IgQ2xhc3NbXQotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKENsYXNzLmNsYXNzKSB8fCByZXR1cm5UeXBlLmlzQXJyYXkoKSAmJiByZXR1cm5UeXBlLmdldENvbXBvbmVudFR5cGUoKS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQodHlwZUNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgICAgICAgICAgdGV4dC5zZXREYXRhKG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB0ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBjbGFzc1ZhbHVlID0gKENsYXNzPD8+KWRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRUZXh0KGNsYXNzVmFsdWUuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJ1dHRvbiBicm93c2VDbGFzc0J1dHRvbiA9IG5ldyBCdXR0b24odHlwZUNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICAgICAgICAgIGJyb3dzZUNsYXNzQnV0dG9uLnNldFRleHQoZ2V0QnJvd3NlQnV0dG9uTGFiZWwoKSk7Ci0gICAgICAgICAgICAgICAgYnJvd3NlQ2xhc3NCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gZ2V0Q2xhc3NTZWxlY3Rpb25EaWFsb2coKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZShKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9TRUxFQ1RfQ0xBU1NfVElUTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHR5cGVzID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzICE9IG51bGwgJiYgdHlwZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKXR5cGVzWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldFRleHQodHlwZS5nZXRDbGFzc0ZpbGUoKS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIGJyb3dzZV9idXR0b25fY291bnQrKzsKLSAgICAgICAgICAgICAgICBjb250cm9scy5wdXQobWV0aG9kLmdldE5hbWUoKSwgdGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vQm9vbGVhbgotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKEJvb2xlYW4uVFlQRSkpIHsKLSAgICAgICAgICAgICAgICBCdXR0b24gY2hlY2tib3ggPSBuZXcgQnV0dG9uKHR5cGVDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgICAgICAgICAgY2hlY2tib3guc2V0RGF0YShtZXRob2QpOwotICAgICAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgICAgICAgICBjaGVja2JveC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tib3guc2V0U2VsZWN0aW9uKChCb29sZWFuKWRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRyb2xzLnB1dChtZXRob2QuZ2V0TmFtZSgpLCBjaGVja2JveCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRCcm93c2VCdXR0b25MYWJlbCgpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoYnJvd3NlX2J1dHRvbl9jb3VudCkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHJldHVybiBKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9CUk9XU0VfTEFCRUwwOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHJldHVybiBKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9CUk9XU0VfTEFCRUwxOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHJldHVybiBKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9CUk9XU0VfTEFCRUwyOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHJldHVybiBKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9CUk9XU0VfTEFCRUwzOwotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIHJldHVybiBKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9CUk9XU0VfTEFCRUw0OwotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIHJldHVybiBKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9CUk9XU0VfTEFCRUw1OwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQlJPV1NFX0xBQkVMMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRFbGVtZW50KCkgewotICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFycmF5VmFsdWVzVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBhcnJheVZhbHVlc1RhYmxlVmlld2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbW92ZVNlbGVjdGVkRWxlbWVtdFVwKE9iamVjdCBzZWxlY3RlZCwgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIpIHsKLSAgICAgICAgICAgIGludCBzZWxlY3Rpb25JbmRleCA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzLnJlbW92ZShzZWxlY3RlZCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlZFZhbHVlcy5hZGQoc2VsZWN0aW9uSW5kZXggLSAxLCBzZWxlY3RlZCk7Ci0KLSAgICAgICAgICAgICAgICB0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgdGFibGVWaWV3ZXIucmV2ZWFsKHNlbGVjdGVkKTsKLSAgICAgICAgICAgICAgICB0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vdmVTZWxlY3RlZEVsZW1lbXREb3duKE9iamVjdCBzZWxlY3RlZCwgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIpIHsKLSAgICAgICAgICAgIGludCBzZWxlY3Rpb25JbmRleCA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgIGludCBpdGVtQ291bnQgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpOwotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkluZGV4IDwgaXRlbUNvdW50IC0gMSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMucmVtb3ZlKHNlbGVjdGVkKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzLmFkZChzZWxlY3Rpb25JbmRleCArIDEsIHNlbGVjdGVkKTsKLQotICAgICAgICAgICAgICAgIHRhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICB0YWJsZVZpZXdlci5yZXZlYWwoc2VsZWN0ZWQpOwotICAgICAgICAgICAgICAgIHRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBBcnJheVZhbHVlc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgICAgICAgICAgcHVibGljIEFycmF5VmFsdWVzQ29udGVudFByb3ZpZGVyKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVkVmFsdWVzLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2VsZWN0aW9uRGlhbG9nIGdldENsYXNzU2VsZWN0aW9uRGlhbG9nKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coZ2V0U2hlbGwoKSwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpLCBJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAiKiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRSZXN1bHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXBkYXRlZFZhbHVlcy50b0FycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlc3VsdCgpIHsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc0NvbHVtbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzc1NzI2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkudmlld3M7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklTaGFyZWRJbWFnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc0NvbHVtbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBDb2x1bW5MYWJlbFByb3ZpZGVyIHsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgew0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzcykgew0KLSAgICAgICAgICAgIHJldHVybiAoKENsYXNzPD8+KWVsZW1lbnQpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsNCi0gICAgICAgICAgICByZXR1cm4gKChNZXRob2QpZWxlbWVudCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgew0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzcykgew0KLSAgICAgICAgICAgIHJldHVybiBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19BTk5PVEFUSU9OKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kKSB7DQotICAgICAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoDQotICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzLklNR19PQkpfRklMRSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmFsdWVzQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc1ZhbHVlc0NvbHVtbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjZWE5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmFsdWVzQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zVmFsdWVzQ29sdW1uTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIgewotICAgIHByaXZhdGUgVHJlZVZpZXdlciBhbm5vdGF0aW9uVHJlZVZpZXdlcjsKLSAgICBwcml2YXRlIEltYWdlIHRydWVfaW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZSBmYWxzZV9pbWFnZTsKLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uc1ZhbHVlc0NvbHVtbkxhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciBhbm5vdGF0aW9uVHJlZVZpZXdlcikgewotICAgICAgICB0aGlzLmFubm90YXRpb25UcmVlVmlld2VyID0gYW5ub3RhdGlvblRyZWVWaWV3ZXI7Ci0gICAgICAgIHRydWVfaW1hZ2UgPSBKQVhXU1VJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsICJpY29ucy9vYmoxNi90cnVlLmdpZiIpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIGZhbHNlX2ltYWdlID0gSkFYV1NVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELCAiaWNvbnMvb2JqMTYvZmFsc2UuZ2lmIikgLy8kTk9OLU5MUy0xJAotICAgICAgICAuY3JlYXRlSW1hZ2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRUZXh0Rm9yTWV0aG9kKChNZXRob2QpZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dEZvck1ldGhvZChNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0gICAgICAgICAgICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSAoSUphdmFFbGVtZW50KSBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFRleHRGb3JNZXRob2QobWV0aG9kLCBqYXZhRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dEZvck1ldGhvZChNZXRob2QgbWV0aG9kLCBJSmF2YUVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotICAgICAgICBMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25zKGFubm90YXRlZEVsZW1lbnQpOwotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcyA9IG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhkZWNsYXJpbmdDbGFzcy5nZXRTaW1wbGVOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgIHx8IGFubm90YXRpb25OYW1lLmVxdWFscyhkZWNsYXJpbmdDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5vcm1hbEFubm90YXRpb24udmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VGV4dEZvck1ldGhvZChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRUZXh0Rm9yTWV0aG9kKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIHNpbmdsZU1lbWJlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFRleHRGb3JNZXRob2QoQ2xhc3M8Pz4gcmV0dXJuVHlwZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKENsYXNzLmNsYXNzKSkgewotICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24udG9TdHJpbmcoKSArICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKSAmJiAocmV0dXJuVHlwZS5lcXVhbHMoQnl0ZS5UWVBFKQotICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKFNob3J0LlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKEludGVnZXIuVFlQRSkKLSAgICAgICAgICAgICAgICB8fCByZXR1cm5UeXBlLmVxdWFscyhMb25nLlRZUEUpICB8fCByZXR1cm5UeXBlLmVxdWFscyhGbG9hdC5UWVBFKQotICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKERvdWJsZS5UWVBFKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0FycmF5KCkgJiYgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFycmF5SW5pdGlhbGl6ZXIpIHsKLSAgICAgICAgICAgIEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IChBcnJheUluaXRpYWxpemVyKSBleHByZXNzaW9uOwotICAgICAgICAgICAgaWYgKGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJbXXsuLi59IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIltde30iOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBlbnVtVmFsdWUgPSBleHByZXNzaW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gZW51bVZhbHVlLnN1YnN0cmluZyhlbnVtVmFsdWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlRm9yQ2xhc3MoKENsYXNzPD8+KSBlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlRm9yTWV0aG9kKChNZXRob2QpIGVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2VGb3JDbGFzcyhDbGFzczw/PiBhQ2xhc3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotICAgICAgICAgICAgSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gKElKYXZhRWxlbWVudCkgYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZUZvckNsYXNzKGFDbGFzcywgamF2YUVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2VGb3JDbGFzcyhDbGFzczw/PiBhQ2xhc3MsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbnMoamF2YUVsZW1lbnQpOwotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGFDbGFzcy5nZXRTaW1wbGVOYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25OYW1lLmVxdWFscyhhQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlX2ltYWdlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZV9pbWFnZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEltYWdlIGdldEltYWdlRm9yTWV0aG9kKE1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAobWV0aG9kLmdldFJldHVyblR5cGUoKS5lcXVhbHMoQm9vbGVhbi5UWVBFKSAmJiBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0gICAgICAgICAgICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSAoSUphdmFFbGVtZW50KSBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlRm9yTWV0aG9kKG1ldGhvZCwgamF2YUVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2VGb3JNZXRob2QoTWV0aG9kIG1ldGhvZCwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9ucyhqYXZhRWxlbWVudCk7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldFNpbXBsZU5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICAgICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbm9ybWFsQW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEJvb2xlYW5MaXRlcmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoQm9vbGVhbkxpdGVyYWwpIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZV9pbWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzaW5nbGVNZW1iZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCb29sZWFuTGl0ZXJhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoQm9vbGVhbkxpdGVyYWwpIHNpbmdsZU1lbWJlckFubm90YXRpb24uZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZV9pbWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2VfaW1hZ2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICB0cnVlX2ltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgZmFsc2VfaW1hZ2UuZGlzcG9zZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWYWx1ZXNFZGl0aW5nU3VwcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc1ZhbHVlc0VkaXRpbmdTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2NiNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc1ZhbHVlc0VkaXRpbmdTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlNoYXJlZEFTVFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkVkaXRpbmdTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuSVVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1ZhbHVlc0VkaXRpbmdTdXBwb3J0IGV4dGVuZHMgRWRpdGluZ1N1cHBvcnQgewotICAgIHByaXZhdGUgQW5ub3RhdGlvbnNWaWV3IGFubm90YXRpb25zVmlldzsKLSAgICBwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotICAgIHByaXZhdGUgVGV4dENlbGxFZGl0b3IgdGV4dENlbGxFZGl0b3I7Ci0gICAgcHJpdmF0ZSBDaGVja2JveENlbGxFZGl0b3IgY2hlY2tib3hDZWxsRWRpdG9yOwotICAgIHByaXZhdGUgQ29tYm9Cb3hDZWxsRWRpdG9yIGNvbWJvQm94Q2VsbEVkaXRvcjsKLSAgICBwcml2YXRlIENsYXNzRGlhbG9nQ2VsbEVkaXRvciBjbGFzc0RpYWxvZ0NlbGxFZGl0b3I7Ci0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uQXJyYXlDZWxsRWRpdG9yIGFubm90YXRpb25BcnJheUNlbGxFZGl0b3I7Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGlvbnNWYWx1ZXNFZGl0aW5nU3VwcG9ydChBbm5vdGF0aW9uc1ZpZXcgYW5ub3RhdGlvbnNWaWV3LCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgc3VwZXIodHJlZVZpZXdlcik7Ci0gICAgICAgIHRoaXMudHJlZVZpZXdlciA9IHRyZWVWaWV3ZXI7Ci0gICAgICAgIHRoaXMuYW5ub3RhdGlvbnNWaWV3ID0gYW5ub3RhdGlvbnNWaWV3OwotICAgICAgICB0ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0cmVlVmlld2VyLmdldFRyZWUoKSk7Ci0gICAgICAgIGNoZWNrYm94Q2VsbEVkaXRvciA9IG5ldyBDaGVja2JveENlbGxFZGl0b3IodHJlZVZpZXdlci5nZXRUcmVlKCkpOwotICAgICAgICBjb21ib0JveENlbGxFZGl0b3IgPSBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLCBuZXcgU3RyaW5nW10ge30pOwotICAgICAgICBjbGFzc0RpYWxvZ0NlbGxFZGl0b3IgPSBuZXcgQ2xhc3NEaWFsb2dDZWxsRWRpdG9yKHRyZWVWaWV3ZXIuZ2V0VHJlZSgpKTsKLSAgICAgICAgYW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvciA9IG5ldyBBbm5vdGF0aW9uQXJyYXlDZWxsRWRpdG9yKHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLCBuZXcgT2JqZWN0W10ge30pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkVkaXQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKWVsZW1lbnQ7Ci0gICAgICAgICAgICByZXR1cm4gKEJvb2xlYW4pIGdldFZhbHVlKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGVja2JveENlbGxFZGl0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSBlbGVtZW50OwotICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0VudW0oKSkgewotICAgICAgICAgICAgICAgIE9iamVjdFtdIGVudW1Db25zdGFudHMgPSByZXR1cm5UeXBlLmdldEVudW1Db25zdGFudHMoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW2VudW1Db25zdGFudHMubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1Db25zdGFudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gZW51bUNvbnN0YW50c1tpXS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb21ib0JveENlbGxFZGl0b3Iuc2V0SXRlbXModmFsdWVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tYm9Cb3hDZWxsRWRpdG9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKEJvb2xlYW4uVFlQRSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tib3hDZWxsRWRpdG9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzRGlhbG9nQ2VsbEVkaXRvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvci5zZXRNZXRob2QobWV0aG9kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICB0ZXh0Q2VsbEVkaXRvci5zZXRWYWxpZGF0b3IobmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhCeXRlLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUucGFyc2VCeXRlKChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKFNob3J0LlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0LnBhcnNlU2hvcnQoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoSW50ZWdlci5UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKExvbmcuVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5wYXJzZUxvbmcoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoRmxvYXQuVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXQucGFyc2VGbG9hdCgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhEb3VibGUuVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLnBhcnNlRG91YmxlKChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OX0VESVRJTkdfU1VQUE9SVF9OT1RfVkFMSURfTUVTU0FHRV9QUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJldHVyblR5cGUuZ2V0U2ltcGxlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGV4dENlbGxFZGl0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGV4dENlbGxFZGl0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoZWNrYm94Q2VsbEVkaXRvcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUZvckNsYXNzKChDbGFzczw/PikgZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUZvck1ldGhvZCgoTWV0aG9kKSBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZUZvckNsYXNzKENsYXNzPD8+IGFDbGFzcykgewotICAgICAgICBpZiAodHJlZVZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgSUFubm90YXRhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVGb3JDbGFzcyhhQ2xhc3MsIChJQW5ub3RhdGFibGUpIHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWVGb3JDbGFzcyhDbGFzczw/PiBhQ2xhc3MsIElBbm5vdGF0YWJsZSBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gYW5ub3RhdGVkRWxlbWVudC5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgZm9yIChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KChJSmF2YUVsZW1lbnQpYW5ub3RhdGVkRWxlbWVudCwgYW5ub3RhdGlvbk5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGFDbGFzcy5nZXRTaW1wbGVOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGFubm90YXRpb25OYW1lLmVxdWFscyhhQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWVGb3JNZXRob2QoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElBbm5vdGF0YWJsZSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0VmFsdWVGb3JNZXRob2QobWV0aG9kLCAoSUFubm90YXRhYmxlKSB0cmVlVmlld2VyLmdldElucHV0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZUZvck1ldGhvZChNZXRob2QgbWV0aG9kLCBJQW5ub3RhdGFibGUgYW5ub3RhdGVkRWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzPD8+IHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICBJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gYW5ub3RhdGVkRWxlbWVudC5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICBmb3IgKElBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLSAgICAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoZGVjbGFyaW5nQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQotICAgICAgICAgICAgICAgICAgICB8fCBhbm5vdGF0aW9uTmFtZS5lcXVhbHMoZGVjbGFyaW5nQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIElNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbi5nZXRNZW1iZXJWYWx1ZVBhaXJzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXRNZW1iZXJOYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW51bVZhbHVlID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGl0ZXJhbCA9IGVudW1WYWx1ZS5zdWJzdHJpbmcoZW51bVZhbHVlLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGVudW1Db25zdGFudHMgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEVudW1Db25zdGFudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1Db25zdGFudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1Db25zdGFudHNbaV0udG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZUtpbmQoKSA9PSBJTWVtYmVyVmFsdWVQYWlyLktfQ0xBU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJyYXlWYWx1ZXMgPSAoT2JqZWN0W10pbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGFycmF5VmFsdWVzW2ldLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVZhbHVlc1tpXSA9IHZhbHVlICsgIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFZhbHVlRm9yTWV0aG9kKHJldHVyblR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IGdldERlZmF1bHRWYWx1ZUZvck1ldGhvZChDbGFzczw/PiByZXR1cm5UeXBlKSB7Ci0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MgJiYgKChDbGFzczw/PikgZWxlbWVudCkuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzID0KLSAgICAgICAgICAgICAgICAgICAgKENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPikgZWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWVGb3JDbGFzcyhhbm5vdGF0aW9uQ2xhc3MsIChCb29sZWFuKSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgICAgICBzZXRWYWx1ZUZvck1ldGhvZCgoTWV0aG9kKSBlbGVtZW50LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZUZvckNsYXNzKENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MsCi0gICAgICAgICAgICBCb29sZWFuIGFubm90YXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCB2aWV3ZXJJbnB1dCA9IHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKTsKLQotICAgICAgICBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciA9Ci0gICAgICAgICAgICBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhhbm5vdGF0aW9uQ2xhc3MpLmdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpOwotCi0gICAgICAgIGlmICh2aWV3ZXJJbnB1dCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotICAgICAgICAgICAgc2V0VmFsdWVGb3JDbGFzcyhhbm5vdGF0aW9uQ2xhc3MsIGFubm90YXRlLCAoSUphdmFFbGVtZW50KSB2aWV3ZXJJbnB1dCwgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKEFTVCBhc3QsIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MsCi0gICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycykgewotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9ICBudWxsOwotICAgICAgICBpbnQgbnVtYmVyT2ZEZWNsYXJlZE1ldGhvZHMgPSBhbm5vdGF0aW9uQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoOwotICAgICAgICBpZiAobnVtYmVyT2ZEZWNsYXJlZE1ldGhvZHMgPT0gMCkgewotICAgICAgICAgICAgYW5ub3RhdGlvbiA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVNYXJrZXJBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobnVtYmVyT2ZEZWNsYXJlZE1ldGhvZHMgPT0gMSkgewotICAgICAgICAgICAgRXhwcmVzc2lvbiB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlycyAhPSBudWxsICYmIG1lbWJlclZhbHVlUGFpcnMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gbWVtYmVyVmFsdWVQYWlycy5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVNpbmdsZU1lbWJlckFubm90YXRpb24oYXN0LCBhbm5vdGF0aW9uQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFubm90YXRpb24gPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIGFubm90YXRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG51bWJlck9mRGVjbGFyZWRNZXRob2RzID4gMSkgewotICAgICAgICAgICAgYW5ub3RhdGlvbiA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVGb3JDbGFzcyhDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzLAotICAgICAgICAgICAgQm9vbGVhbiBhbm5vdGF0ZSwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcikKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gQW5ub3RhdGlvblV0aWxzLmdldENvbXBpbGF0aW9uVW5pdEZyb21KYXZhRWxlbWVudChqYXZhRWxlbWVudCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0KLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBnZXRNZW1iZXJWYWx1ZVBhaXJzKGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciwgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oYXN0LCBhbm5vdGF0aW9uQ2xhc3MsIG1lbWJlclZhbHVlUGFpcnMpOwotCi0gICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQWRkL1JlbW92ZSBBbm5vdGF0aW9uIiwgKElGaWxlKSBzb3VyY2UuZ2V0UmVzb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgaWYgKGFubm90YXRlKSB7Ci0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTgotICAgICAgICAgICAgICAgICAgICB8fCBqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFCi0gICAgICAgICAgICAgICAgICAgIHx8IGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxECi0gICAgICAgICAgICAgICAgICAgIHx8IGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRAotICAgICAgICAgICAgICAgICAgICB8fCBqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRSkgewotICAgICAgICAgICAgICAgIGNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoamF2YUVsZW1lbnQsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgICAgICBjaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoamF2YUVsZW1lbnQsIGFubm90YXRpb25DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OCi0gICAgICAgICAgICAgICAgICAgIHx8IGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUKLSAgICAgICAgICAgICAgICAgICAgfHwgamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuRklFTEQKLSAgICAgICAgICAgICAgICAgICAgfHwgamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9ECi0gICAgICAgICAgICAgICAgICAgIHx8IGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChqYXZhRWxlbWVudCwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgICAgIGNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdChqYXZhRWxlbWVudCwgYW5ub3RhdGlvbkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgY2hhbmdlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKAotICAgICAgICAgICAgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD9leHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuZ2V0TWVtYmVyVmFsdWVQYWlycyhqYXZhRWxlbWVudCwgYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZUZvck1ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3QgdmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCgoQm9vbGVhbikgZ2V0VmFsdWUobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgT2JqZWN0IHZpZXdlcklucHV0ID0gdHJlZVZpZXdlci5nZXRJbnB1dCgpOwotICAgICAgICAgICAgaWYgKHZpZXdlcklucHV0IGluc3RhbmNlb2YgSUFubm90YXRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgc2V0VmFsdWVGb3JNZXRob2QobWV0aG9kLCB2YWx1ZSwgKElKYXZhRWxlbWVudCkgdmlld2VySW5wdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFZhbHVlRm9yTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdCB2YWx1ZSwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gQW5ub3RhdGlvblV0aWxzLmdldENvbXBpbGF0aW9uVW5pdEZyb21KYXZhRWxlbWVudChqYXZhRWxlbWVudCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0KLSAgICAgICAgVGV4dEZpbGVDaGFuZ2UgY2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKCJBZGQvVXBkYXRlIEFubm90YXRpb24gVmFsdWUiLCAoSUZpbGUpIHNvdXJjZS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9ucyhqYXZhRWxlbWVudCk7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uOwotICAgICAgICAgICAgICAgIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFubm90YXRpb25OYW1lID0gbm9ybWFsQW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoZGVjbGFyaW5nQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSB8fCBhbm5vdGF0aW9uTmFtZS5lcXVhbHMoZGVjbGFyaW5nQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBub3JtYWxBbm5vdGF0aW9uLnZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc01lbWJlclZhbHVlUGFpciA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgOiBtZW1iZXJWYWx1ZVBhaXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUTm9kZSBtZW1iZXJWYWx1ZSA9IGdldE1lbWJlclZhbHVlUGFpclZhbHVlKGFzdCwgbWV0aG9kLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVVwZGF0ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0KG1lbWJlclZhbHVlUGFpciwgbWVtYmVyVmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTWVtYmVyVmFsdWVQYWlyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaGFzTWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gZ2V0TWVtYmVyVmFsdWVQYWlyKGFzdCwgbWV0aG9kLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQobm9ybWFsQW5ub3RhdGlvbiwgbWVtYmVyVmFsdWVQYWlyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhkZWNsYXJpbmdDbGFzcy5nZXRTaW1wbGVOYW1lKCkpIHx8IGFubm90YXRpb25OYW1lLmVxdWFscyhkZWNsYXJpbmdDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBnZXRNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZXRob2QsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRleHRFZGl0KHNpbmdsZU1lbWJlckFubm90YXRpb24sIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBjaGFuZ2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgQVNUTm9kZSBnZXRNZW1iZXJWYWx1ZVBhaXJWYWx1ZShBU1QgYXN0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVCb29sZWFuTGl0ZXJhbChhc3QsICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpCi0gICAgICAgICAgICAgICAgJiYgKHJldHVyblR5cGUuZXF1YWxzKEJ5dGUuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoU2hvcnQuVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKEludGVnZXIuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoTG9uZy5UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmV0dXJuVHlwZS5lcXVhbHMoRmxvYXQuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoRG91YmxlLlRZUEUpKSkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOdW1iZXJMaXRlcmFsKGFzdCwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBpZiAobWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWwoYXN0LCBtZXRob2QsIChPYmplY3RbXSkgdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFycmF5VmFsdWVMaXRlcmFsKGFzdCwgKE9iamVjdFtdKSB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0VudW0oKSkgewotICAgICAgICAgICAgaW50IHNlbGVjdGVkID0gKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPSAtMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bUxpdGVyYWwoYXN0LCBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEVudW1Db25zdGFudHMoKVtzZWxlY3RlZF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVtYmVyVmFsdWVQYWlyIGdldE1lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIG1ldGhvZC5nZXROYW1lKCksIChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWV0aG9kLmdldE5hbWUoKSwgKEJvb2xlYW4pIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpCi0gICAgICAgICAgICAgICAgJiYgKHJldHVyblR5cGUuZXF1YWxzKEJ5dGUuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoU2hvcnQuVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKEludGVnZXIuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoTG9uZy5UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmV0dXJuVHlwZS5lcXVhbHMoRmxvYXQuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoRG91YmxlLlRZUEUpKSkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOdW1iZXJNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZXRob2QuZ2V0TmFtZSgpLCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldENvbXBvbmVudFR5cGUoKS5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVBcnJheU1lbWJlclZhbHVlUGFpcihhc3QsIG1ldGhvZCwgKE9iamVjdFtdKSB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQXJyYXlNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZXRob2QuZ2V0TmFtZSgpLCAoT2JqZWN0W10pIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhDbGFzcy5jbGFzcykpIHsKLSAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlVHlwZU1lbWJlclZhbHVlUGFpcihhc3QsIG1ldGhvZC5nZXROYW1lKCksIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgIGludCBzZWxlY3RlZCA9ICgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCBtZXRob2QuZ2V0TmFtZSgpLCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RW51bUNvbnN0YW50cygpW3NlbGVjdGVkXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSVVuZG9NYW5hZ2VyIG1hbmFnZXIgPSBSZWZhY3RvcmluZ0NvcmUuZ2V0VW5kb01hbmFnZXIoKTsKLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzZnVsID0gZmFsc2U7Ci0gICAgICAgIENoYW5nZSB1bmRvQ2hhbmdlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0gICAgICAgICAgICBSZWZhY3RvcmluZ1N0YXR1cyB2YWxpZCA9IGNoYW5nZS5pc1ZhbGlkKG1vbml0b3IpOwotICAgICAgICAgICAgaWYgKHZhbGlkLmlzT0soKSkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIuYWJvdXRUb1BlcmZvcm1DaGFuZ2UoY2hhbmdlKTsKLSAgICAgICAgICAgICAgICB1bmRvQ2hhbmdlID0gY2hhbmdlLnBlcmZvcm0obW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1hbmFnZXIuY2hhbmdlUGVyZm9ybWVkKGNoYW5nZSwgc3VjY2Vzc2Z1bCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVuZG9DaGFuZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdW5kb0NoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0gICAgICAgICAgICBtYW5hZ2VyLmFkZFVuZG8odW5kb0NoYW5nZS5nZXROYW1lKCksIHVuZG9DaGFuZ2UpOwotICAgICAgICB9Ci0gICAgICAgIGFubm90YXRpb25zVmlldy5yZWZyZXNoTGFiZWxzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZW1iZXJWYWx1ZVBhaXIgY3JlYXRlQXJyYXlNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWV0aG9kLmdldE5hbWUoKSwgY3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWwoYXN0LAotICAgICAgICAgICAgICAgIG1ldGhvZCwgdmFsdWVzKSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBBcnJheUluaXRpYWxpemVyIGNyZWF0ZUFycmF5VmFsdWVMaXRlcmFsKEFTVCBhc3QsIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIHZhbHVlcykgewotICAgICAgICBBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIgPSBhc3QubmV3QXJyYXlJbml0aWFsaXplcigpOwotICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MgPQotICAgICAgICAgICAgICAgICAgICAoQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+KSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldENvbXBvbmVudFR5cGUoKTsKLQotICAgICAgICAgICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgICAgICAgICBMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlc0xpc3QgPSAoTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PikgdmFsdWU7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzSXRlcmF0b3IgPSB2YWx1ZXNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlc0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGFubm90YXRpb25NYXAgPSB2YWx1ZXNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNldDxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0ID0gYW5ub3RhdGlvbk1hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBpdGVyYXRvciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxqYXZhLmxhbmcuU3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lbWJlck5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIGFubm90YXRpb25NZXRob2QgPSBhbm5vdGF0aW9uQ2xhc3MuZ2V0TWV0aG9kKG1lbWJlck5hbWUsIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25NZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWVtYmVyVmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiByZXR1cm5UeXBlID0gYW5ub3RhdGlvbk1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWVtYmVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhCb29sZWFuLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQm9vbGVhbk1lbWJlclZhbHVlUGFpcihhc3QsIG1lbWJlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCb29sZWFuKSBtZW1iZXJWYWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhDbGFzcy5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBtZW1iZXJWYWx1ZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZW1iZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCBjbGFzc05hbWUpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChnZXROdW1iZXJNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZW1iZXJOYW1lLCBtZW1iZXJWYWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhuc21lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJyYXlJbml0aWFsaXplcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWaWV3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNzU1OWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hY3Rpb25zLkFubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkud2lkZ2V0cy5DbGFzc3BhdGhDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOdWxsU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNWaWV3IGV4dGVuZHMgVmlld1BhcnQgaW1wbGVtZW50cyBJTnVsbFNlbGVjdGlvbkxpc3RlbmVyLCBJUGFydExpc3RlbmVyMiB7Ci0gICAgcHJpdmF0ZSBQYWdlQm9vayBwYWdlQm9vazsKLSAgICBwcml2YXRlIFRyZWUgYW5ub3RhdGlvblRyZWU7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBub3RBdmFpYWJsZUNvbXBvc2l0ZTsKLSAgICBwcml2YXRlIENsYXNzcGF0aENvbXBvc2l0ZSBzZXR1cENsYXNzcGF0aENvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgVHJlZVZpZXdlciBhbm5vdGF0aW9uVHJlZVZpZXdlcjsKLQotICAgIHByaXZhdGUgSU1lbWVudG8gbWVtZW50bzsKLQotICAgIHByaXZhdGUgQW5ub3RhdGlvbnNWaWV3RmlsdGVyQWN0aW9uIGFubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbjsKLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uc1ZpZXcoKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgICAgICBhbm5vdGF0aW9uVHJlZSA9IG5ldyBUcmVlKHBhZ2VCb29rLCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTAotICAgICAgICAgICAgICAgIHwgU1dULkhfU0NST0xMKTsKLSAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihhbm5vdGF0aW9uVHJlZSk7Ci0KLSAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uc1ZpZXdDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLmdldFRyZWUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRyZWVWaWV3ZXJDb2x1bW4gYW5ub3RhdGlvbnNWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbihhbm5vdGF0aW9uVHJlZVZpZXdlciwgU1dULk5PTkUpOwotICAgICAgICBhbm5vdGF0aW9uc1ZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uc0NvbHVtbkxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIFRyZWVDb2x1bW4gYW5ub3RhdGlvbnNDb2x1bW4gPSBhbm5vdGF0aW9uc1ZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgYW5ub3RhdGlvbnNDb2x1bW4uc2V0V2lkdGgoNDAwKTsKLSAgICAgICAgYW5ub3RhdGlvbnNDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOwotICAgICAgICBhbm5vdGF0aW9uc0NvbHVtbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19WSUVXX0FOTk9UQVRJT05TX0NPTFVNTl9OQU1FKTsKLQotICAgICAgICBUcmVlVmlld2VyQ29sdW1uIHZhbHVlc1ZpZXdlckNvbHVtbiA9IG5ldyBUcmVlVmlld2VyQ29sdW1uKGFubm90YXRpb25UcmVlVmlld2VyLCBTV1QuTk9ORSk7Ci0gICAgICAgIHZhbHVlc1ZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uc1ZhbHVlc0NvbHVtbkxhYmVsUHJvdmlkZXIoYW5ub3RhdGlvblRyZWVWaWV3ZXIpKTsKLSAgICAgICAgdmFsdWVzVmlld2VyQ29sdW1uLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBBbm5vdGF0aW9uc1ZhbHVlc0VkaXRpbmdTdXBwb3J0KHRoaXMsIGFubm90YXRpb25UcmVlVmlld2VyKSk7Ci0gICAgICAgIFRyZWVDb2x1bW4gdmFsdWVzQ29sdW1uID0gdmFsdWVzVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICB2YWx1ZXNDb2x1bW4uc2V0V2lkdGgoNDAwKTsKLSAgICAgICAgdmFsdWVzQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsKLSAgICAgICAgdmFsdWVzQ29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0gICAgICAgIHZhbHVlc0NvbHVtbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19WSUVXX0FOTk9UQVRJT05TX1ZBTFVFU19DT0xVTU5fTkFNRSk7Ci0KLSAgICAgICAgLy9TZWxlY3Rpb24gU2VydmljZQotICAgICAgICBzdGFydExpc3RlbmluZ0ZvclNlbGVjdGlvbkNoYW5nZXMoKTsKLSAgICAgICAgLy9QYXJ0IFNlcnZpY2UKLSAgICAgICAgZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBjb250cmlidXRlVG9BY3Rpb25CYXJzKCk7Ci0KLSAgICAgICAgbm90QXZhaWFibGVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIG5vdEF2YWlhYmxlQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbm90QXZhaWFibGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIG5vdEF2YWlhYmxlQ29tcG9zaXRlLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZENvbG9yKHBhcmVudCkpOwotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChub3RBdmFpYWJsZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmRDb2xvcihwYXJlbnQpKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTlNfVklFV19BTk5PVEFUSU9OU19OT1RfQVZBSUxBQkxFX09OX1NFTEVDVElPTik7Ci0KLSAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgewotICAgICAgICAgICAgICAgIGlmIChvYmoxIGluc3RhbmNlb2YgQ2xhc3M8Pz4gJiYgKChDbGFzczw/Pikgb2JqMSkuaXNBbm5vdGF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG9iajIgaW5zdGFuY2VvZiBDbGFzczw/PiAmJiAoKENsYXNzPD8+KSBvYmoyKS5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4pIG9iajEpLmdldENhbm9uaWNhbE5hbWUoKS5jb21wYXJlVG8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4pIG9iajIpLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvYmoxIGluc3RhbmNlb2YgTWV0aG9kICYmIG9iajIgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoTWV0aG9kKW9iajEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChNZXRob2Qpb2JqMikuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmoxLCBvYmoyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy9UT0RPIEFkZCBhIEZhY2V0ZWQgUHJvamVjdCBjb21wb3NpdGUKLSAgICAgICAgc2V0dXBDbGFzc3BhdGhDb21wb3NpdGUgPSBuZXcgQ2xhc3NwYXRoQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgcGFnZUJvb2suc2hvd1BhZ2Uobm90QXZhaWFibGVDb21wb3NpdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29sb3IgZ2V0QmFja2dyb3VuZENvbG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaWYgKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEhpZ2hDb250cmFzdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdGFydExpc3RlbmluZ0ZvclNlbGVjdGlvbkNoYW5nZXMoKSB7Ci0gICAgICAgIGdldFZpZXdTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RvcExpc3RlbmluZ0ZvclNlbGVjdGlvbkNoYW5nZXMoKSB7Ci0gICAgICAgIGdldFZpZXdTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLnJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBnZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQotICAgICAgICBpZiAod29ya2JlbmNoUGFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJV29ya2JlbmNoUGFydFJlZmVyZW5jZSB3b3JrYmVuY2hQYXJ0UmVmZXJlbmNlID0gd29ya2JlbmNoUGFnZS5nZXRBY3RpdmVQYXJ0UmVmZXJlbmNlKCk7Ci0KLSAgICAgICAgaWYgKHdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgPT0gbnVsbCB8fCB3b3JrYmVuY2hQYXJ0UmVmZXJlbmNlLmdldElkKCkuZXF1YWxzKGdldFZpZXdTaXRlKCkuZ2V0SWQoKSkKLSAgICAgICAgICAgICAgICB8fCAhd29ya2JlbmNoUGFydFJlZmVyZW5jZS5nZXRJZCgpLmVxdWFscyhKYXZhVUkuSURfQ1VfRURJVE9SKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0KLSAgICAgICAgSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpOwotCi0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBJVGV4dFNlbGVjdGlvbiB0eHRTZWxlY3Rpb24gPSAoVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCkpOwotICAgICAgICAgICAgaWYgKGNvbXBpbGF0aW9uVW5pdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVmlldyhjb21waWxhdGlvblVuaXQsIHR4dFNlbGVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVWaWV3KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotICAgICAgICBUcmVlUGF0aFtdIGV4cGFuZGVkVHJlZVBhdGhzID0gYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRUcmVlUGF0aHMoKTsKLQotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBqYXZhRWxlbWVudC5nZXRKYXZhUHJvamVjdCgpOwotCi0gICAgICAgIGlmICghY2hlY2tDbGFzc3BhdGgoamF2YVByb2plY3QpKSB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAgICAgICAgIHBhZ2VCb29rLnNob3dQYWdlKHNldHVwQ2xhc3NwYXRoQ29tcG9zaXRlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHBhZ2VCb29rLnNob3dQYWdlKGFubm90YXRpb25UcmVlKTsKLQotICAgICAgICBpbnQgb2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdClqYXZhRWxlbWVudDsKLSAgICAgICAgICAgICAgICBqYXZhRWxlbWVudCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRFbGVtZW50QXQob2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldFJlc291cmNlKCkuZ2V0TmFtZSgpLmVxdWFscygicGFja2FnZS1pbmZvLmphdmEiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHNldElucHV0KGphdmFFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5JTVBPUlRfREVDTEFSQVRJT04pIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKLSAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmICghdHlwZS5pc01lbWJlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldElucHV0KHR5cGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldElucHV0KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxEKSB7Ci0gICAgICAgICAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClqYXZhRWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmdldERlY2xhcmluZ1R5cGUoKS5pc01lbWJlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldElucHV0KGZpZWxkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkuaXNNZW1iZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gQW5ub3RhdGlvblV0aWxzLmdldExvY2FsVmFyaWFibGUobWV0aG9kLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxWYXJpYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dChsb2NhbFZhcmlhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldElucHV0KG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRFeHBhbmRlZFRyZWVQYXRocyhleHBhbmRlZFRyZWVQYXRocyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldElucHV0KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRJbnB1dChqYXZhRWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWFubm90YXRpb25UcmVlVmlld2VyLmdldElucHV0KCkuZXF1YWxzKGphdmFFbGVtZW50KSkgewotICAgICAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIuc2V0SW5wdXQoamF2YUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotICAgICAgICBMaXN0PFN0cmluZz4gY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBjYXRlZ29yaWVzLmFkZEFsbChBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvbkNhdGVnb3JpZXMoKSk7Ci0gICAgICAgIFZpZXdlckZpbHRlcltdIHZpZXdlckZpbHRlcnMgPSBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRGaWx0ZXJzKCk7Ci0gICAgICAgIGZvciAoVmlld2VyRmlsdGVyIHZpZXdlckZpbHRlciA6IHZpZXdlckZpbHRlcnMpIHsKLSAgICAgICAgICAgIGlmICh2aWV3ZXJGaWx0ZXIgaW5zdGFuY2VvZiBBbm5vdGF0aW9uc1ZpZXdDYXRlZ29yeUZpbHRlcikgewotICAgICAgICAgICAgICAgIGNhdGVnb3JpZXMucmVtb3ZlQWxsKCgoQW5ub3RhdGlvbnNWaWV3Q2F0ZWdvcnlGaWx0ZXIpdmlld2VyRmlsdGVyKS5nZXRDYXRlZ29yaWVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBqd3NSZWFkeSA9IHRydWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBjYXRlZ29yeSA6IGNhdGVnb3JpZXMpIHsKLSAgICAgICAgICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSBBbm5vdGF0aW9uc01hbmFnZXIKLSAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbnNCeUNhdGVnb3J5KGNhdGVnb3J5KTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYW5ub3RhdGlvbkRlZmluaXRpb25zLmdldCgwKS5nZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGphdmFQcm9qZWN0LmZpbmRUeXBlKGNsYXNzTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBqd3NSZWFkeSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBzZXR1cENsYXNzcGF0aENvbXBvc2l0ZS51cGRhdGVMaWJyYXJ5TGFiZWwoY2F0ZWdvcnkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGp3c1JlYWR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotICAgICAgICBJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0ID0gcGFydFJlZi5nZXRQYXJ0KGZhbHNlKTsKLSAgICAgICAgaWYgKHBhcnRSZWYuZ2V0SWQoKS5lcXVhbHMoSmF2YVVJLklEX0NVX0VESVRPUikpIHsKLSAgICAgICAgICAgIGphdmFFZGl0b3JBY3RpdmF0ZWQoKElFZGl0b3JQYXJ0KSB3b3JrYmVuY2hQYXJ0KTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJ0UmVmLmdldElkKCkuZXF1YWxzKGdldFZpZXdTaXRlKCkuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgIGFubm90YXRpb25zVmlld0FjdGl2YXRlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xlYXJBbm5vdGF0aW9uc1ZpZXcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydFZpc2libGUoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotICAgICAgICBpZiAocGFydFJlZi5nZXRJZCgpLmVxdWFscyhnZXRWaWV3U2l0ZSgpLmdldElkKCkpKSB7Ci0gICAgICAgICAgICBzdGFydExpc3RlbmluZ0ZvclNlbGVjdGlvbkNoYW5nZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnRIaWRkZW4oSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotICAgICAgICBpZiAocGFydFJlZi5nZXRJZCgpLmVxdWFscyhnZXRWaWV3U2l0ZSgpLmdldElkKCkpKSB7Ci0gICAgICAgICAgICBzdG9wTGlzdGVuaW5nRm9yU2VsZWN0aW9uQ2hhbmdlcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgICAgIGlmIChwYXJ0UmVmLmdldElkKCkuZXF1YWxzKEphdmFVSS5JRF9DVV9FRElUT1IpKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Vmlld1NpdGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBnZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICAgICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtiZW5jaFBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKSkuZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKEphdmFVSS5JRF9DVV9FRElUT1IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyQW5ub3RhdGlvbnNWaWV3KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2cocGllLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnRJbnB1dENoYW5nZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjbGVhckFubm90YXRpb25zVmlldygpIHsKLSAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgcGFnZUJvb2suc2hvd1BhZ2Uobm90QXZhaWFibGVDb21wb3NpdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBqYXZhRWRpdG9yQWN0aXZhdGVkKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpIHsKLSAgICAgICAgSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IChJSmF2YUVsZW1lbnQpIGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYWdlQm9vay5zaG93UGFnZShhbm5vdGF0aW9uVHJlZSk7Ci0gICAgICAgICAgICB1cGRhdGVWaWV3KGphdmFFbGVtZW50LCAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0gICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkKGVkaXRvclBhcnQsIHNlbGVjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYW5ub3RhdGlvbnNWaWV3QWN0aXZhdGVkKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IGdldFZpZXdTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgaWYgKGVkaXRvclBhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KS5nZXRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRvckRlc2NyaXB0b3IuZ2V0SWQoKS5lcXVhbHMoSmF2YVVJLklEX0NVX0VESVRPUikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFFZGl0b3JBY3RpdmF0ZWQoZWRpdG9yUGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2cocGllLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgc3RvcExpc3RlbmluZ0ZvclNlbGVjdGlvbkNoYW5nZXMoKTsKLSAgICAgICAgZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlLCBJTWVtZW50byBtZW1lbnRvKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBzdXBlci5pbml0KHNpdGUsIG1lbWVudG8pOwotICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIHN1cGVyLnNhdmVTdGF0ZShtZW1lbnRvKTsKLSAgICAgICAgYW5ub3RhdGlvbnNWaWV3RmlsdGVyQWN0aW9uLnNhdmVTdGF0ZShtZW1lbnRvKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29udHJpYnV0ZVRvQWN0aW9uQmFycygpIHsKLSAgICAgICAgSUFjdGlvbkJhcnMgYmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotICAgICAgICBmaWxsTG9jYWxQdWxsRG93bihiYXJzLmdldE1lbnVNYW5hZ2VyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaWxsTG9jYWxQdWxsRG93bihJTWVudU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICBhbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24gPSBuZXcgQW5ub3RhdGlvbnNWaWV3RmlsdGVyQWN0aW9uKHRoaXMsIGFubm90YXRpb25UcmVlVmlld2VyLAotICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19WSUVXX0ZJTFRFUl9BQ1RJT05fTkFNRSk7Ci0gICAgICAgIGlmIChtZW1lbnRvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbi5pbml0KG1lbWVudG8pOwotICAgICAgICB9Ci0gICAgICAgIG1hbmFnZXIuYWRkKGFubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFzc2luZyB0aGUgZm9jdXMgcmVxdWVzdCB0byB0aGUgdmlld2VyJ3MgY29udHJvbC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaExhYmVscygpIHsKLSAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIucmVmcmVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IGFubm90YXRpb25UcmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCk7Ci0gICAgICAgIGlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRvclBhcnQgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIElERS5nZXRFZGl0b3JEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCkpLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKEphdmFVSS5JRF9DVV9FRElUT1IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRleHRFZGl0b3IgdHh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSB3b3JrYmVuY2hQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIHR4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21waWxhdGlvblVuaXQuaXNDb25zaXN0ZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5tYWtlQ29uc2lzdGVudChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaWV3KGNvbXBpbGF0aW9uVW5pdCwgKElUZXh0U2VsZWN0aW9uKSB0eHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKHBpZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmlld0NhdGVnb3J5RmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmlld0NhdGVnb3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNmFmMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc1ZpZXdDYXRlZ29yeUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1ZpZXdDYXRlZ29yeUZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVRFR09SWSA9ICJBbm5vdGF0aW9uQ2F0ZWdvcnlGaWx0ZXJJbmZvIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FURUdPUllfTkFNRSA9ICJjYXRlZ29yeU5hbWUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIEFubm90YXRpb25zVmlldyBhbm5vdGF0aW9uc1ZpZXc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcjsKLQotICAgIHByaXZhdGUgTGlzdDxPYmplY3Q+IGNhdGVnb3JpZXM7Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGlvbnNWaWV3Q2F0ZWdvcnlGaWx0ZXIoQW5ub3RhdGlvbnNWaWV3IGFubm90YXRpb25zVmlldywgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uc1ZpZXcgPSBhbm5vdGF0aW9uc1ZpZXc7Ci0gICAgICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICAgICAgICBjYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzICYmICgoQ2xhc3M8Pz4pIGVsZW1lbnQpLmlzQW5ub3RhdGlvbigpKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IEFubm90YXRpb25zTWFuYWdlci4KLSAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKChDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4pZWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkRlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAhY2F0ZWdvcmllcy5jb250YWlucyhhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRDYXRlZ29yeSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaWx0ZXJBbm5vdGF0aW9ucyhMaXN0PE9iamVjdD4gY2F0ZWdvcmllcykgewotICAgICAgICB0aGlzLmNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzOwotICAgICAgICBpZiAoY2F0ZWdvcmllcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICB2aWV3ZXIuYWRkRmlsdGVyKHRoaXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmlld2VyLnJlbW92ZUZpbHRlcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBhbm5vdGF0aW9uc1ZpZXcucmVmcmVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0Q2F0ZWdvcmllcygpIHsKLSAgICAgICAgcmV0dXJuIGNhdGVnb3JpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIElNZW1lbnRvIGNhdE1lbWVudG8gPSBtZW1lbnRvLmdldENoaWxkKFRBR19DQVRFR09SWSk7Ci0gICAgICAgIGlmIChjYXRNZW1lbnRvID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uQ2F0ZWdvcmllcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnkgPSBjYXRNZW1lbnRvLmdldFN0cmluZyhUQUdfQ0FURUdPUllfTkFNRSArIGkpOwotICAgICAgICAgICAgaWYgKGNhdGVnb3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmlsdGVyQW5ub3RhdGlvbnMoY2F0ZWdvcmllcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgaWYgKGNhdGVnb3JpZXMgPT0gbnVsbCB8fCBjYXRlZ29yaWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgSU1lbWVudG8gY2F0TWVtZW50byA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoVEFHX0NBVEVHT1JZKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKE9iamVjdCBjYXRlZ29yeSA6IGNhdGVnb3JpZXMpIHsKLSAgICAgICAgICAgIGNhdE1lbWVudG8ucHV0U3RyaW5nKFRBR19DQVRFR09SWV9OQU1FICsgaSwgY2F0ZWdvcnkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmlld0NvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc1ZpZXdDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWEyMmJlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmlld0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zVmlld0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIENsYXNzKSB7Ci0JCQlyZXR1cm4gKChDbGFzczw/PilwYXJlbnRFbGVtZW50KS5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MpIHsKLQkJCXJldHVybiAoKENsYXNzPD8+KWVsZW1lbnQpLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aCA+IDA7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgIT0gbnVsbCAmJiBpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQgJiYgKChJSmF2YUVsZW1lbnQpIGlucHV0RWxlbWVudCkuZXhpc3RzKCkpIHsKLQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IChJSmF2YUVsZW1lbnQpIGlucHV0RWxlbWVudDsKLQkJCXJldHVybiBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvbnMoamF2YUVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQ2xhc3NEaWFsb2dDZWxsRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0NsYXNzRGlhbG9nQ2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmU3ODZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQ2xhc3NEaWFsb2dDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRpYWxvZ0NlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NEaWFsb2dDZWxsRWRpdG9yIGV4dGVuZHMgRGlhbG9nQ2VsbEVkaXRvciB7Ci0KLSAgICBwdWJsaWMgQ2xhc3NEaWFsb2dDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPYmplY3Qgb3BlbkRpYWxvZ0JveChDb250cm9sIGNlbGxFZGl0b3JXaW5kb3cpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZyhjZWxsRWRpdG9yV2luZG93LmdldFNoZWxsKCksIAotICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgU2VhcmNoRW5naW5lLmNyZWF0ZVdvcmtzcGFjZVNjb3BlKCksIElKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTLCAKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsICIqICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSB0eXBlcyA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAodHlwZXMgIT0gbnVsbCAmJiB0eXBlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpdHlwZXNbMF07Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzQmluYXJ5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250ZW50cyhPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldERlZmF1bHRMYWJlbCgpLnNldFRleHQodmFsdWUudG9TdHJpbmcoKSArICIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2V0RGVmYXVsdExhYmVsKCkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2lkZ2V0cy9DbGFzc3BhdGhDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2lkZ2V0cy9DbGFzc3BhdGhDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlNzQ2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpZGdldHMvQ2xhc3NwYXRoQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIEpSRV9QUkVGX1BBR0VfSUQgPSAib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLnByZWZlcmVuY2VzLlZNUHJlZmVyZW5jZVBhZ2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBTdHJpbmcgUFJPUF9JRCA9ICJvcmcuZWNsaXBzZS5qZHQudWkucHJvcGVydHlQYWdlcy5CdWlsZFBhdGhzUHJvcGVydHlQYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgT2JqZWN0IERBVEFfUkVWRUFMX0VOVFJZID0gInNlbGVjdF9jbGFzc3BhdGhfZW50cnkiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIExhYmVsIGluZm9ybWF0aW9uTGFiZWw7Ci0KLSAgICBwdWJsaWMgQ2xhc3NwYXRoQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgYWRkQ29udHJvbHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgICAgIGluZm9ybWF0aW9uTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotICAgICAgICBpbmZvcm1hdGlvbkxhYmVsLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotICAgICAgICBpbmZvcm1hdGlvbkxhYmVsLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1ZJRVdfTk9fU1VJVEFCTEVfTElCUkFSWV9GT1VORCwgIkpBWC1XUyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBMaW5rIGxpbmsgPSBuZXcgTGluayh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxpbmsuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgICAgIGxpbmsuc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuQ09ORklHVVJFX0pBVkFfMV82X0xJQlJBUlkpOwotICAgICAgICBsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25FdmVudCkgewotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25FdmVudC50ZXh0LmVxdWFscygiMSIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBKUkVfUFJFRl9QQUdFX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEpSRV9QUkVGX1BBR0VfSUQgfSwgbnVsbCkub3BlbigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxPYmplY3QsIElDbGFzc3BhdGhFbnRyeT4gZGF0YSA9IG5ldyBIYXNoTWFwPE9iamVjdCwgSUNsYXNzcGF0aEVudHJ5PigpOwotICAgICAgICAgICAgICAgICAgICBkYXRhLnB1dChEQVRBX1JFVkVBTF9FTlRSWSwgSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCkpOwotICAgICAgICAgICAgICAgICAgICBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJvcGVydHlEaWFsb2dPbihnZXRTaGVsbCgpLCBnZXRQcm9qZWN0KCksIFBST1BfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgUFJPUF9JRCB9LCBkYXRhKS5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgLy9UT0RPIHVwZGF0ZSB0aGUgbGFiZWxzIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gZm9yIHN1cHBvcnRlZCBhbm5vdGF0aW9uIGxpYnJhcmllcyB0aGF0IGFyZSBtaXNzaW5nCi0gICAgICAgIC8vb24gdGhlIHNlbGVjdGVkIHByb2plY3RzIGNsYXNzcGF0aC4KLSAgICAgICAgLy9MYWJlbCBvdGhlckxpYnJhcmllc0xhYmVsICA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgLy9vdGhlckxpYnJhcmllc0xhYmVsLnNldEJhY2tncm91bmQoZ2V0UGFyZW50KCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotICAgICAgICAvL290aGVyTGlicmFyaWVzTGFiZWwuc2V0VGV4dCgiQW5ub3RhdGlvbiBMaWJyYXJpZXMgY3VycmVudGx5IHN1cHBvcnRlZDogIiArIEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uQ2F0ZWdvcmllcygpKTsKLSAgICAgICAgLy9vdGhlckxpYnJhcmllc0xhYmVsLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1ZJRVdfT1RIRVJfQU5OT1RBVElPTl9MSUJSQVJJRVNfVVNFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbG9yIGdldEJhY2tncm91bmRDb2xvcigpIHsKLSAgICAgICAgaWYgKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEhpZ2hDb250cmFzdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiAoKEZpbGVFZGl0b3JJbnB1dCkgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkKLSAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpLmdldFByb2plY3QoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUxpYnJhcnlMYWJlbChTdHJpbmcgbGlicmFyeU5hbWUpIHsKLSAgICAgICAgaW5mb3JtYXRpb25MYWJlbC5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19WSUVXX05PX1NVSVRBQkxFX0xJQlJBUllfRk9VTkQsIGxpYnJhcnlOYW1lKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpemFyZHMvQWRkSGFuZGxlckNoYWluUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS93aXphcmRzL0FkZEhhbmRsZXJDaGFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzMzE3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpemFyZHMvQWRkSGFuZGxlckNoYWluUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmRpYWxvZ3MuSGFuZGxlckNoYWluU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5kaWFsb2dzLk5ld0hhbmRsZXJDaGFpbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuZmlsdGVycy5OZXdIYW5kbGVyQ2hhaW5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRIYW5kbGVyQ2hhaW5QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgb2tfc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgSVN0YXR1cyBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgSVN0YXR1cyBlZGl0SGFuZGxlckNoYWluU3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgIHByaXZhdGUgSVR5cGUgdHlwZTsKLQotICAgIHByaXZhdGUgQnV0dG9uIGNyZWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbjsKLSAgICBwcml2YXRlIFRleHQgbmV3SGFuZGxlckNoYWluVGV4dDsKLSAgICBwcml2YXRlIEJ1dHRvbiBicm93c2VOZXdIYW5kbGVyQ2hhaW5CdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBlZGl0SGFuZGxlckNoYWluQnV0dG9uOwotICAgIHByaXZhdGUgVGV4dCBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0OwotICAgIHByaXZhdGUgQnV0dG9uIGJyb3dzZUV4aXN0aW5nSGFuZGxlckNoYWluQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbGVDcmVhdGVkOwotCi0gICAgcHJvdGVjdGVkIEFkZEhhbmRsZXJDaGFpblBhZ2UoSVR5cGUgdHlwZSkgewotICAgICAgICBzdXBlcigiYWRkLmhhbmRsZXJjaGFpbi53aXphcmQucGFnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIHNldFRpdGxlKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19BRERfSEFORExFUl9XSVpBUkRfUEFHRV9USVRMRSk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19BRERfSEFORExFUl9XSVpBUkRfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotICAgICAgICBpbnQgbkNvbHVtbnMgPSA0OwotCi0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucz0gbkNvbHVtbnM7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0gICAgICAgIGNyZWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFKTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0gICAgICAgIGNyZWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0gICAgICAgICAgICAgICAgZW5hYmxlTmV3SGFuZGxlckNoYWluRmlsZVdpZGdldHMoYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICBlbmFibGVFZGl0SGFuZGxlckNoYWluRmlsZVdpZGdldHMoIWJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ29uZmlndXJlSGFuZGxlclN0YXR1cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBMYWJlbCBjcmVhdGVOZXdIYW5kbGVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGNyZWF0ZU5ld0hhbmRsZXJMYWJlbC5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRklMRV9QQVRIMSk7Ci0KLSAgICAgICAgbmV3SGFuZGxlckNoYWluVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0LnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0gICAgICAgIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgbmV3SGFuZGxlckNoYWluVGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ29uZmlndXJlSGFuZGxlclN0YXR1cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBicm93c2VOZXdIYW5kbGVyQ2hhaW5CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICBicm93c2VOZXdIYW5kbGVyQ2hhaW5CdXR0b24uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0JST1dTRTEpOwotICAgICAgICBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGJyb3dzZU5ld0hhbmRsZXJDaGFpbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgYnJvd3NlTmV3SGFuZGxlckNoYWluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBOZXdIYW5kbGVyQ2hhaW5EaWFsb2cgZGlhbG9nID0gbmV3IE5ld0hhbmRsZXJDaGFpbkRpYWxvZyhnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLCBuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0SW5wdXQoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuYWRkRmlsdGVyKG5ldyBOZXdIYW5kbGVyQ2hhaW5WaWV3ZXJGaWx0ZXIodHlwZS5nZXRKYXZhUHJvamVjdCgpLCB0cnVlLCB0cnVlKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQuc2V0VGV4dChkaWFsb2cuZ2V0RmlsZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLSAgICAgICAgZWRpdEhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ0hPT1NFKTsKLSAgICAgICAgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0gICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgYWRkVG9IYW5kbGVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGFkZFRvSGFuZGxlckxhYmVsLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9GSUxFX1BBVEgzKTsKLQotICAgICAgICBlZGl0SGFuZGxlckNoYWluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDb25maWd1cmVIYW5kbGVyU3RhdHVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZXhpc2l0aW5nSGFuZGxlckNoYWluVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0LnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0gICAgICAgIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGV4aXNpdGluZ0hhbmRsZXJDaGFpblRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGV4aXNpdGluZ0hhbmRsZXJDaGFpblRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBicm93c2VFeGlzdGluZ0hhbmRsZXJDaGFpbkJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgIGJyb3dzZUV4aXN0aW5nSGFuZGxlckNoYWluQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9CUk9XU0UyKTsKLSAgICAgICAgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYnJvd3NlRXhpc3RpbmdIYW5kbGVyQ2hhaW5CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgYnJvd3NlRXhpc3RpbmdIYW5kbGVyQ2hhaW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgSGFuZGxlckNoYWluU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCksIG5ldyBTdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyKCkpOwotCi0gICAgICAgICAgICAgICAgZGlhbG9nLnNldElucHV0KEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLmFkZEZpbHRlcihuZXcgTmV3SGFuZGxlckNoYWluVmlld2VyRmlsdGVyKHR5cGUuZ2V0SmF2YVByb2plY3QoKSwgZmFsc2UsIHRydWUpKTsKLQotICAgICAgICAgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHJlc3VsdFswXTsKLSAgICAgICAgICAgICAgICAgICAgZXhpc2l0aW5nSGFuZGxlckNoYWluVGV4dC5zZXRUZXh0KHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29uZmlndXJlSGFuZGxlclN0YXR1cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLQotICAgICAgICBzZXRJbml0aWFsU2VsZWN0aW9uKCk7Ci0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbigpIHsKLSAgICAgICAgSVBhdGggaGFuZGxlckNoYWluUGF0aCA9IG5ldyBQYXRoKHR5cGUuZ2V0UmVzb3VyY2UoKS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkKLSAgICAgICAgICAgICAgICArICJoYW5kbGVyLWNoYWluLnhtbCIpOwotICAgICAgICBJUmVzb3VyY2UgaGFuZGxlckNoYWluID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGhhbmRsZXJDaGFpblBhdGgpOwotICAgICAgICBpZiAoaGFuZGxlckNoYWluLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBlZGl0SGFuZGxlckNoYWluQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgIGV4aXNpdGluZ0hhbmRsZXJDaGFpblRleHQuc2V0VGV4dChoYW5kbGVyQ2hhaW5QYXRoLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgZW5hYmxlTmV3SGFuZGxlckNoYWluRmlsZVdpZGdldHMoZmFsc2UpOwotICAgICAgICAgICAgZW5hYmxlRWRpdEhhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQuc2V0VGV4dChoYW5kbGVyQ2hhaW5QYXRoLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgZW5hYmxlTmV3SGFuZGxlckNoYWluRmlsZVdpZGdldHModHJ1ZSk7Ci0gICAgICAgICAgICBlbmFibGVFZGl0SGFuZGxlckNoYWluRmlsZVdpZGdldHMoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlQ3JlYXRlZChib29sZWFuIGZpbGVDcmVhdGVkKSB7Ci0gICAgICAgIHRoaXMuZmlsZUNyZWF0ZWQgPSBmaWxlQ3JlYXRlZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgICAgICBpZiAodmlzaWJsZSAmJiBmaWxlQ3JlYXRlZCkgewotICAgICAgICAgICAgKChDb25maWd1cmVIYW5kbGVyV2l6YXJkKSBnZXRXaXphcmQoKSkuZGVsZXRlRmlsZShuZXcgUGF0aChnZXROZXdIYW5kbGVyQ2hhaW5QYXRoKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmFibGVFZGl0SGFuZGxlckNoYWluRmlsZVdpZGdldHMoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgZXhpc2l0aW5nSGFuZGxlckNoYWluVGV4dC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIGJyb3dzZUV4aXN0aW5nSGFuZGxlckNoYWluQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5hYmxlTmV3SGFuZGxlckNoYWluRmlsZVdpZGdldHMoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgbmV3SGFuZGxlckNoYWluVGV4dC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIGJyb3dzZU5ld0hhbmRsZXJDaGFpbkJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDcmVhdGVIYW5kbGVyQ2hhaW4oKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVIYW5kbGVyQ2hhaW5CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFZGl0SGFuZGxlckNoYWluKCkgewotICAgICAgICByZXR1cm4gZWRpdEhhbmRsZXJDaGFpbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5ld0hhbmRsZXJDaGFpblBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBuZXdIYW5kbGVyQ2hhaW5UZXh0LmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4aXN0aW5nSGFuZGxlckNoYWluUGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGV4aXNpdGluZ0hhbmRsZXJDaGFpblRleHQuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb25maWd1cmVIYW5kbGVyU3RhdHVzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsaWRhdGVOZXdIYW5kbGVyQ2hhaW5GaWVsZCgpOwotICAgICAgICAgICAgdmFsaWRhdGVFeGlzdGluZ0hhbmRsZXJDaGFpbkZpZWxkKCk7Ci0gICAgICAgICAgICBpZiAoYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSyB8fCBlZGl0SGFuZGxlckNoYWluU3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSykgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShmaW5kTW9zdFNldmVyZSgpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyBmaW5kTW9zdFNldmVyZSgpIHsKLSAgICAgICAgaWYgKGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cy5nZXRTZXZlcml0eSgpID4gZWRpdEhhbmRsZXJDaGFpblN0YXR1cy5nZXRTZXZlcml0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlZGl0SGFuZGxlckNoYWluU3RhdHVzLmdldFNldmVyaXR5KCkgPiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMuZ2V0U2V2ZXJpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cy5nZXRTZXZlcml0eSgpID09IGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXMuZ2V0U2V2ZXJpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlTmV3SGFuZGxlckNoYWluRmllbGQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzQ3JlYXRlSGFuZGxlckNoYWluKCkpIHsKLSAgICAgICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXMgPSBva19zdGF0dXM7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3SGFuZGxlckNoYWluUGF0aCA9IGdldE5ld0hhbmRsZXJDaGFpblBhdGgoKS50cmltKCk7Ci0gICAgICAgICAgICBpZiAobmV3SGFuZGxlckNoYWluUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX05FV19IQU5ETEVSX1BBVEhfRU1UUFkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW5ld0hhbmRsZXJDaGFpblBhdGguZW5kc1dpdGgoIi54bWwiKSkgeyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0lOVkFMSURfTkFNRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChuZXdIYW5kbGVyQ2hhaW5QYXRoKTsKLSAgICAgICAgICAgIGlmIChwYXRoLnNlZ21lbnRDb3VudCgpID49IDIpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBzZWdtZW5ldHMgPSBwYXRoLnNlZ21lbnRzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZWdtZW5ldHNbMF0uZXF1YWxzKHR5cGUuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9QUk9KRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpblNvdXJjZUZvbGRlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSB0eXBlLmdldEphdmFQcm9qZWN0KCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgOiBwYWNrYWdlRnJhZ21lbnRSb290cykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVuZXRzWzFdLmVxdWFscyhwYWNrYWdlRnJhZ21lbnRSb290LmdldEVsZW1lbnROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpblNvdXJjZUZvbGRlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWluU291cmNlRm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5iaW5kKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19GSUxFX1BST0pFQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGF0aC5sYXN0U2VnbWVudCgpICE9IG51bGwgJiYgcGF0aC5sYXN0U2VnbWVudCgpLmVxdWFscygiLnhtbCIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0VNUFRZX0ZJTEVfTkFNRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5iaW5kKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19GSUxFX1BST0pFQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIElSZXNvdXJjZSByZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IG51bGwgJiYgcmVzLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9FWElTVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG9rX3N0YXR1czsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBva19zdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVFeGlzdGluZ0hhbmRsZXJDaGFpbkZpZWxkKCkgewotICAgICAgICBpZiAoaXNFZGl0SGFuZGxlckNoYWluKCkpIHsKLSAgICAgICAgICAgIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG9rX3N0YXR1czsKLSAgICAgICAgICAgIFN0cmluZyBleGlzdGluZ0hhbmRsZXJDaGFpblBhdGggPSBnZXRFeGlzdGluZ0hhbmRsZXJDaGFpblBhdGgoKS50cmltKCk7Ci0gICAgICAgICAgICBpZiAoZXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWRpdEhhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0VYSVNUSU5HX0hBTkRMRVJfUEFUSF9FTVRQWSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoLmVuZHNXaXRoKCIueG1sIikpIHsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm4gZWRpdEhhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfSU5WQUxJRF9OQU1FKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoKTsKLQotICAgICAgICAgICAgaWYgKHBhdGguc2VnbWVudENvdW50KCkgPj0gMikgewotICAgICAgICAgICAgICAgIGlmIChwYXRoLmxhc3RTZWdtZW50KCkgIT0gbnVsbCAmJiBwYXRoLmxhc3RTZWdtZW50KCkuZXF1YWxzKCIueG1sIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRU1QVFlfRklMRV9OQU1FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXRoLnNlZ21lbnRDb3VudCgpID49IDIgJiYgcGF0aC5zZWdtZW50KDApLmVxdWFscyh0eXBlLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXMgPSBva19zdGF0dXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBlZGl0SGFuZGxlckNoYWluU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5iaW5kKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVF9GSUxFX05PVF9GT1VORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZWRpdEhhbmRsZXJDaGFpblN0YXR1cyA9IG9rX3N0YXR1czsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS93aXphcmRzL0NvbmZpZ3VyZUhhbmRsZXJXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2l6YXJkcy9Db25maWd1cmVIYW5kbGVyV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZjdlODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS93aXphcmRzL0NvbmZpZ3VyZUhhbmRsZXJXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NIYW5kbGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJlSGFuZGxlcldpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0gICAgcHJpdmF0ZSBBZGRIYW5kbGVyQ2hhaW5QYWdlIGFkZEhhbmRsZXJDaGFpblBhZ2U7Ci0gICAgcHJpdmF0ZSBPcmRlckhhbmRsZXJDaGFpblBhZ2Ugb3JkZXJIYW5kbGVyQ2hhaW5QYWdlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbGVDcmVhdGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBhZGRBbm5vdGF0aW9uOwotCi0gICAgcHJpdmF0ZSBJUGF0aCBoYW5kbGVyQ2hhaW5QYXRoOwotICAgIHByaXZhdGUgSVR5cGUgdHlwZTsKLQotICAgIHB1YmxpYyBDb25maWd1cmVIYW5kbGVyV2l6YXJkKElUeXBlIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgc2V0V2luZG93VGl0bGUoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0NPTkZJR1VSRV9IQU5ETEVSX1dJWkFSRF9USVRMRSk7Ci0gICAgICAgIC8vVE9ETyByZXBsYWNlIHdpdGggZGVkaWNhdGVkIGhhbmRsZXIgd2l6YmFuCi0gICAgICAgIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEpBWFdTVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCIkbmwkL2ljb25zL3dpemJhbi9uZXdfd2l6LnBuZyIpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaGFuZGxlckNoYWluUGF0aCA9IGdldEhhbmRsZXJDaGFpblBhdGgodHlwZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0gICAgICAgIGlmIChhZGRIYW5kbGVyQ2hhaW5QYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIGFkZEhhbmRsZXJDaGFpblBhZ2UgPSBuZXcgQWRkSGFuZGxlckNoYWluUGFnZSh0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob3JkZXJIYW5kbGVyQ2hhaW5QYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIG9yZGVySGFuZGxlckNoYWluUGFnZSA9IG5ldyBPcmRlckhhbmRsZXJDaGFpblBhZ2UoaGFuZGxlckNoYWluUGF0aCwgdHlwZS5nZXRKYXZhUHJvamVjdCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGFuZGxlckNoYWluUGF0aCAhPSBudWxsICYmIGhhbmRsZXJDaGFpblBhdGguaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhZGRQYWdlKGFkZEhhbmRsZXJDaGFpblBhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIGFkZFBhZ2Uob3JkZXJIYW5kbGVyQ2hhaW5QYWdlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotICAgICAgICBpZiAocGFnZSA9PSBhZGRIYW5kbGVyQ2hhaW5QYWdlICYmIGFkZEhhbmRsZXJDaGFpblBhZ2UuaXNQYWdlQ29tcGxldGUoKSkgewotICAgICAgICAgICAgaWYgKGFkZEhhbmRsZXJDaGFpblBhZ2UuaXNDcmVhdGVIYW5kbGVyQ2hhaW4oKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpblBhdGggPSBuZXcgUGF0aChhZGRIYW5kbGVyQ2hhaW5QYWdlLmdldE5ld0hhbmRsZXJDaGFpblBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgb3JkZXJIYW5kbGVyQ2hhaW5QYWdlLnNldEhhbmRsZXJDaGFpblBhdGgoaGFuZGxlckNoYWluUGF0aCk7Ci0gICAgICAgICAgICAgICAgYWRkQW5ub3RhdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZmlsZUNyZWF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFkZEhhbmRsZXJDaGFpblBhZ2Uuc2V0RmlsZUNyZWF0ZWQoZmlsZUNyZWF0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFkZEhhbmRsZXJDaGFpblBhZ2UuaXNFZGl0SGFuZGxlckNoYWluKCkpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5QYXRoID0gbmV3IFBhdGgoYWRkSGFuZGxlckNoYWluUGFnZS5nZXRFeGlzdGluZ0hhbmRsZXJDaGFpblBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgb3JkZXJIYW5kbGVyQ2hhaW5QYWdlLnNldEhhbmRsZXJDaGFpblBhdGgoaGFuZGxlckNoYWluUGF0aCk7Ci0gICAgICAgICAgICAgICAgYWRkQW5ub3RhdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZmlsZUNyZWF0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBhZGRIYW5kbGVyQ2hhaW5QYWdlLnNldEZpbGVDcmVhdGVkKGZpbGVDcmVhdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmV4dFBhZ2UocGFnZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJUGF0aCBnZXRIYW5kbGVyQ2hhaW5QYXRoKElUeXBlIHR5cGUpIHsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgQW5ub3RhdGlvbiBoYW5kbGVyQ2hhaW4gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBIYW5kbGVyQ2hhaW4uY2xhc3MpOwotICAgICAgICAgICAgaWYgKGhhbmRsZXJDaGFpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoaGFuZGxlckNoYWluLCAiZmlsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGUuc3RhcnRzV2l0aCgiLi4vIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0UGF0aCgpLmFwcGVuZChuZXcgUGF0aChmaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluZEhhbmRsZXJDaGFpblBhdGgoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFBhdGguRU1QVFk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJUGF0aCBmaW5kSGFuZGxlckNoYWluUGF0aChTdHJpbmcgZmlsZSkgewotICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IHR5cGUuZ2V0UmVzb3VyY2UoKS5nZXRQYXJlbnQoKTsKLSAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3aGlsZShmaWxlLnN0YXJ0c1dpdGgoIi4uLyIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBmaWxlID0gZmlsZS5zdWJzdHJpbmcoMyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgaGFuZGxlckNoYWluRmlsZSA9IGNvbnRhaW5lci5maW5kTWVtYmVyKGZpbGUpOwotICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyQ2hhaW5GaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJDaGFpbkZpbGUuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFBhdGguRU1QVFk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBudWxsOwotICAgICAgICAgICAgSm9iIGpvYiA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudEpvYigpOwotICAgICAgICAgICAgaWYgKGpvYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcnVsZSA9IGpvYi5nZXRSdWxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJ1bGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24ocnVsZSkgewotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZGRBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJRmlsZSBoYW5kbGVyQ2hhaW5GaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGhhbmRsZXJDaGFpblBhdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkkgcmVsYXRpdmVVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkuZGVyZXNvbHZlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHR5cGUuZ2V0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5zZXRTb3VyY2UoY29tcGlsYXRpb25Vbml0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IChDb21waWxhdGlvblVuaXQpcGFyc2VyLmNyZWF0ZUFTVChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgZmlsZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGN1LmdldEFTVCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSIsIHJlbGF0aXZlVVJJLnRvRmlsZVN0cmluZygpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGZpbGVQYWlyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gaGFuZGxlckNoYWluQW5ub3RhdGlvbiA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGN1LmdldEFTVCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRBbm5vdGF0aW9uKHR5cGUsIGhhbmRsZXJDaGFpbkFubm90YXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEltcG9ydCh0eXBlLCBIYW5kbGVyQ2hhaW4uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBKQVhXU0hhbmRsZXJVdGlscy53cml0ZURvY3VtZW50VG9GaWxlKGhhbmRsZXJDaGFpblBhdGgsIG9yZGVySGFuZGxlckNoYWluUGFnZS5nZXREb2N1bWVudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW5JblVJKGdldENvbnRhaW5lcigpLCB3b3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24sIHJ1bGUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coaXRlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAgKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhpZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlRmlsZShJUGF0aCBmaWxlUGF0aCkgewotICAgICAgICBJRmlsZSBoYW5kbGVyRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0gICAgICAgIGlmIChoYW5kbGVyRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyRmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0gICAgICAgIGlmIChmaWxlQ3JlYXRlZCkgewotICAgICAgICAgICAgSVBhdGggZmlsZVBhdGggPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldFBhdGgoKS5hcHBlbmQobmV3IFBhdGgoImhhbmRsZXItY2hhaW4ueG1sIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBkZWxldGVGaWxlKGZpbGVQYXRoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIucGVyZm9ybUNhbmNlbCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS93aXphcmRzL05ld0pBWFdTSGFuZGxlcldpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS93aXphcmRzL05ld0pBWFdTSGFuZGxlcldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDU5MjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2l6YXJkcy9OZXdKQVhXU0hhbmRsZXJXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NIYW5kbGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld1Jlc291cmNlV2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgTmV3SkFYV1NIYW5kbGVyV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0gICAgcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLSAgICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICAgIHByaXZhdGUgTmV3SkFYV1NIYW5kbGVyV2l6YXJkUGFnZSBoYW5kbGVyV2l6YXJkUGFnZTsKLSAgICBwcml2YXRlIE9yZGVySGFuZGxlckNoYWluUGFnZSBoYW5kbGVyT3JkZXJQYWdlOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0gICAgICAgIGlmIChoYW5kbGVyV2l6YXJkUGFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVyV2l6YXJkUGFnZT0gbmV3IE5ld0pBWFdTSGFuZGxlcldpemFyZFBhZ2UoKTsKLSAgICAgICAgICAgIGhhbmRsZXJXaXphcmRQYWdlLmluaXQoZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhbmRsZXJPcmRlclBhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaGFuZGxlck9yZGVyUGFnZSA9IG5ldyBPcmRlckhhbmRsZXJDaGFpblBhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBhZGRQYWdlKGhhbmRsZXJXaXphcmRQYWdlKTsKLSAgICAgICAgYWRkUGFnZShoYW5kbGVyT3JkZXJQYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmV3SkFYV1NIYW5kbGVyV2l6YXJkKCkgewotICAgICAgICBzZXRXaW5kb3dUaXRsZShKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9XSVpBUkRfVElUTEUpOwotICAgICAgICAvL1RPRE8gcmVwbGFjZSB3aXRoIGRlZGljYXRlZCBoYW5kbGVyIHdpemJhbgotICAgICAgICBzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKQVhXU1VJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiJG5sJC9pY29ucy93aXpiYW4vbmV3X3dpei5wbmciKSk7ICAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgaWYgKHBhZ2UgPT0gaGFuZGxlcldpemFyZFBhZ2UgJiYgaGFuZGxlcldpemFyZFBhZ2UuaXNDb25maWd1cmVIYW5kbGVyQ2hhaW4oKSAmJiBoYW5kbGVyV2l6YXJkUGFnZS5pc0VkaXRIYW5kbGVyQ2hhaW4oKSkgewotICAgICAgICAgICAgaGFuZGxlck9yZGVyUGFnZS5zZXRKYXZhUHJvamVjdChoYW5kbGVyV2l6YXJkUGFnZS5nZXRKYXZhUHJvamVjdCgpKTsKLSAgICAgICAgICAgIElQYXRoIGhhbmRsZXJDaGFpblBhdGggPSBuZXcgUGF0aChoYW5kbGVyV2l6YXJkUGFnZS5nZXRFeGlzdGluZ0hhbmRsZXJDaGFpblBhdGgoKSk7Ci0gICAgICAgICAgICBoYW5kbGVyT3JkZXJQYWdlLnNldElucHV0KGhhbmRsZXJDaGFpblBhdGgpOwotICAgICAgICAgICAgaGFuZGxlck9yZGVyUGFnZS5hZGRIYW5kbGVyKGhhbmRsZXJXaXphcmRQYWdlLmdldFR5cGVOYW1lKCksIGhhbmRsZXJXaXphcmRQYWdlLmdldFBhY2thZ2VUZXh0KCksIGhhbmRsZXJXaXphcmRQYWdlLmdldFNlbGVjdGVkSGFuZGxlclR5cGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlck9yZGVyUGFnZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IG51bGw7Ci0gICAgICAgICAgICBKb2Igam9iID0gSm9iLmdldEpvYk1hbmFnZXIoKS5jdXJyZW50Sm9iKCk7Ci0gICAgICAgICAgICBpZiAoam9iICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBydWxlID0gam9iLmdldFJ1bGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcnVsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gd29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihydWxlKSB7Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyV2l6YXJkUGFnZS5jcmVhdGVUeXBlKG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gaGFuZGxlcldpemFyZFBhZ2UuZ2V0Q3JlYXRlZFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJXaXphcmRQYWdlLmlzQ29uZmlndXJlSGFuZGxlckNoYWluKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyV2l6YXJkUGFnZS5pc0NyZWF0ZUhhbmRsZXJDaGFpbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggaGFuZGxlckNoYWluUGF0aCA9IG5ldyBQYXRoKGhhbmRsZXJXaXphcmRQYWdlLmdldE5ld0hhbmRsZXJDaGFpblBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NIYW5kbGVyVXRpbHMuY3JlYXRlSGFuZGxlckNoYWluRmlsZShoYW5kbGVyQ2hhaW5QYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0hhbmRsZXJVdGlscy5hZGRIYW5kbGVyVG9IYW5kbGVyQ2hhaW4oaGFuZGxlckNoYWluUGF0aCwgdHlwZS5nZXRFbGVtZW50TmFtZSgpLCB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlcldpemFyZFBhZ2UuaXNFZGl0SGFuZGxlckNoYWluKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCBoYW5kbGVyQ2hhaW5QYXRoID0gbmV3IFBhdGgoaGFuZGxlcldpemFyZFBhZ2UuZ2V0RXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTSGFuZGxlclV0aWxzLndyaXRlRG9jdW1lbnRUb0ZpbGUoaGFuZGxlckNoYWluUGF0aCwgaGFuZGxlck9yZGVyUGFnZS5nZXREb2N1bWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyV2l6YXJkUGFnZS5pc0Fzc29jaWF0ZUhhbmRsZXJDaGFpbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSA9IGhhbmRsZXJXaXphcmRQYWdlLmdldFNlbGVjdGVkV2ViU2VydmljZVBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVHlwZSB3ZWJTZXJ2aWNlVHlwZSA9IGhhbmRsZXJXaXphcmRQYWdlLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoZnVsbHlRdWFsaWZpZWROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCBoYW5kbGVyQ2hhaW5QYXRoID0gbmV3IFBhdGgoaGFuZGxlcldpemFyZFBhZ2UuZ2V0SGFuZGxlckNoYWluUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmlsZSBoYW5kbGVyQ2hhaW5GaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGhhbmRsZXJDaGFpblBhdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJJIHJlbGF0aXZlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoaGFuZGxlckNoYWluRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKS5kZXJlc29sdmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHdlYlNlcnZpY2VUeXBlLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gd2ViU2VydmljZVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5zZXRTb3VyY2UoY29tcGlsYXRpb25Vbml0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSAoQ29tcGlsYXRpb25Vbml0KXBhcnNlci5jcmVhdGVBU1QobnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih3ZWJTZXJ2aWNlVHlwZSwgSGFuZGxlckNoYWluLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsICYmIGFubm90YXRpb24gaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gaGFuZGxlckNoYWluQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgZmlsZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKGhhbmRsZXJDaGFpbkFubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlUGFpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsIGZpbGUgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTGl0ZXJhbChjdS5nZXRBU1QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVVUkkudG9GaWxlU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnVwZGF0ZU1lbWJlclZhbHVlUGFpcihmaWxlUGFpciwgZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgZmlsZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGN1LmdldEFTVCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIiwgcmVsYXRpdmVVUkkudG9GaWxlU3RyaW5nKCkpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChmaWxlUGFpcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gaGFuZGxlckNoYWluQW5ub3RhdGlvbiA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGN1LmdldEFTVCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkQW5ub3RhdGlvbih3ZWJTZXJ2aWNlVHlwZSwgaGFuZGxlckNoYWluQW5ub3RhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnQod2ViU2VydmljZVR5cGUsIEhhbmRsZXJDaGFpbi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSShnZXRDb250YWluZXIoKSwgd29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uLCBydWxlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGl0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coaWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlPSBoYW5kbGVyV2l6YXJkUGFnZS5nZXRNb2RpZmllZFJlc291cmNlKCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCYXNpY05ld1Jlc291cmNlV2l6YXJkLnNlbGVjdEFuZFJldmVhbChyZXNvdXJjZSwgd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLSAgICAgICAgICAgIG9wZW5SZXNvdXJjZSgoSUZpbGUpIHJlc291cmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb3BlblJlc291cmNlKGZpbmFsIElGaWxlIHJlc291cmNlKSB7Ci0gICAgICAgIGZpbmFsIElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2U9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXk9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotICAgICAgICAgICAgaWYgKGRpc3BsYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREUub3BlbkVkaXRvcihhY3RpdmVQYWdlLCByZXNvdXJjZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2l6YXJkcy9OZXdKQVhXU0hhbmRsZXJXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpemFyZHMvTmV3SkFYV1NIYW5kbGVyV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQ5ZTQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2l6YXJkcy9OZXdKQVhXU0hhbmRsZXJXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3VHlwZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5kaWFsb2dzLkhhbmRsZXJDaGFpblNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuZGlhbG9ncy5OZXdIYW5kbGVyQ2hhaW5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmZpbHRlcnMuTmV3SGFuZGxlckNoYWluVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgTmV3SkFYV1NIYW5kbGVyV2l6YXJkUGFnZSBleHRlbmRzIE5ld1R5cGVXaXphcmRQYWdlIHsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBsb2dpY2FsSGFuZGxlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBzb2FwSGFuZGxlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgIHByaXZhdGUgSVN0YXR1cyBva19zdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELCAiIik7ICAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIElTdGF0dXMgc3VwZXJDbGFzc0ltcGxlbWVudHNTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgSVN0YXR1cyBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgSVN0YXR1cyBlZGl0SGFuZGxlckNoYWluU3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBwcml2YXRlIElTdGF0dXMgYXNzb2NpYXRlV2ViU2VydmljZVN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICBwcml2YXRlIENvbWJvIGhhbmRsZXJUeXBlQ29tYm87Ci0gICAgcHJpdmF0ZSBCdXR0b24gY29uZmlndXJlSGFuZGxlckNoYWluQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGNyZWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbjsKLSAgICBwcml2YXRlIFRleHQgbmV3SGFuZGxlckNoYWluVGV4dDsKLSAgICBwcml2YXRlIEJ1dHRvbiBicm93c2VOZXdIYW5kbGVyQ2hhaW5CdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBlZGl0SGFuZGxlckNoYWluQnV0dG9uOwotICAgIHByaXZhdGUgVGV4dCBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0OwotICAgIHByaXZhdGUgQnV0dG9uIGJyb3dzZUV4aXN0aW5nSGFuZGxlckNoYWluQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gYXNzb2NpYXRlSGFuZGxlckNoYWluQnV0dG9uOwotICAgIHByaXZhdGUgVGV4dCB3ZWJTZXJ2aWNlVGV4dDsKLSAgICBwcml2YXRlIEJ1dHRvbiBicm93c2VXZWJTZXJ2aWNlQnV0dG9uOwotCi0gICAgcHVibGljIE5ld0pBWFdTSGFuZGxlcldpemFyZFBhZ2UoKSB7Ci0gICAgICAgIHN1cGVyKHRydWUsICJjcmVhdGUubmV3LmhhbmRsZXIuY2hhaW4ucGFnZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldFRpdGxlKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX1dJWkFSRF9QQUdFX1RJVExFKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfV0laQVJEX1BBR0VfREVTQ1JJUFRJT04pOwotICAgICAgICBsb2dpY2FsSGFuZGxlckxpc3QuYWRkKCJqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjxqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ+Iik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIHNvYXBIYW5kbGVyTGlzdC5hZGQoImphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI8amF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQTWVzc2FnZUNvbnRleHQ+Iik7ICAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gZ2V0SW5pdGlhbEphdmFFbGVtZW50KHNlbGVjdGlvbik7Ci0gICAgICAgIGluaXRDb250YWluZXJQYWdlKGphdmFFbGVtZW50KTsKLSAgICAgICAgaW5pdFR5cGVQYWdlKGphdmFFbGVtZW50KTsKLSAgICAgICAgZG9TdGF0dXNVcGRhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIGludCBuQ29sdW1ucyA9IDQ7Ci0KLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgZ3JpZExheW91dC5udW1Db2x1bW5zPSBuQ29sdW1uczsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBjcmVhdGVDb250YWluZXJDb250cm9scyhjb21wb3NpdGUsIG5Db2x1bW5zKTsKLSAgICAgICAgY3JlYXRlUGFja2FnZUNvbnRyb2xzKGNvbXBvc2l0ZSwgbkNvbHVtbnMpOwotCi0gICAgICAgIGNyZWF0ZVNlcGFyYXRvcihjb21wb3NpdGUsIG5Db2x1bW5zKTsKLQotICAgICAgICBjcmVhdGVUeXBlTmFtZUNvbnRyb2xzKGNvbXBvc2l0ZSwgbkNvbHVtbnMpOwotICAgICAgICBjcmVhdGVNb2RpZmllckNvbnRyb2xzKGNvbXBvc2l0ZSwgbkNvbHVtbnMpOwotCi0gICAgICAgIGNyZWF0ZVN1cGVyQ2xhc3NDb250cm9scyhjb21wb3NpdGUsIG5Db2x1bW5zKTsKLQotICAgICAgICBMYWJlbCBoYW5kbGVyVHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBoYW5kbGVyVHlwZUxhYmVsLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfVFlQRSk7Ci0KLSAgICAgICAgaGFuZGxlclR5cGVDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBoYW5kbGVyVHlwZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBoYW5kbGVyVHlwZUNvbWJvLmFkZChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfTE9HSUNBTF9IQU5ETEVSKTsKLSAgICAgICAgaGFuZGxlclR5cGVDb21iby5hZGQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX1NPQVBfSEFORExFUik7Ci0gICAgICAgIGhhbmRsZXJUeXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIENvbWJvIGNvbWJvID0gKENvbWJvKSBlLndpZGdldDsKLSAgICAgICAgICAgICAgICBpZiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN1cGVySW50ZXJmYWNlcyhsb2dpY2FsSGFuZGxlckxpc3QsIHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN1cGVySW50ZXJmYWNlcyhzb2FwSGFuZGxlckxpc3QsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgR3JvdXAgY29uZmlndXJhdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULlNIQURPV19OT05FKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkdyb3VwLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTik7Ci0gICAgICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICBjb25maWd1cmF0aW9uR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNDsKLSAgICAgICAgY29uZmlndXJhdGlvbkdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGNvbmZpZ3VyZUhhbmRsZXJDaGFpbkJ1dHRvbiA9IG5ldyBCdXR0b24oY29uZmlndXJhdGlvbkdyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBjb25maWd1cmVIYW5kbGVyQ2hhaW5CdXR0b24uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0FERCk7Ci0gICAgICAgIGNvbmZpZ3VyZUhhbmRsZXJDaGFpbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGUud2lkZ2V0OwotICAgICAgICAgICAgICAgIGlmIChidXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlSGFuZGxlckNoYWluQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZU5ld0hhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKGNyZWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZUVkaXRIYW5kbGVyQ2hhaW5GaWxlV2lkZ2V0cyhlZGl0SGFuZGxlckNoYWluQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlV2ViU2VydmljZVdpZGdldHMoYXNzb2NpYXRlSGFuZGxlckNoYWluQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjcmVhdGVIYW5kbGVyQ2hhaW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlTmV3SGFuZGxlckNoYWluRmlsZVdpZGdldHMoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBlbmFibGVFZGl0SGFuZGxlckNoYWluRmlsZVdpZGdldHMoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBlbmFibGVXZWJTZXJ2aWNlV2lkZ2V0cyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotICAgICAgICBjb25maWd1cmVIYW5kbGVyQ2hhaW5CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JvdXAgaW5uZXJHcm91cCA9IG5ldyBHcm91cChjb25maWd1cmF0aW9uR3JvdXAsIFNXVC5TSEFET1dfTk9ORSk7Ci0gICAgICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotICAgICAgICBpbm5lckdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotICAgICAgICBpbm5lckdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGNyZWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbiA9IG5ldyBCdXR0b24oaW5uZXJHcm91cCwgU1dULlJBRElPKTsKLSAgICAgICAgY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEUpOwotICAgICAgICBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNDsKLSAgICAgICAgY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBjcmVhdGVIYW5kbGVyQ2hhaW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLndpZGdldDsKLSAgICAgICAgICAgICAgICBlbmFibGVOZXdIYW5kbGVyQ2hhaW5GaWxlV2lkZ2V0cyhidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIGVuYWJsZUVkaXRIYW5kbGVyQ2hhaW5GaWxlV2lkZ2V0cyghYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVDb25maWd1cmVIYW5kbGVyU3RhdHVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTGFiZWwgY3JlYXRlTmV3SGFuZGxlckxhYmVsID0gbmV3IExhYmVsKGlubmVyR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgY3JlYXRlTmV3SGFuZGxlckxhYmVsLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9GSUxFX1BBVEgxKTsKLQotICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0ID0gbmV3IFRleHQoaW5uZXJHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0LnNldEZvbnQoaW5uZXJHcm91cC5nZXRGb250KCkpOwotICAgICAgICBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBicm93c2VOZXdIYW5kbGVyQ2hhaW5CdXR0b24gPSBuZXcgQnV0dG9uKGlubmVyR3JvdXAsIFNXVC5QVVNIKTsKLSAgICAgICAgYnJvd3NlTmV3SGFuZGxlckNoYWluQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9CUk9XU0UxKTsKLSAgICAgICAgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBicm93c2VOZXdIYW5kbGVyQ2hhaW5CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGJyb3dzZU5ld0hhbmRsZXJDaGFpbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgTmV3SGFuZGxlckNoYWluRGlhbG9nIGRpYWxvZyA9IG5ldyBOZXdIYW5kbGVyQ2hhaW5EaWFsb2coZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKSwgbmV3IFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLnNldElucHV0KEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLmFkZEZpbHRlcihuZXcgTmV3SGFuZGxlckNoYWluVmlld2VyRmlsdGVyKGdldEphdmFQcm9qZWN0KCksIHRydWUsIHRydWUpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3SGFuZGxlckNoYWluVGV4dC5zZXRUZXh0KGRpYWxvZy5nZXRGaWxlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29uZmlndXJlSGFuZGxlclN0YXR1cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZWRpdEhhbmRsZXJDaGFpbkJ1dHRvbiA9IG5ldyBCdXR0b24oaW5uZXJHcm91cCwgU1dULlJBRElPKTsKLSAgICAgICAgZWRpdEhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVCk7Ci0gICAgICAgIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotICAgICAgICBlZGl0SGFuZGxlckNoYWluQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExhYmVsIGFkZFRvSGFuZGxlckxhYmVsID0gbmV3IExhYmVsKGlubmVyR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgYWRkVG9IYW5kbGVyTGFiZWwuc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0ZJTEVfUEFUSDIpOwotCi0gICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0ID0gbmV3IFRleHQoaW5uZXJHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0LnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0gICAgICAgIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGV4aXNpdGluZ0hhbmRsZXJDaGFpblRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGV4aXNpdGluZ0hhbmRsZXJDaGFpblRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBicm93c2VFeGlzdGluZ0hhbmRsZXJDaGFpbkJ1dHRvbiA9IG5ldyBCdXR0b24oaW5uZXJHcm91cCwgU1dULlBVU0gpOwotICAgICAgICBicm93c2VFeGlzdGluZ0hhbmRsZXJDaGFpbkJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQlJPV1NFMik7Ci0gICAgICAgIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGJyb3dzZUV4aXN0aW5nSGFuZGxlckNoYWluQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGJyb3dzZUV4aXN0aW5nSGFuZGxlckNoYWluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5TZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEhhbmRsZXJDaGFpblNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLCBuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcigpKTsKLQotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRJbnB1dChKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSkpOwotICAgICAgICAgICAgICAgIGRpYWxvZy5hZGRGaWx0ZXIobmV3IE5ld0hhbmRsZXJDaGFpblZpZXdlckZpbHRlcihnZXRKYXZhUHJvamVjdCgpLCBmYWxzZSwgdHJ1ZSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgcmVzdWx0WzBdOwotICAgICAgICAgICAgICAgICAgICBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0LnNldFRleHQocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb25maWd1cmVIYW5kbGVyU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjcmVhdGVTZXBhcmF0b3IoaW5uZXJHcm91cCwgbkNvbHVtbnMpOwotCi0gICAgICAgIGFzc29jaWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbiA9IG5ldyBCdXR0b24oaW5uZXJHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0gICAgICAgIGFzc29jaWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgYXNzb2NpYXRlSGFuZGxlckNoYWluQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9BU1NPQ0lBVEUpOwotICAgICAgICBhc3NvY2lhdGVIYW5kbGVyQ2hhaW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLndpZGdldDsKLSAgICAgICAgICAgICAgICBlbmFibGVXZWJTZXJ2aWNlV2lkZ2V0cyhidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBMYWJlbCB3ZWJTZXJ2aWNlTGFiZWwgPSBuZXcgTGFiZWwoaW5uZXJHcm91cCwgU1dULk5PTkUpOwotICAgICAgICB3ZWJTZXJ2aWNlTGFiZWwuc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dFQl9TRVJWSUNFKTsKLQotICAgICAgICB3ZWJTZXJ2aWNlVGV4dCA9IG5ldyBUZXh0KGlubmVyR3JvdXAsICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIHdlYlNlcnZpY2VUZXh0LnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0gICAgICAgIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICB3ZWJTZXJ2aWNlVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgd2ViU2VydmljZVRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBicm93c2VXZWJTZXJ2aWNlQnV0dG9uID0gbmV3IEJ1dHRvbihpbm5lckdyb3VwLCBTV1QuUFVTSCk7Ci0gICAgICAgIGJyb3dzZVdlYlNlcnZpY2VCdXR0b24uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0JST1dTRTMpOwotICAgICAgICBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBicm93c2VXZWJTZXJ2aWNlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGJyb3dzZVdlYlNlcnZpY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLCBuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0VGl0bGUoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9XU19ESUFMT0dfVElUTEUpOwotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fV1NfRElBTE9HX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0QWxsb3dNdWx0aXBsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLnNldElucHV0KEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7Ci0KLSAgICAgICAgICAgICAgICBkaWFsb2cuYWRkRmlsdGVyKG5ldyBOZXdIYW5kbGVyQ2hhaW5WaWV3ZXJGaWx0ZXIoZ2V0SmF2YVByb2plY3QoKSwgdHJ1ZSwgZmFsc2UpKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0VmFsaWRhdG9yKG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkgewotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25bMF0gaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIHNlbGVjdGlvblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGNvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2tfc3RhdHVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fV1NfRElBTE9HX0lOVkFMSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzZWxlY3RlZENvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZVRleHQuc2V0VGV4dChzZWxlY3RlZENvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY29tcG9zaXRlLnBhY2soKTsKLSAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotICAgICAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBlZGl0SGFuZGxlckNoYWluQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBhc3NvY2lhdGVIYW5kbGVyQ2hhaW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGVuYWJsZU5ld0hhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKGZhbHNlKTsKLSAgICAgICAgZW5hYmxlRWRpdEhhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKGZhbHNlKTsKLSAgICAgICAgZW5hYmxlV2ViU2VydmljZVdpZGdldHMoZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlSGFuZGxlckNoYWluKCkgewotICAgICAgICByZXR1cm4gY29uZmlndXJlSGFuZGxlckNoYWluQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ3JlYXRlSGFuZGxlckNoYWluKCkgewotICAgICAgICByZXR1cm4gY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWRpdEhhbmRsZXJDaGFpbigpIHsKLSAgICAgICAgcmV0dXJuIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZEhhbmRsZXJUeXBlKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlclR5cGVDb21iby5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROZXdIYW5kbGVyQ2hhaW5QYXRoKCkgewotICAgICAgICByZXR1cm4gbmV3SGFuZGxlckNoYWluVGV4dC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFeGlzdGluZ0hhbmRsZXJDaGFpblBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0LmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJDaGFpblBhdGgoKSB7Ci0gICAgICAgIGlmIChpc0NyZWF0ZUhhbmRsZXJDaGFpbigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TmV3SGFuZGxlckNoYWluUGF0aCgpOwotICAgICAgICB9IGVsc2UgaWYgKGlzRWRpdEhhbmRsZXJDaGFpbigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXNzb2NpYXRlSGFuZGxlckNoYWluKCkgewotICAgICAgICByZXR1cm4gYXNzb2NpYXRlSGFuZGxlckNoYWluQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRXZWJTZXJ2aWNlUGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VUZXh0LmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5hYmxlRWRpdEhhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGV4aXNpdGluZ0hhbmRsZXJDaGFpblRleHQuc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBicm93c2VFeGlzdGluZ0hhbmRsZXJDaGFpbkJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuYWJsZU5ld0hhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQuc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBicm93c2VOZXdIYW5kbGVyQ2hhaW5CdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmFibGVXZWJTZXJ2aWNlV2lkZ2V0cyhib29sZWFuIGVuYWJsZSkgewotICAgICAgICB3ZWJTZXJ2aWNlVGV4dC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIGJyb3dzZVdlYlNlcnZpY2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1N0YXR1c1VwZGF0ZSgpIHsKLSAgICAgICAgSVN0YXR1c1tdIHN0YXR1cyA9IG5ldyBJU3RhdHVzW10gewotICAgICAgICAgICAgICAgIGZDb250YWluZXJTdGF0dXMsCi0gICAgICAgICAgICAgICAgZlBhY2thZ2VTdGF0dXMsCi0gICAgICAgICAgICAgICAgZlR5cGVOYW1lU3RhdHVzLAotICAgICAgICAgICAgICAgIGZTdXBlckNsYXNzU3RhdHVzLAotICAgICAgICAgICAgICAgIGZTdXBlckludGVyZmFjZXNTdGF0dXMsCi0gICAgICAgICAgICAgICAgc3VwZXJDbGFzc0ltcGxlbWVudHNTdGF0dXMsCi0gICAgICAgICAgICAgICAgYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzLAotICAgICAgICAgICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXMsCi0gICAgICAgICAgICAgICAgYXNzb2NpYXRlV2ViU2VydmljZVN0YXR1cwotICAgICAgICB9OwotCi0gICAgICAgIHVwZGF0ZVN0YXR1cyhzdGF0dXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb25maWd1cmVIYW5kbGVyU3RhdHVzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsaWRhdGVOZXdIYW5kbGVyQ2hhaW5GaWVsZCgpOwotICAgICAgICAgICAgdmFsaWRhdGVFeGlzdGluZ0hhbmRsZXJDaGFpbkZpZWxkKCk7Ci0gICAgICAgICAgICB2YWxpZGF0ZVdlYlNlcnZpY2VGaWVsZCgpOwotICAgICAgICAgICAgZG9TdGF0dXNVcGRhdGUoKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZU5ld0hhbmRsZXJDaGFpbkZpZWxkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc0NvbmZpZ3VyZUhhbmRsZXJDaGFpbigpICYmIGlzQ3JlYXRlSGFuZGxlckNoYWluKCkpIHsKLSAgICAgICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXMgPSBva19zdGF0dXM7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3SGFuZGxlckNoYWluUGF0aCA9IGdldE5ld0hhbmRsZXJDaGFpblBhdGgoKS50cmltKCk7Ci0gICAgICAgICAgICBpZiAobmV3SGFuZGxlckNoYWluUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX05FV19IQU5ETEVSX1BBVEhfRU1UUFkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW5ld0hhbmRsZXJDaGFpblBhdGguZW5kc1dpdGgoIi54bWwiKSkgeyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0lOVkFMSURfTkFNRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChuZXdIYW5kbGVyQ2hhaW5QYXRoKTsKLSAgICAgICAgICAgIGlmIChwYXRoLnNlZ21lbnRDb3VudCgpID49IDIpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBzZWdtZW5ldHMgPSBwYXRoLnNlZ21lbnRzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZWdtZW5ldHNbMF0uZXF1YWxzKGdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0ZJTEVfUFJPSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sZWFuIGluU291cmNlRm9sZGVyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwYWNrYWdlRnJhZ21lbnRSb290cyA9IGdldEphdmFQcm9qZWN0KCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgOiBwYWNrYWdlRnJhZ21lbnRSb290cykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVuZXRzWzFdLmVxdWFscyhwYWNrYWdlRnJhZ21lbnRSb290LmdldEVsZW1lbnROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpblNvdXJjZUZvbGRlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWluU291cmNlRm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5iaW5kKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19GSUxFX1BST0pFQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGgubGFzdFNlZ21lbnQoKSAhPSBudWxsICYmIHBhdGgubGFzdFNlZ21lbnQoKS5lcXVhbHMoIi54bWwiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19FTVBUWV9GSUxFX05BTUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9QUk9KRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSVJlc291cmNlIHJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwYXRoKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0ZJTEVfRVhJU1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBva19zdGF0dXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzID0gb2tfc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlRXhpc3RpbmdIYW5kbGVyQ2hhaW5GaWVsZCgpIHsKLSAgICAgICAgaWYgKGlzQ29uZmlndXJlSGFuZGxlckNoYWluKCkgJiYgaXNFZGl0SGFuZGxlckNoYWluKCkpIHsKLSAgICAgICAgICAgIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG9rX3N0YXR1czsKLSAgICAgICAgICAgIFN0cmluZyBleGlzdGluZ0hhbmRsZXJDaGFpblBhdGggPSBnZXRFeGlzdGluZ0hhbmRsZXJDaGFpblBhdGgoKS50cmltKCk7Ci0gICAgICAgICAgICBpZiAoZXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWRpdEhhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0VYSVNUSU5HX0hBTkRMRVJfUEFUSF9FTVRQWSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoLmVuZHNXaXRoKCIueG1sIikpIHsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm4gZWRpdEhhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfSU5WQUxJRF9OQU1FKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoKTsKLSAgICAgICAgICAgIGlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSAmJiBwYXRoLnNlZ21lbnQoMCkuZXF1YWxzKGdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXMgPSBva19zdGF0dXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBlZGl0SGFuZGxlckNoYWluU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5iaW5kKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVF9GSUxFX05PVF9GT1VORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZWRpdEhhbmRsZXJDaGFpblN0YXR1cyA9IG9rX3N0YXR1czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVdlYlNlcnZpY2VGaWVsZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNDb25maWd1cmVIYW5kbGVyQ2hhaW4oKSAmJiBpc0Fzc29jaWF0ZUhhbmRsZXJDaGFpbigpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgd2ViU2VydmljZVBhdGggPSBnZXRTZWxlY3RlZFdlYlNlcnZpY2VQYXRoKCkudHJpbSgpOwotICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2VQYXRoLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYXNzb2NpYXRlV2ViU2VydmljZVN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dTX1BBVEhfRU1UUFkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdlYlNlcnZpY2VQYXRoKSA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gYXNzb2NpYXRlV2ViU2VydmljZVN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dTX05PVF9GT1VORCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBhc3NvY2lhdGVXZWJTZXJ2aWNlU3RhdHVzID0gb2tfc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICB9ICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhc3NvY2lhdGVXZWJTZXJ2aWNlU3RhdHVzID0gb2tfc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRmllbGRDaGFuZ2VkKFN0cmluZyBmaWVsZE5hbWUpIHsKLSAgICAgICAgc3VwZXIuaGFuZGxlRmllbGRDaGFuZ2VkKGZpZWxkTmFtZSk7Ci0gICAgICAgIGlmIChmaWVsZE5hbWUuZXF1YWxzKFNVUEVSKSB8fCBmaWVsZE5hbWUuZXF1YWxzKElOVEVSRkFDRVMpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChnZXRTdXBlckludGVyZmFjZXMoKS5zaXplKCkgPT0gMCAmJiBmU3VwZXJDbGFzc1N0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSVR5cGUgdHlwZSA9IGdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoZ2V0U3VwZXJDbGFzcygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGludGVyZmFjZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gc3VwZXJJbnRlcmZhY2VOYW1lcyA9IEFycmF5cy5hc0xpc3QodHlwZS5nZXRTdXBlckludGVyZmFjZU5hbWVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgaW50ZXJmYWNlTmFtZSA6IHN1cGVySW50ZXJmYWNlTmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lcy5hZGQoU2lnbmF0dXJlLmdldFR5cGVFcmFzdXJlKGludGVyZmFjZU5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZU5hbWVzLmNvbnRhaW5zKCJqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyIikgfHwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZXMuY29udGFpbnMoImphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyIikpIHsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlckNsYXNzSW1wbGVtZW50c1N0YXR1cyA9IG9rX3N0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzc0ltcGxlbWVudHNTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfRVhURU5EX0lNUExFTUVOVF9IQU5ETEVSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3NJbXBsZW1lbnRzU3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGRvU3RhdHVzVXBkYXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIElTdGF0dXMgc3VwZXJJbnRlcmZhY2VzQ2hhbmdlZCgpIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0KLSAgICAgICAgaWYgKHJvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSAiamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbEhhbmRsZXIiOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gcm9vdC5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9MSUJSQVJZX0NMQVNTUEFUSCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUeXBlTWVtYmVycyhJVHlwZSBuZXdUeXBlLCBmaW5hbCBJbXBvcnRzTWFuYWdlciBpbXBvcnRzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBjcmVhdGVJbmhlcml0ZWRNZXRob2RzKG5ld1R5cGUsIGZhbHNlLCB0cnVlLCBpbXBvcnRzLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLSAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpemFyZHMvT3JkZXJIYW5kbGVyQ2hhaW5QYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpemFyZHMvT3JkZXJIYW5kbGVyQ2hhaW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYWFhYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS93aXphcmRzL09yZGVySGFuZGxlckNoYWluUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLndpemFyZHM7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFyYW1ldGVyaXplZFR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXJDb2x1bW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NIYW5kbGVyVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuZmlsdGVycy5OZXdIYW5kbGVyQ2hhaW5WaWV3ZXJGaWx0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5qZG9tLkRvY3VtZW50Ow0KLWltcG9ydCBvcmcuamRvbS5FbGVtZW50Ow0KLWltcG9ydCBvcmcuamRvbS5KRE9NRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuamRvbS5pbnB1dC5TQVhCdWlsZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBPcmRlckhhbmRsZXJDaGFpblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0lDQUxfSEFORExFUiA9ICJqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfSEFORExFUiA9ICJqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICBwcml2YXRlIElTdGF0dXMgb2tfc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsNCi0NCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBkb2M7DQotICAgIHByaXZhdGUgRWxlbWVudCByb290Ow0KLQ0KLSAgICBwcml2YXRlIElQYXRoIGhhbmRsZXJDaGFpblBhdGg7DQotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0Ow0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29uZmlndXJlOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBuZXdIYW5kbGVyQ2xhc3NOYW1lOw0KLSAgICBwcml2YXRlIFN0cmluZyBuZXdIYW5kbGVyVHlwZTsNCi0NCi0gICAgcHVibGljIE9yZGVySGFuZGxlckNoYWluUGFnZSgpIHsNCi0gICAgICAgIHN1cGVyKCJvcmRlci5oYW5kbGVyY2hhaW4ud2l6YXJkLnBhZ2UiKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgc2V0VGl0bGUoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX09SREVSX0hBTkRMRVJfV0laQVJEX1BBR0VfVElUTEUpOw0KLSAgICAgICAgc2V0RGVzY3JpcHRpb24oSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX09SREVSX0hBTkRMRVJfV0laQVJEX1BBR0VfREVTQ1JJUFRJT04pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPcmRlckhhbmRsZXJDaGFpblBhZ2UoSVBhdGggaGFuZGxlckNoYWluUGF0aCwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7DQotICAgICAgICB0aGlzKCk7DQotICAgICAgICB0aGlzLmhhbmRsZXJDaGFpblBhdGggPSBoYW5kbGVyQ2hhaW5QYXRoOw0KLSAgICAgICAgdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0Ow0KLSAgICAgICAgdGhpcy5jb25maWd1cmUgPSB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHsNCi0gICAgICAgIHJldHVybiBkb2M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaFZpZXdlcigpIHsNCi0gICAgICAgIHRyZWVWaWV3ZXIucmVmcmVzaCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KLSAgICAgICAgdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOw0KLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsNCi0NCi0gICAgICAgIHRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsNCi0gICAgICAgIHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7DQotICAgICAgICB0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7DQotICAgICAgICB0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSGFuZGxlckNoYWluQ29udGVudFByb3ZpZGVyKCkpOw0KLQ0KLSAgICAgICAgVHJlZVZpZXdlckNvbHVtbiBuYW1lVmlld2VyQ29sdW1uID0gbmV3IFRyZWVWaWV3ZXJDb2x1bW4odHJlZVZpZXdlciwgU1dULkxFRlQpOw0KLSAgICAgICAgVHJlZUNvbHVtbiBuYW1lQ29sdW1uID0gbmFtZVZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsNCi0gICAgICAgIG5hbWVDb2x1bW4uc2V0V2lkdGgoMjAwKTsNCi0gICAgICAgIG5hbWVDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOw0KLSAgICAgICAgbmFtZUNvbHVtbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX05BTUVfQ09MVU1OKTsNCi0NCi0gICAgICAgIG5hbWVWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsNCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7DQotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgZWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMoSkFYV1NIYW5kbGVyVXRpbHMuSEFORExFUikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJOYW1lRWxlbWVudCA9IG5vZGUuZ2V0Q2hpbGQoSkFYV1NIYW5kbGVyVXRpbHMuSEFORExFUl9OQU1FLCBKQVhXU0hhbmRsZXJVdGlscy5KQVZBRUVfTlMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyTmFtZUVsZW1lbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlck5hbWVFbGVtZW50LmdldFRleHQoKS50cmltKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSX0NIQUlOKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmdldE5hbWUoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7DQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXMuSU1HX09CSl9GSUxFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIFRyZWVWaWV3ZXJDb2x1bW4gY2xhc3NWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuTEVGVCk7DQotICAgICAgICBUcmVlQ29sdW1uIGNsYXNzQ29sdW1uID0gY2xhc3NWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7DQotICAgICAgICBjbGFzc0NvbHVtbi5zZXRXaWR0aCgyMDApOw0KLSAgICAgICAgY2xhc3NDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOw0KLSAgICAgICAgY2xhc3NDb2x1bW4uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DTEFTU19DT0xVTU4pOw0KLQ0KLSAgICAgICAgY2xhc3NWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsNCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7DQotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgZWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMoSkFYV1NIYW5kbGVyVXRpbHMuSEFORExFUikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJOYW1lRWxlbWVudCA9IG5vZGUuZ2V0Q2hpbGQoSkFYV1NIYW5kbGVyVXRpbHMuSEFORExFUl9DTEFTUywgSkFYV1NIYW5kbGVyVXRpbHMuSkFWQUVFX05TKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlck5hbWVFbGVtZW50ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJOYW1lRWxlbWVudC5nZXRUZXh0KCkudHJpbSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIFRyZWVWaWV3ZXJDb2x1bW4gdHlwZVZpZXdlckNvbHVtbiA9IG5ldyBUcmVlVmlld2VyQ29sdW1uKHRyZWVWaWV3ZXIsIFNXVC5MRUZUKTsNCi0gICAgICAgIFRyZWVDb2x1bW4gdHlwZUNvbHVtbiA9IHR5cGVWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7DQotICAgICAgICB0eXBlQ29sdW1uLnNldFdpZHRoKDEwMCk7DQotICAgICAgICB0eXBlQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsNCi0gICAgICAgIHR5cGVDb2x1bW4uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9UWVBFX0NPTFVNTik7DQotDQotICAgICAgICB0eXBlVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IENvbHVtbkxhYmVsUHJvdmlkZXIoKSB7DQotDQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7DQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIGVsZW1lbnQ7DQotICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKEpBWFdTSGFuZGxlclV0aWxzLkhBTkRMRVIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyQ2xhc3NFbGVtZW50ID0gbm9kZS5nZXRDaGlsZChKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSX0NMQVNTLCBKQVhXU0hhbmRsZXJVdGlscy5KQVZBRUVfTlMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyQ2xhc3NFbGVtZW50ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0hhbmRsZXJDbGFzc05hbWUgIT0gbnVsbCAmJiBuZXdIYW5kbGVyQ2xhc3NOYW1lLmVxdWFscyhoYW5kbGVyQ2xhc3NFbGVtZW50LmdldFZhbHVlKCkudHJpbSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0hhbmRsZXJUeXBlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVHlwZSBoYW5kbGVyID0gamF2YVByb2plY3QuZmluZFR5cGUoaGFuZGxlckNsYXNzRWxlbWVudC5nZXRUZXh0KCkudHJpbSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5ID0gaGFuZGxlci5uZXdUeXBlSGllcmFyY2h5KGphdmFQcm9qZWN0LCBudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVHlwZVtdIGFsbEludGVyZmFjZXMgPSB0eXBlSGllcmFyY2h5LmdldEFsbEludGVyZmFjZXMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElUeXBlIGFJbnRlcmZhY2UgOiBhbGxJbnRlcmZhY2VzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhSW50ZXJmYWNlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhMT0dJQ0FMX0hBTkRMRVIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0xPR0lDQUw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFJbnRlcmZhY2UuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFNPQVBfSEFORExFUikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfUFJPVE9DT0w7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOw0KLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsNCi0gICAgICAgIHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOw0KLQ0KLSAgICAgICAgaWYgKGNvbmZpZ3VyZSkgew0KLSAgICAgICAgICAgIEJ1dHRvbiBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOw0KLSAgICAgICAgICAgIGFkZEJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0FERCk7DQotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsNCi0gICAgICAgICAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQotICAgICAgICAgICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQ0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKSwgbmV3IFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIoKSk7DQotICAgICAgICAgICAgICAgICAgICBkaWFsb2cuc2V0VGl0bGUoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9IQU5ETEVSX0RJQUxPR19USVRMRSk7DQotICAgICAgICAgICAgICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0hBTkRMRVJfRElBTE9HX0RFU0NSSVBUSU9OKTsNCi0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRBbGxvd011bHRpcGxlKGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRJbnB1dChKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmFkZEZpbHRlcihuZXcgTmV3SGFuZGxlckNoYWluVmlld2VyRmlsdGVyKGphdmFQcm9qZWN0LCB0cnVlLCBmYWxzZSkpOw0KLSAgICAgICAgICAgICAgICAgICAgZGlhbG9nLnNldFZhbGlkYXRvcihuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvblswXSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBzZWxlY3Rpb25bMF07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSGFuZGxlcihjb21waWxhdGlvblVuaXQpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBva19zdGF0dXM7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9IQU5ETEVSX0RJQUxPR19JTlZBTElEKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzZWxlY3RlZEhhbmRsZXIgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkSGFuZGxlcihzZWxlY3RlZEhhbmRsZXIuZmluZFByaW1hcnlUeXBlKCkuZ2V0RWxlbWVudE5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSGFuZGxlci5maW5kUHJpbWFyeVR5cGUoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgICAgIEJ1dHRvbiByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOw0KLSAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX1JFTU9WRSk7DQotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsNCi0gICAgICAgICAgICByZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQotICAgICAgICAgICAgcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQ0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLSAgICAgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBzZWxlY3RlZCA9IChFbGVtZW50KSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkLmdldE5hbWUoKS5lcXVhbHMoSkFYV1NIYW5kbGVyVXRpbHMuSEFORExFUikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyQ2hhaW4gPSAoRWxlbWVudCkgc2VsZWN0ZWQuZ2V0UGFyZW50KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyQ2hhaW4gIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNoYWluLnJlbW92ZUNvbnRlbnQoc2VsZWN0ZWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVZpZXdlci5yZWZyZXNoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEJ1dHRvbiBtb3ZlVXBCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOw0KLSAgICAgICAgbW92ZVVwQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfTU9WRV9VUCk7DQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOw0KLSAgICAgICAgbW92ZVVwQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOw0KLSAgICAgICAgbW92ZVVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQ0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOw0KLSAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgc2VsZWN0ZWQgPSAoRWxlbWVudCkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudCkgc2VsZWN0ZWQuZ2V0UGFyZW50KCk7DQotICAgICAgICAgICAgICAgICAgICBMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7DQotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKHNlbGVjdGVkKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5yZW1vdmUoc2VsZWN0ZWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChpbmRleCAtIDEsIHNlbGVjdGVkKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IChFbGVtZW50KSBwYXJlbnQuZ2V0UGFyZW50KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBoYW5kbGVyQ2hhaW5zID0gcm9vdC5nZXRDaGlsZHJlbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3BJbmRleCA9IGhhbmRsZXJDaGFpbnMuaW5kZXhPZihwYXJlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3BJbmRleCA+IDAgJiYgaGFuZGxlckNoYWlucy5nZXQodG9wSW5kZXggLSAxKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnJlbW92ZShzZWxlY3RlZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgdG9wQ2hpbGQgPSAoRWxlbWVudCkgaGFuZGxlckNoYWlucy5nZXQodG9wSW5kZXggLSAxKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wQ2hpbGQuZ2V0Q2hpbGRyZW4oKS5hZGQodG9wQ2hpbGQuZ2V0Q2hpbGRyZW4oKS5zaXplKCksIHNlbGVjdGVkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB0cmVlVmlld2VyLnJlZnJlc2goKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgQnV0dG9uIG1vdmVEb3duQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsNCi0gICAgICAgIG1vdmVEb3duQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfTU9WRV9ET1dOKTsNCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7DQotICAgICAgICBtb3ZlRG93bkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsNCi0gICAgICAgIG1vdmVEb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQ0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOw0KLSAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgc2VsZWN0ZWQgPSAoRWxlbWVudCkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudCkgc2VsZWN0ZWQuZ2V0UGFyZW50KCk7DQotICAgICAgICAgICAgICAgICAgICBMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7DQotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKHNlbGVjdGVkKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgY2hpbGRyZW4uc2l6ZSgpIC0gMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnJlbW92ZShzZWxlY3RlZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKGluZGV4ICsgMSwgc2VsZWN0ZWQpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PSBjaGlsZHJlbi5zaXplKCkgLSAxKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCByb290ID0gKEVsZW1lbnQpIHBhcmVudC5nZXRQYXJlbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGhhbmRsZXJDaGFpbnMgPSByb290LmdldENoaWxkcmVuKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhJbmRleCA9IGhhbmRsZXJDaGFpbnMuaW5kZXhPZihwYXJlbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoSW5kZXggPj0gMCAmJiBoSW5kZXggPCBoYW5kbGVyQ2hhaW5zLnNpemUoKSAtIDEgJiYgaGFuZGxlckNoYWlucy5nZXQoaEluZGV4ICsgMSkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5yZW1vdmUoc2VsZWN0ZWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHRvcENoaWxkID0gKEVsZW1lbnQpIGhhbmRsZXJDaGFpbnMuZ2V0KGhJbmRleCArIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BDaGlsZC5nZXRDaGlsZHJlbigpLmFkZCgwLCBzZWxlY3RlZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgdHJlZVZpZXdlci5yZWZyZXNoKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIGlmIChoYW5kbGVyQ2hhaW5QYXRoICE9IG51bGwpIHsNCi0gICAgICAgICAgICBzZXRJbnB1dChoYW5kbGVyQ2hhaW5QYXRoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7DQotDQotICAgICAgICBjb21wb3NpdGUucGFjaygpOw0KLSAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOw0KLSAgICAgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOw0KLSAgICB9DQotDQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgew0KLSAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsNCi0gICAgICAgIGlmICh2aXNpYmxlKSB7DQotICAgICAgICAgICAgc2V0SW5wdXQoaGFuZGxlckNoYWluUGF0aCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWluUGF0aChJUGF0aCBoYW5kbGVyQ2hhaW5QYXRoKSB7DQotICAgICAgICB0aGlzLmhhbmRsZXJDaGFpblBhdGggPSBoYW5kbGVyQ2hhaW5QYXRoOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0hhbmRsZXIoSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UpIHsNCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICBBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7DQotICAgICAgICBwYXJzZXIuc2V0U291cmNlKHNvdXJjZSk7DQotICAgICAgICBwYXJzZXIuc2V0UmVzb2x2ZUJpbmRpbmdzKHRydWUpOw0KLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHBhcnNlci5jcmVhdGVBU1QobnVsbCk7DQotICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgew0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotICAgICAgICAgICAgICAgIExpc3Qgc3VwZXJJbnRlcmZhY2VzID0gdHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlVHlwZXMoKTsNCi0gICAgICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogc3VwZXJJbnRlcmZhY2VzKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwYXJhbWV0ZXJpemVkVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZSkgb2JqZWN0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlQmluZGluZyBiaW5kaW5nID0gcGFyYW1ldGVyaXplZFR5cGUucmVzb2x2ZUJpbmRpbmcoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxdWFsaWZpZWROYW1lID0gYmluZGluZy5nZXRFcmFzdXJlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVkTmFtZS5lcXVhbHMoTE9HSUNBTF9IQU5ETEVSKSB8fCBxdWFsaWZpZWROYW1lLmVxdWFscyhTT0FQX0hBTkRMRVIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VzLmFkZChxdWFsaWZpZWROYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0gICAgICAgIHJldHVybiBpbnRlcmZhY2VzLnNpemUoKSA+IDA7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVBhdGggaGFuZGxlckNoYWluUGF0aCkgew0KLSAgICAgICAgaWYgKGhhbmRsZXJDaGFpblBhdGggPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghaGFuZGxlckNoYWluUGF0aC5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBJRmlsZSBoYW5kbGVyQ2hhaW5GaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGhhbmRsZXJDaGFpblBhdGgpOw0KLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJ4bWwiKSkgeyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluRmlsZS5leGlzdHMoKSAmJiBKQVhXU0hhbmRsZXJVdGlscy5pc0hhbmRsZXJDaGFpbkZpbGUoaGFuZGxlckNoYWluRmlsZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaGFuZGxlcklucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZG9jID0gYnVpbGRlci5idWlsZChoYW5kbGVySW5wdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPSBkb2MuZ2V0Um9vdEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmVlVmlld2VyLnNldElucHV0KHJvb3QpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTSGFuZGxlclV0aWxzLmNyZWF0ZUhhbmRsZXJDaGFpbkZpbGUoaGFuZGxlckNoYWluUGF0aCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5wdXQoaGFuZGxlckNoYWluUGF0aCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsNCi0gICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coaW9lKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGpkb21lKSB7DQotICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGpkb21lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YVByb2plY3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7DQotICAgICAgICB0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihTdHJpbmcgbmV3SGFuZGxlck5hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSkgew0KLSAgICAgICAgaWYgKHJvb3QgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlckNoYWluRWxlbWVudCA9IHJvb3QuZ2V0Q2hpbGQoSkFYV1NIYW5kbGVyVXRpbHMuSEFORExFUl9DSEFJTiwgSkFYV1NIYW5kbGVyVXRpbHMuSkFWQUVFX05TKTsNCi0gICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluRWxlbWVudCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkVsZW1lbnQgPSBuZXcgRWxlbWVudChKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSX0NIQUlOLCBKQVhXU0hhbmRsZXJVdGlscy5KQVZBRUVfTlMpOw0KLSAgICAgICAgICAgICAgICByb290LmFkZENvbnRlbnQoaGFuZGxlckNoYWluRWxlbWVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlckVsZW1lbnQgPSBuZXcgRWxlbWVudChKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSLCBKQVhXU0hhbmRsZXJVdGlscy5KQVZBRUVfTlMpOw0KLQ0KLSAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlck5hbWVFbGVtZW50ID0gbmV3IEVsZW1lbnQoSkFYV1NIYW5kbGVyVXRpbHMuSEFORExFUl9OQU1FLCBKQVhXU0hhbmRsZXJVdGlscy5KQVZBRUVfTlMpOw0KLSAgICAgICAgICAgIGhhbmRsZXJOYW1lRWxlbWVudC5zZXRUZXh0KG5ld0hhbmRsZXJOYW1lKTsNCi0NCi0gICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDbGFzc0VsZW1lbnQgPSBuZXcgRWxlbWVudChKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSX0NMQVNTLCBKQVhXU0hhbmRsZXJVdGlscy5KQVZBRUVfTlMpOw0KLSAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgIGhhbmRsZXJDbGFzc0VsZW1lbnQuc2V0VGV4dChwYWNrYWdlTmFtZSArICIuIiArIG5ld0hhbmRsZXJOYW1lKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2xhc3NFbGVtZW50LnNldFRleHQobmV3SGFuZGxlck5hbWUpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBoYW5kbGVyRWxlbWVudC5hZGRDb250ZW50KGhhbmRsZXJOYW1lRWxlbWVudCk7DQotICAgICAgICAgICAgaGFuZGxlckVsZW1lbnQuYWRkQ29udGVudChoYW5kbGVyQ2xhc3NFbGVtZW50KTsNCi0gICAgICAgICAgICBoYW5kbGVyQ2hhaW5FbGVtZW50LmFkZENvbnRlbnQoaGFuZGxlckVsZW1lbnQpOw0KLSAgICAgICAgICAgIHRyZWVWaWV3ZXIucmVmcmVzaCgpOw0KLSAgICAgICAgICAgIHRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGhhbmRsZXJFbGVtZW50KSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihTdHJpbmcgbmV3SGFuZGxlck5hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIG5ld0hhbmRsZXJUeXBlKSB7DQotICAgICAgICBhZGRIYW5kbGVyKG5ld0hhbmRsZXJOYW1lLCBwYWNrYWdlTmFtZSk7DQotICAgICAgICB0aGlzLm5ld0hhbmRsZXJDbGFzc05hbWUgPSBwYWNrYWdlTmFtZSArICIuIiArIG5ld0hhbmRsZXJOYW1lOw0KLSAgICAgICAgdGhpcy5uZXdIYW5kbGVyVHlwZSA9IG5ld0hhbmRsZXJUeXBlOw0KLSAgICAgICAgaWYgKG5ld0hhbmRsZXJUeXBlLmVxdWFscyhKQVhXU1VJTWVzc2FnZXMuSkFYV1NfTE9HSUNBTF9IQU5ETEVSKSkgew0KLSAgICAgICAgICAgIHRoaXMubmV3SGFuZGxlclR5cGUgPSBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfTE9HSUNBTDsNCi0gICAgICAgIH0gZWxzZSBpZiAobmV3SGFuZGxlclR5cGUuZXF1YWxzKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19TT0FQX0hBTkRMRVIpKSB7DQotICAgICAgICAgICAgdGhpcy5uZXdIYW5kbGVyVHlwZSA9IEpBWFdTVUlNZXNzYWdlcy5KQVhXU19QUk9UT0NPTDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGNsYXNzIEhhbmRsZXJDaGFpbkNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsNCi0NCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgew0KLSAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50RWxlbWVudDsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKS50b0FycmF5KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgew0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgZWxlbWVudDsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0UGFyZW50KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsNCi0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIGVsZW1lbnQ7DQotICAgICAgICAgICAgICAgIGlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMoSkFYV1NIYW5kbGVyVXRpbHMuSEFORExFUl9DSEFJTikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmdldENoaWxkcmVuKCkuc2l6ZSgpID4gMDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgew0KLSAgICAgICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7DQotICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBpbnB1dEVsZW1lbnQ7DQotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldENoaWxkcmVuKCkudG9BcnJheSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt9Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgew0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDFhNDMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhOTkwOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTA0ODRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NGIyNDIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMA0KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHM7c2luZ2xldG9uOj10cnVlDQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbg0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywNCi0gb3JnLmVjbGlwc2UudGV4dCwNCi0gb3JnLmVjbGlwc2UudWksDQotIG9yZy5lY2xpcHNlLnVpLmlkZSwNCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUNCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6eiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmRvbS52YWxpZGF0aW9uLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbCwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cyIsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzDQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnBsdWdpbi5KYXh3c1V0aWxzUGx1Z2luDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTBhZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BdWd1c3QgMTUsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FhZTI0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNmUzMmY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUJ1bmRsZS1OYW1lLjA9SkFYLVdTIFV0aWxzDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMjkzMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/Pg0KLTwhLS0NCi0gICAgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAgIA0KLSAgICBDb250cmlidXRvcnM6DQotICAgICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gLS0+DQotDQotPHBsdWdpbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPg0KLSAgICAgIDxzdGFydHVwPjwvc3RhcnR1cD4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL0NvbnRyYWN0Q2hlY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9Db250cmFjdENoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2YxM2I4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL0NvbnRyYWN0Q2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzOw0KLQ0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi0NCi0vKioNCi0gKiBDb250YWlucyBjaGVja3MgZnJlcXVlbnRseSBhcHBsaWVkIG9uIHBhcmFtZXRlcnMuDQotICogDQotICogQGF1dGhvciBKb2VyZyBEZWhtZWwNCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udHJhY3RDaGVja2VyDQotew0KLQlwcml2YXRlIENvbnRyYWN0Q2hlY2tlcigpDQotCXsNCi0JCS8vIHByZXZlbnQgaW5zdGFudGlhdGlvbiBmcm9tIG91dHNpZGUNCi0JfQ0KLQkNCi0JLyoqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHZhbHVlIGlzIG51bGwgYW5kIHJlcG9ydHMgYW4gPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+DQotCSAqIGluIHRoaXMgY2FzZS4NCi0JICogQHBhcmFtIHBhcmFtVmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNoZWNrZWQNCi0JICogQHBhcmFtIHBhcmFtTmFtZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIsIHVzZWQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHRoZSB1c2VyDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhyb3duIGVpdGhlciB0aGUgcGFyYW1WYWx1ZSBvciBwYXJhbU5hbWUgaXMgbnVsbCAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbnVsbENoZWNrUGFyYW0oZmluYWwgT2JqZWN0IHBhcmFtVmFsdWUsIGZpbmFsIFN0cmluZyBwYXJhbU5hbWUpDQotCXsNCi0JCWlmIChwYXJhbU5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhcmFtTmFtZSBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQgDQotCQl9DQotCQlpZiAocGFyYW1WYWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihwYXJhbU5hbWUgKyAiIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJCANCi0JCX0NCi0JfQ0KLQkNCi0JLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXJhbWV0ZXIgdmFsdWUgaXMgbnVsbCBhbmQgcmVwb3J0cyBhbiA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4NCi0JICogaW4gdGhpcyBjYXNlLg0KLQkgKiBAcGFyYW0gcGFyYW1WYWx1ZSB0aGUgdmFsdWUgdG8gYmUgY2hlY2tlZA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHRocm93biBpZiB0aGUgcGFyYW1WYWx1ZSBpcyBudWxsICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBudWxsQ2hlY2tQYXJhbShmaW5hbCBPYmplY3QgcGFyYW1WYWx1ZSkNCi0Jew0KLQkJaWYgKHBhcmFtVmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhcmFtVmFsdWUgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0JDQotCS8qKiBDaGVja3MgaWYgdGhlIGdpdmVuIGZpZWxkIHZhbHVlIGlzIG51bGwgYW5kIHJlcG9ydHMgYW4gPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPg0KLQkgKiBpbiB0aGlzIGNhc2UuDQotCSAqIEBwYXJhbSBmaWVsZFZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkDQotCSAqIEBwYXJhbSBmaWVsZE5hbWUgbmFtZSBvZiB0aGUgZmllbGQsIHVzZWQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHRoZSB1c2VyDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBmaWVsZE5hbWUgaXMgbnVsbA0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGZpZWxkVmFsdWUgaXMgbnVsbCAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbnVsbENoZWNrRmllbGQoZmluYWwgT2JqZWN0IGZpZWxkVmFsdWUsIGZpbmFsIFN0cmluZyBmaWVsZE5hbWUpDQotCXsNCi0JCWlmIChmaWVsZE5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZpZWxkTmFtZSBtdXN0IG5vdCBiZSBudWxsIik7ICAvLyROT04tTkxTLTEkICANCi0JCX0NCi0JCWlmIChmaWVsZFZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmaWVsZE5hbWUgKyAiIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJCANCi0JCX0NCi0JfQ0KLQkNCi0JLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBmaWVsZCB2YWx1ZSBpcyBudWxsIGFuZCByZXBvcnRzIGFuIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4NCi0JICogaW4gdGhpcyBjYXNlLg0KLQkgKiBAcGFyYW0gZmllbGRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgY2hlY2tlZA0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGZpZWxkVmFsdWUgaXMgbnVsbCAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbnVsbENoZWNrRmllbGQoZmluYWwgT2JqZWN0IGZpZWxkVmFsdWUpDQotCXsNCi0JCWlmIChmaWVsZFZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZmllbGRWYWx1ZSBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBvZiBhIGxvY2FsIHZhcmlhYmxlIGlzIG51bGwgYW5kIHJlcG9ydHMgYW4gPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPg0KLQkgKiBpbiB0aGlzIGNhc2UuDQotCSAqIEBwYXJhbSB2YXJWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgY2hlY2tlZA0KLQkgKiBAcGFyYW0gdmFyTmFtZSBuYW1lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSwgdXNlZCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8gdGhlIHVzZXINCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHZhck5hbWUgaXMgbnVsbA0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHZhclZhbHVlIGlzIG51bGwgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIG51bGxDaGVja1ZhcmlhYmxlKGZpbmFsIE9iamVjdCB2YXJWYWx1ZSwgZmluYWwgU3RyaW5nIHZhck5hbWUpDQotCXsNCi0JCWlmICh2YXJOYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ2YXJOYW1lIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJCANCi0JCX0NCi0JCWlmICh2YXJWYWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24odmFyTmFtZSArICIgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0JDQotCS8qKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgb2YgYSBsb2NhbCB2YXJpYWJsZSBpcyBudWxsIGFuZCByZXBvcnRzIGFuIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4NCi0JICogaW4gdGhpcyBjYXNlLg0KLQkgKiBAcGFyYW0gdmFyVmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNoZWNrZWQNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGhyb3duIGlmIHRoZSB2YXJWYWx1ZSBpcyBudWxsICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBudWxsQ2hlY2tWYXJpYWJsZShmaW5hbCBPYmplY3QgdmFyVmFsdWUpDQotCXsNCi0JCWlmICh2YXJWYWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInZhclZhbHVlIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIDxjb2RlPnBhcmFtPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSBzdHJpbmcuDQotCSAqIEBwYXJhbSBwYXJhbQ0KLQkgKiBAcGFyYW0gdmFyTmFtZQ0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+cGFyYW08L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+cGFyYW08L2NvZGU+IGlzIGVtcHR5IHN0cmluZyBvciBjb250YWlucyBvbmx5DQotCSAqIHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbXB0eVN0cmluZ0NoZWNrUGFyYW0oZmluYWwgU3RyaW5nIHBhcmFtLCBmaW5hbCBTdHJpbmcgdmFyTmFtZSkgDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHBhcmFtLCB2YXJOYW1lKTsNCi0JCQ0KLQkJaWYgKHBhcmFtLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgiUGFyYW1ldGVyIHswfSBpcyBlbXB0eSBzdHJpbmcgb3IgY29udGFpbnMgb25seSB3aGl0ZSBzcGFjZXMiLCB2YXJOYW1lKSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL0pheFdzVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvSmF4V3NVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZWRkZTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvSmF4V3NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi0NCi0vKioNCi0gKiBVdGlsaXR5IHRoYXQgY29udGFpbnMgSkFYLVdTIHJlbGVhdGVkIGZ1bmN0aW9uYWxpdHkNCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKYXhXc1V0aWxzDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9TVUZGSVggPSAiQmVhbiI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfU1VGRklYID0gIlBvcnQiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX1NVRkZJWCA9ICJTZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JcHJpdmF0ZSBKYXhXc1V0aWxzKCkNCi0Jew0KLQkJLy8gaGlkZSBkZWZhdWx0IGNvbnN0cnVjdG9yDQotCX0NCi0NCi0JLyoqDQotCSAqIEFuIHV0aWxpdHkgbWV0aG9kIGZvciBjb21wb3NpbmcgYSBkZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UgZm9yIEpheFdzIGN1c3RvbWl6YXRpb24NCi0JICogb3V0IG9mIGEgcGFja2FnZSBuYW1lLg0KLQkgKiBBbGdvcml0aG06DQotCSAqIDxsaT5JbiBjYXNlIHRoZSBwYWNrYWdlIGhhcyAwIGZyYWdtZW50IChkZWZhdWx0IHBhY2thZ2UpIHRoZSByZXN1bHQgd291bGQgYmUgaHR0cDovLy88L2xpPg0KLQkgKiA8bGk+SW4gY2FzZSB0aGUgcGFja2FnZSBoYXMgMSBmcmFnbWVudCB0aGUgcmVzdWx0IHdvdWxkIGJlIGh0dHA6Ly9mcmFnbWVudDEvPC9saT4NCi0JICogPGxpPkluIGNhc2UgdGhlIHBhY2thZ2UgaGFzIDIgZnJhZ21lbnRzIHRoZSByZXN1bHQgd291bGQgYmUgaHR0cDovL2ZyYWdtZW50Mi5mcmFnbWVudDEvPC9saT4NCi0JICogPGxpPkluIGNhc2UgdGhlIHBhY2thZ2UgaGFzIG1vcmUgdGhhbiAyIGZyYWdtZW50cyB0aGUgcmVzdWx0IHdvdWxkIGJlIGh0dHA6Ly9mcmFnbWVudDIuZnJhZ21lbnQxL2ZyYWdtZW50My9mcmFnbWVudDQvLi4uL2ZyYWdtZW50bi88L2xpPg0KLQkgKiBAcGFyYW0gcGFja2FnZU5hbWUgTmFtZSBvZiB0aGUgcGFja2FnZQ0KLQkgKiBAcmV0dXJuIHRoZSBjb21wb3NlZCBuYW1lc3BhY2UNCi0JICogQHRob3J3cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHBhY2thZ2UgbmFtZSBzcGVjaWZpZWQgaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkNCi0Jew0KLQkJaWYocGFja2FnZU5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlBhY2thZ2UgbmFtZSBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCVN0cmluZ1tdIHBrZ0ZyYWdtZW50cyA9IHBhY2thZ2VOYW1lLnNwbGl0KCJcXC4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJDQotCQlpZihwa2dGcmFnbWVudHMubGVuZ3RoID4gMSkNCi0JCXsNCi0JCQkvLyByZXZlcnNlIHRoZSBmaXJzdCB0d28gZnJhZ21lbnRzIGluIGNhc2UgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBmcmFnbWVudHMgYXZhaWxhYmxlDQotCQkJU3RyaW5nIGZyYWcwID0gcGtnRnJhZ21lbnRzWzBdOw0KLQkJCXBrZ0ZyYWdtZW50c1swXSA9IHBrZ0ZyYWdtZW50c1sxXTsNCi0JCQlwa2dGcmFnbWVudHNbMV0gPSBmcmFnMDsNCi0JCX0NCi0JCQ0KLQkJU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigiaHR0cDovLyIpOyAvLyROT04tTkxTLTEkDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBrZ0ZyYWdtZW50cy5sZW5ndGg7IGkrKykNCi0JCXsNCi0JCQlyZXN1bHQuYXBwZW5kKHBrZ0ZyYWdtZW50c1tpXSk7DQotCQkJcmVzdWx0LmFwcGVuZChpPT0wICYmIHBrZ0ZyYWdtZW50cy5sZW5ndGg+MSA/ICIuIiA6ICIvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBTYW1lIGFzIGNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSgpIGJ1dCBmaXJzdCBleHRyYWN0cyB0aGUgcGFja2FnZSBvdXQgb2YgY2xhc3MNCi0JICogZnVsbHkgcXVhbGlmaWVkIG5hbWUNCi0JICogQHBhcmFtIGZxTmFtZSB0aGUgY2xhc3MgZnVsbHkgcXVhbGlmaWVkIG5hbWUNCi0JICogQHJldHVybiBjYWxjdWxhdGVkIHRhcmdldCBuYW1lc3BhY2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5RlFOYW1lKFN0cmluZyBmcU5hbWUpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmcU5hbWUsICJmcU5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmV0dXJuIGNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZShleHRyYWN0UGFja2FnZShmcU5hbWUpKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIFBvcnRUeXBlIG5hbWUgZnJvbSB0aGUgPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiBhbmQgPGNvZGU+c2VpTmFtZTwvY29kZT4uDQotCSAqIEBwYXJhbSBlbmRwb2ludCBjbGFzcy4NCi0JICogQHBhcmFtIHNlaU5hbWUNCi0JICogQHJldHVybiBQb3J0VHlwZSBuYW1lIGZvciB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiwgdGhlIG5hbWUgb2YgdGhlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gd2l0aCB0aGUgIlBvcnQiIHN1ZmZpeC4NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gc3BlY2lmaWVkIGlzIG51bGwuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQb3J0dHlwZU5hbWUoSVR5cGUgZW5kcG9pbnRUeXBlLCBTdHJpbmcgc2VpTmFtZSkNCi0Jew0KLQkJaWYoZW5kcG9pbnRUeXBlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJlbmRwb2ludFR5cGUgY291bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWlmKHNlaU5hbWUgIT0gbnVsbCAmJiBzZWlOYW1lLmxlbmd0aCgpID4gMCkNCi0JCXsNCi0JCQlyZXR1cm4gc2VpTmFtZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHJlbW92ZUJlYW5TdWZmaXhJZlJlcXVpcmVkKGVuZHBvaW50VHlwZS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgdGhlICJCZWFuIiBzdWZmaXggZnJvbSB0aGUgPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiBpbiBjYXNlIGl0IGlzIHByZXNlbnQgYW5kIGdlbmVyYXRlcyBTZXJ2aWNlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgSVR5cGUuDQotCSAqIEBwYXJhbSBlbmRwb2ludCBjbGFzcy4NCi0JICogQHJldHVybiBTZXJ2aWNlIG5hbWUgZm9yIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uLCB0aGUgbmFtZSBvZiB0aGUgPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiB3aXRob3V0IHRoZSAiQmVhbiIgc3VmZml4IGFuZCA8Y29kZT4iU2VydmljZSI8L2NvZGU+IGF0IHRoZSBlbmQuDQotCSAqIEluIGNhc2UgdGhlIG5hbWUgb2YgdGhlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gZXF1YWxzICJCZWFuIiB0aGVuIHRoZSBvcmlnaW5hbCBuYW1lIGlzIHJldHVybmVkIHdpdGggPGNvZGU+IlNlcnZpY2UiPC9jb2RlPiBhdGUgdGhlIGVuZC4NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gc3BlY2lmaWVkIGlzIG51bGwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKGZpbmFsIElUeXBlIGVuZHBvaW50VHlwZSkNCi0Jew0KLQkJaWYoZW5kcG9pbnRUeXBlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJlbmRwb2ludFR5cGUgY291bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHJlbW92ZUJlYW5TdWZmaXhJZlJlcXVpcmVkKGVuZHBvaW50VHlwZS5nZXRFbGVtZW50TmFtZSgpKSArIFNFUlZJQ0VfU1VGRklYOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZW1vdmVzIHRoZSAiQmVhbiIgc3VmZml4IGZyb20gdGhlIGVuZHBvaW50IG5hbWUgaW4gY2FzZSBpdCBpcyBwcmVzZW50LiAgDQotCSAqIEBwYXJhbSBlbmRwb2ludE5hbWUgdGhlIG5hbWUgb2YgdGhlIGVuZHBvaW50DQotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVuZHBvaW50IHdpdGhvdXQgdGhlICJCZWFuIiBzdWZmaXguIEluIGNhc2UgdGhlIG5hbWUgb2YgdGhlIGVuZHBvaW50IGVxdWFscyAiQmVhbiIgdGhlbiB0aGUgb3JpZ2luYWwgbmFtZSBpcyByZXR1cm5lZA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbW92ZUJlYW5TdWZmaXhJZlJlcXVpcmVkKGZpbmFsIFN0cmluZyBlbmRwb2ludE5hbWUpDQotCXsNCi0JCWFzc2VydCBlbmRwb2ludE5hbWUgIT0gbnVsbCAmJiBlbmRwb2ludE5hbWUubGVuZ3RoKCkgPiAwOw0KLQkJDQotCQlpZihlbmRwb2ludE5hbWUuZXF1YWxzKEJFQU5fU1VGRklYKSkNCi0JCXsNCi0JCQlyZXR1cm4gZW5kcG9pbnROYW1lOw0KLQkJfQ0KLQkJDQotCQlpZihlbmRwb2ludE5hbWUuZW5kc1dpdGgoQkVBTl9TVUZGSVgpKQ0KLQkJew0KLQkJCXJldHVybiBlbmRwb2ludE5hbWUuc3Vic3RyaW5nKDAsIGVuZHBvaW50TmFtZS5sYXN0SW5kZXhPZihCRUFOX1NVRkZJWCkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZW5kcG9pbnROYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBQb3J0IG5hbWUgZnJvbSB0aGUgPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPi4NCi0JICogQHBhcmFtIGVuZHBvaW50IGNsYXNzLg0KLQkgKiBAcmV0dXJuIFBvcnQgbmFtZSBmb3IgdGhlIEBXZWJTZXJ2aWNlIGFubm90YXRpb24sIHRoZSBuYW1lIG9mIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IHdpdGggdGhlICJQb3J0IiBzdWZmaXguDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IHNwZWNpZmllZCBpcyBudWxsLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoZmluYWwgSVR5cGUgZW5kcG9pbnRUeXBlKQ0KLQl7DQotCQlyZXR1cm4gZ2V0RGVmYXVsdFBvcnROYW1lKGVuZHBvaW50VHlwZS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2VydmljZSBuYW1lIGNhbGN1bGF0ZWQgYXMgdGhlIHNwZWNpZmljYXRpb24gc3RhdGVzLg0KLQkgKiBAcGFyYW0gZnFOYW1lDQotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc2VydmljZSBuYW1lDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0U2VydmljZU5hbWUoZmluYWwgU3RyaW5nIGZxTmFtZSkNCi0Jew0KLQkJaWYoZnFOYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJlbmRwb2ludFR5cGUgY291bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGV4dHJhY3RTaG9ydE5hbWUoZnFOYW1lKSArIFNFUlZJQ0VfU1VGRklYOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB3c2RsOnBvcnRUeXBlIG5hbWUgZGVmaW5lZCBhcyBKQVgtV1Mgc3BlY2lmaWNhdGlvbiBzdGF0ZXMuIA0KLQkgKiBAcGFyYW0gZnFOYW1lDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRQb3J0dHlwZU5hbWUoZmluYWwgU3RyaW5nIGZxTmFtZSkNCi0Jew0KLQkJaWYoZnFOYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmcU5hbWUgY291bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGV4dHJhY3RTaG9ydE5hbWUoZnFOYW1lKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBuYW1lIGZvciBhIHdzZGw6cG9ydCBkZWZpbmVkIGFzIEpBWC1XUyBzcGVjaWZpY2F0aW9uIHN0YXRlcyANCi0JICogQHBhcmFtIGZxTmFtZQ0KLQkgKiBAcmV0dXJuIHRoZSBjYWxjdWxhdGVkIG5hbWUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRQb3J0TmFtZShmaW5hbCBTdHJpbmcgZnFOYW1lKQ0KLQl7DQotCQlpZihmcU5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZxTmFtZSBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGV4dHJhY3RTaG9ydE5hbWUoZnFOYW1lKSArIFBPUlRfU1VGRklYOw0KLQl9CQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4dHJhY3RTaG9ydE5hbWUoU3RyaW5nIGZxTmFtZSkgDQotCXsNCi0JCWludCBwb3MgPSBmcU5hbWUubGFzdEluZGV4T2YoJy4nKTsNCi0JCWlmIChwb3MgPT0tMSApIHsNCi0JCQlyZXR1cm4gZnFOYW1lOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZnFOYW1lLnN1YnN0cmluZyhwb3MrMSk7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBleHRyYWN0UGFja2FnZShmaW5hbCBTdHJpbmcgZnFOYW1lKSANCi0Jew0KLQkJaW50IHBvcyA9IGZxTmFtZS5sYXN0SW5kZXhPZignLicpOw0KLQkJaWYgKHBvcyA9PS0xICkgew0KLQkJCXJldHVybiBmcU5hbWU7DQotCQl9DQotCQkNCi0JCXJldHVybiBmcU5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9TdGF0dXNVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9TdGF0dXNVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1Mzc3OWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvU3RhdHVzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlsczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi0NCi0NCi0vKioNCi0gKiBDb252ZW5pZW5jZSBtZXRob2RzIHRvIG1hbmFnZSBzdGF0dXMgb2JqZWN0cy4NCi0gKiANCi0gKiBAYXV0aG9yIEpvZXJnIERlaG1lbA0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0dXNVdGlscw0KLXsNCi0JcHJpdmF0ZSBTdGF0dXNVdGlscygpDQotCXsNCi0JCS8vIG5vIGluc3RhbnRpYXRpb24NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEZpbmRzIHRoZSBtb3N0IHNldmVyZSBzdGF0dXMgZnJvbSBhIGFycmF5IG9mIHN0YXRpLg0KLQkgKiBBbiBlcnJvciBpcyBtb3JlIHNldmVyZSB0aGFuIGEgd2FybmluZywgYW5kIGEgd2FybmluZyBpcyBtb3JlIHNldmVyZQ0KLQkgKiB0aGFuIG9rLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGdldE1vc3RTZXZlcmUoSVN0YXR1c1tdIHN0YXR1cykgew0KLQkJSVN0YXR1cyBtYXg9IG51bGw7DQotCQlmb3IgKGludCBpPSAwOyBpIDwgc3RhdHVzLmxlbmd0aDsgaSsrKSB7DQotCQkJSVN0YXR1cyBjdXJyPSBzdGF0dXNbaV07DQotCQkJaWYgKGN1cnIubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgew0KLQkJCQlyZXR1cm4gY3VycjsNCi0JCQl9DQotCQkJaWYgKG1heCA9PSBudWxsIHx8IGN1cnIuZ2V0U2V2ZXJpdHkoKSA+IG1heC5nZXRTZXZlcml0eSgpKSB7DQotCQkJCW1heD0gY3VycjsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbWF4Ow0KLQl9DQotCQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IElTdGF0dXMuQ0FOQ0VMLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIHRoZSBjYW5jZWwgc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzQ2FuY2VsKGZpbmFsIFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuQ0FOQ0VMLCBtZXNzYWdlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IElTdGF0dXMuRVJST1IuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEByZXR1cm4gdGhlIGVycm9yIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c0Vycm9yKGZpbmFsIFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5FUlJPUi4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHBhcmFtIGV4DQotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHN0YXR1cw0KLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzdGF0dXNFcnJvcihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGV4KQ0KLQl7DQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGV4KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IElTdGF0dXMuV0FSTklORy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHJldHVybiB0aGUgd2FybmluZyBzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzdGF0dXNXYXJuaW5nKGZpbmFsIFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLldBUk5JTkcuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEBwYXJhbSBleA0KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdGF0dXMNCi0JICogQHJldHVybiB0aGUgd2FybmluZyBzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzdGF0dXNXYXJuaW5nKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgZXgpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBtZXNzYWdlLCBleCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLklORk8uDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEByZXR1cm4gdGhlIGluZm8gc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzSW5mbyhmaW5hbCBTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLklORk8sIG1lc3NhZ2UpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IElTdGF0dXMuSU5GTy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHJldHVybiB0aGUgaW5mbyBzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzdGF0dXNJbmZvKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5JTkZPLCBtZXNzYWdlLCBjYXVzZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5PSy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHJldHVybiB0aGUgb2sgc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzT2soZmluYWwgU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywgbWVzc2FnZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoZmluYWwgaW50IHNldmVyaXR5LCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksICJpZCIsIDAsIG1lc3NhZ2UsIG51bGwpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoZmluYWwgaW50IHNldmVyaXR5LCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGV4KQ0KLQl7DQotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgImlkIiwgMCwgbWVzc2FnZSwgZXgpOyAvLyROT04tTkxTLTEkDQotCX0NCi0JDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBtdWx0aXN0YXR1cyBvYmplY3QNCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHJldHVybiBtdWx0aXN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBNdWx0aVN0YXR1cyBjcmVhdGVNdWx0aVN0YXR1cyhTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBNdWx0aVN0YXR1cygiaWQiLCAwLCBtZXNzYWdlLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWYyZmQzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvbkltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25JbnNwZWN0b3JJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFycmF5VmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Cb29sZWFuVmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5DbGFzc1ZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuSW50ZWdlclZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuUGFyYW1WYWx1ZVBhaXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5RdWFsaWZpZWROYW1lVmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5TdHJpbmdWYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC50ZXh0LkpheFdzVXRpbE1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247DQotDQotDQotLyoqDQotICogRmFjdG9yeSBjbGFzcyBjb250YWluaW5nIGNvbW1vbiBmYWN0b3J5IGFuZCB1dGlsaXR5IG1ldGhvZHMgQW5ub3RhdGlvbiBwcm9jZXNzaW5nLg0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmFjdG9yeQ0KLXsNCi0JLyoqDQotCSAqIENyZWF0ZXMgY29tcGxleCBBbm5vdGF0aW9uLCBlLmcuIEFubm90YXRpb24gb2Yga2luZCBcQFdlYlNlcnZpY2UocGFyYW0xPSJ2YWx1ZTEiLCBwYXJhbTI9InZhbHVlMiIpLg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb25RTmFtZQ0KLQkgKiBAcGFyYW0gcGFyYW1WYWx1ZVBhaXJzDQotCSAqIA0KLQkgKiBAcmV0dXJuIEluc3RhbnRpYXRlZCBBbm5vdGF0aW9uIG9mIHR5cGUgSUNvbXBsZXhBbm5vdGF0aW9uLg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDx0dD5hbm5vdGF0aW9uUU5hbWU8L3R0PiBvciA8dHQ+cGFyYW1WYWx1ZVBhaXJzPC90dD4gYXJlIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPHR0PmFubm90YXRpb25RTmFtZTwvdHQ+IGlzIGVtcHR5IFN0cmluZy4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IElBbm5vdGF0aW9uPFQ+IGNyZWF0ZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25RTmFtZSwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzLCBmaW5hbCBUIGFwcGxpZWRFbGVtZW50KQ0KLQl7DQotCQlpZiAoYW5ub3RhdGlvblFOYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJhbm5vdGF0aW9uUU5hbWUgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZiAoYW5ub3RhdGlvblFOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFubm90YXRpb25RTmFtZSBzaG91bGQgbm90IGJlIGVtcHR5IFN0cmluZyEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJaWYgKHBhcmFtVmFsdWVQYWlycyA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW1WYWx1ZVBhaXJzIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJZmluYWwgQW5ub3RhdGlvbkltcGw8VD4gaW1wbCA9IG5ldyBBbm5vdGF0aW9uSW1wbDxUPihhbm5vdGF0aW9uUU5hbWUsIHBhcmFtVmFsdWVQYWlycyk7DQotCQlpbXBsLnNldEphdmFFbGVtZW50KGFwcGxpZWRFbGVtZW50KTsNCi0JCQ0KLQkJcmV0dXJuIGltcGw7DQotCX0NCi0JDQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgSUFubm90YXRpb259IGluc3RhbmNlIHRoYXQgcmVmZXJlbmNlcyA8Y29kZT5hcHBsaWVkRWxlbWVudDwvY29kZT4gamF2YSBlbGVtZW50IA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvblFOYW1lIHRoZSBhbm5vdGF0aW9uIG5hbWUNCi0JICogQHBhcmFtIGFwcGxpZWRFbGVtZW50IHRoZSBqYXZhIGVsZW1lbnQgdGhhdCB0aGlzIGFubm90YXRpb24gaXMgYXBwbGllZCBvbg0KLQkgKiBAcGFyYW0gcGFyYW1WYWx1ZVBhaXJzIHRoZSBhbm5vdGF0aW9uIGF0dHJpYnV0ZXMNCi0JICogQHJldHVybiB7QGxpbmsgSUFubm90YXRpb259IGluc3RhbmNlDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSBzb21lIG9mIHBhcmFtcyBpcyA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gaXMgZW1wdHkgc3RyaW5nDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGNyZWF0ZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25RTmFtZSwgSUphdmFFbGVtZW50IGFwcGxpZWRFbGVtZW50LCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMpDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKGFubm90YXRpb25RTmFtZSwgImFubm90YXRpb25RTmFtZSIpOwkgLy8kTk9OLU5MUy0xJAkNCi0JCWlmIChhbm5vdGF0aW9uUU5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbm5vdGF0aW9uUU5hbWUgc2hvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmchIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCW51bGxDaGVja1BhcmFtKHBhcmFtVmFsdWVQYWlycywgInBhcmFtVmFsdWVQYWlycyIpOyAvLyROT04tTkxTLTEkDQotCQludWxsQ2hlY2tQYXJhbShhcHBsaWVkRWxlbWVudCwgImFwcGxpZWRFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWZpbmFsIEFubm90YXRpb25JbXBsPElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJSmF2YUVsZW1lbnQ+KGFubm90YXRpb25RTmFtZSwgcGFyYW1WYWx1ZVBhaXJzKTsNCi0JCWFubm90YXRpb24uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShhcHBsaWVkRWxlbWVudCk7DQotCQkNCi0JCXJldHVybiBhbm5vdGF0aW9uOw0KLQl9CQ0KLQkNCi0JLyoqDQotCSogQ3JlYXRlcyBwYXJhbS12YWx1ZSBwYWlyIG5lZWRlZCBpbiBjb21wbGV4IEFubm90YXRpb25zLg0KLQkgKiANCi0JICogQHBhcmFtIHBhcmFtDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKiANCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiBJUGFyYW1WYWx1ZVBhaXINCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5wYXJhbTwvY29kZT4gb3IgPGNvZGU+dmFsdWU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnBhcmFtPC9jb2RlPiBwYXJhbWV0ZXIgaXMgZW1wdHkgU3RyaW5nLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJUGFyYW1WYWx1ZVBhaXIgY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShTdHJpbmcgcGFyYW0sIElWYWx1ZSB2YWx1ZSkNCi0Jew0KLQkJaWYgKHBhcmFtID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbSBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmIChwYXJhbS50cmltKCkubGVuZ3RoKCkgPT0gMCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJhbSBzaG91bGQgbm90IGJlIGVtcHR5IFN0cmluZyEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJaWYgKHZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ2YWx1ZSBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKHBhcmFtLCB2YWx1ZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBJVmFsdWV9IGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIDxjb2RlPnZhbHVlczwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWVzDQotCSAqIA0KLQkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAbGluayBJVmFsdWV9DQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+dmFsdWVzPC9jb2RlPiBpcyBudWxsLg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnZhbHVlczwvY29kZT4gaXMgZW1wdHkgU2V0Lg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJVmFsdWUgY3JlYXRlQXJyYXlWYWx1ZShTZXQ8SVZhbHVlPiB2YWx1ZXMpDQotCXsNCi0JCWlmICh2YWx1ZXMgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZhbHVlcyBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmICh2YWx1ZXMuc2l6ZSgpIDwgMSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2YWx1ZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSBTZXQhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElWYWx1ZX0gaW5zdGFuY2Ugb3V0IG9mIDxjb2RlPnZhbHVlPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKiANCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGxpbmsgSVZhbHVlfQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJVmFsdWUgY3JlYXRlQm9vbGVhblZhbHVlKGJvb2xlYW4gdmFsdWUpDQotCXsNCi0JCXJldHVybiBuZXcgQm9vbGVhblZhbHVlSW1wbCh2YWx1ZSk7DQotCX0NCi0JCQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgSVZhbHVlfSBpbnN0YW5jZSBvdXQgb2YgPGNvZGU+dmFsdWU8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqIA0KLQkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAbGluayBTdHJpbmd9DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElWYWx1ZSBjcmVhdGVDbGFzc1ZhbHVlKFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJaWYgKHZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ2YWx1ZSBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKHZhbHVlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2YWx1ZSBzaG91bGQgbm90IGJlIGVtcHR5IFN0cmluZyIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCXJldHVybiBuZXcgQ2xhc3NWYWx1ZUltcGwodmFsdWUpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgSVZhbHVlfSBpbnN0YW5jZSBvdXQgb2YgPGNvZGU+dmFsdWU8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqIA0KLQkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAbGluayBJVmFsdWV9DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElWYWx1ZSBjcmVhdGVJbnRlZ2VyVmFsdWUoU3RyaW5nIHZhbHVlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEludGVnZXJWYWx1ZUltcGwodmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBJVmFsdWV9IGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGZ1bGx5IHF1YWxpZmllZCBuYW1lLg0KLQkgKiANCi0JICogQHBhcmFtIHF1YWxpZmllZE5hbWUNCi0JICoNCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGxpbmsgSVZhbHVlfQ0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDx0dD5xdWFsaWZpZWROYW1lPC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBpcyBub3QgaW4gY29ycmVjdCBmb3JtIGUuZy4gY291bGQgbm90IGJlIGVtcHR5IFN0cmluZywgc2hvbGQgYmUgcXVhbGlmaWVkLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJVmFsdWUgY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKFN0cmluZyBxdWFsaWZpZWROYW1lKQ0KLQl7DQotCQlpZiAocXVhbGlmaWVkTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicXVhbGlmaWVkTmFtZSBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWlmIChxdWFsaWZpZWROYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwIHx8IHF1YWxpZmllZE5hbWUuaW5kZXhPZignLicpID09IC0xKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1YWxpZmllZE5hbWUgaXMgbm90IGluIGNvcnJlY3QgZm9ybSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lVmFsdWVJbXBsKHF1YWxpZmllZE5hbWUpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgSVZhbHVlfSBpbnN0YW5jZSBvdXQgb2YgPGNvZGU+dmFsdWU8L2NvZGU+IGNvbnRlbnQuDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICoNCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGxpbmsgSVZhbHVlfQ0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPHR0PnZhbHVlPC90dD4gaXMgbnVsbC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVZhbHVlIGNyZWF0ZVN0cmluZ1ZhbHVlKFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJaWYgKHZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ2YWx1ZSBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBuZXcgU3RyaW5nVmFsdWVJbXBsKHZhbHVlKTsNCi0JfQ0KLQkNCi0JDQotLy8JLyoqDQotLy8JICogUmV0cmlldmVzIGFsbCBBbm5vdGF0aW9ucyBmcm9tIGNsYXNzLg0KLS8vCSAqIA0KLS8vCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLS8vCSAqDQotLy8JICogQHJldHVybiBjb250YWluZWQgYW5ub3RhdGlvbnMgaW4gPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+DQotLy8JICogDQotLy8JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gaWYgZXhjZXB0aW9uIG9jY3Vycw0KLS8vCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0PmphdmFFbGVtZW50PC90dD4gaXMgbnVsbC4NCi0vLwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPiBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4gU3VwcG9ydGVkIHR5cGVzIGFyZTogSXR5cGUsIElNZXRob2QsIElGaWVsZCwgSVR5cGVQYXJhbWV0ZXINCi0vLwkgKi8NCi0vLwlwdWJsaWMgc3RhdGljIFNldDxJQW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotLy8Jew0KLS8vCQlpZiAoamF2YUVsZW1lbnQgPT0gbnVsbCkNCi0vLwkJew0KLS8vCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJqYXZhRWxlbWVudCBzaG91bGQgbm90IGJlIG51bGwhIik7DQotLy8JCX0NCi0vLwkJaWYoIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB8fCAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgfHwgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkgfHwgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKSkNCi0vLwkJew0KLS8vCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiamF2YUVsZW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgdHlwZSEiKTsNCi0vLwkJfQ0KLS8vCQlwcHBwcHANCi0vLwl9DQotCQ0KLQkvKioNCi0JICogUmVtb3ZlcyBhbGwgQW5ub3RhdGlvbnMgZnJvbSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0JICoNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+amF2YUVsZW1lbnQ8L3R0PiBpcyBudWxsLg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPiBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4gU3VwcG9ydGVkIHR5cGVzIGFyZTogSXR5cGUsIElNZXRob2QsIElGaWVsZCwgSVR5cGVQYXJhbWV0ZXINCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoamF2YUVsZW1lbnQgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphdmFFbGVtZW50IHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJqYXZhRWxlbWVudCBpcyBub3Qgb2YgY29ycmVjdCB0eXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZW1vdmVBbm5vdGF0aW9ucyhqYXZhRWxlbWVudCwgbnVsbCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIEFubm90YXRpb25zIHdpdGggbmFtZXMgY29udGFpbmVkIGluIDxjb2RlPmFubm90YXRpb25zPC9jb2RlPiBmcm9tIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPiBhbmQgaXRzIGNoaWxkcmVuLCBpZiBzdWNoIGV4aXN0Lg0KLQkgKiANCi0JICogQHBhcmFtIGphdmFFbGVtZW50DQotCSAqIEBwYXJhbSBhbm5vdGF0aW9ucw0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+amF2YUVsZW1lbnQ8L3R0PiBvciA8dHQ+YW5ub3RhdGlvbnM8L3R0PiBpcyBudWxsLg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPiBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4gU3VwcG9ydGVkIHR5cGVzIGFyZTogSXR5cGUsIElNZXRob2QsIElGaWVsZCwgSVR5cGVQYXJhbWV0ZXINCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9ucykgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJaWYgKGphdmFFbGVtZW50ID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJqYXZhRWxlbWVudCBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKCEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiamF2YUVsZW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgdHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJdHJ5IA0KLQkJew0KLQkJCUFubm90YXRpb25VdGlscy5nZXRJbnN0YW5jZSgpLnJlbW92ZUFubm90YXRpb25zKGphdmFFbGVtZW50LCBhbm5vdGF0aW9ucywgdHJ1ZSk7DQotCQl9IA0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfSANCi0JCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5JbnZhbGlkVHJlZVN0YXRlTXNnLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5Db21wVW5pdE1pc3NpbmdNc2csIGUpOw0KLQkJfSANCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ2Fubm90UGVyZm9ybUVkaXRNc2csIGUpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlIGluc3RhbmNlIG9mIElBbm5vdGF0aW9uSW5zcGVjdG9yIGZvciBhIHNwZWNpZmljIElUeXBlLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUgLSBJVHlwZSwgd2hpY2ggd2lsbCBiZSBpbnNwZWN0ZWQuDQotCSAqICANCi0JICogQHJldHVybiBJQW5ub3RhdGlvbkluc3BlY3Rvcg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJQW5ub3RhdGlvbkluc3BlY3RvciBjcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKElUeXBlIHR5cGUpDQotCXsNCi0JCXJldHVybiBuZXcgQW5ub3RhdGlvbkluc3BlY3RvckltcGwodHlwZSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODU1OGE5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uLkxvY2FsaXplZEV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBFeGNlcHRpb24gdGhyb3duIGJ5IGFubm90YXRpb24gZ2VuZXJhdG9yIGluIGNhc2Ugd2hlbiB1bmV4cGVjdGVkIGNvbmRpdGlvbiBpcyBtZXQNCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiBleHRlbmRzIExvY2FsaXplZEV4Y2VwdGlvbg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBnZXR0aW5nIGVycm9yIG1lc3NhZ2UsIGxvY2FsaXplZCBtZXNzYWdlIGFuZCB7QGxpbmsgVGhyb3dhYmxlfSB0byBiZSB3cmFwcGVkDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiBAcGFyYW0gbG9jYWxpemVkTWVzc2FnZSANCi0JICogQHBhcmFtIHQNCi0JICovDQotCXB1YmxpYyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIHQpDQotCXsNCi0JCXN1cGVyKG1lc3NhZ2UsIGxvY2FsaXplZE1lc3NhZ2UsIHQpOwkNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3Igd2l0aCBlcnJvciBtZXNzYWdlIGFuZCBhIGxvY2FsaXplZCBtZXNzYWdlLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogQHBhcmFtIGxvY2FsaXplZE1lc3NhZ2UNCi0JICovDQotCXB1YmxpYyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSkNCi0Jew0KLQkJc3VwZXIobWVzc2FnZSwgbG9jYWxpemVkTWVzc2FnZSk7CQkNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25Xcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbldyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjA3MzJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbldyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuY2xhenouQVNUVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC50ZXh0LkpheFdzVXRpbE1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLkVkaXRSZXNvdXJjZXNNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLkZpbGVVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5JRmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7DQotDQotLyoqDQotICogQ2xhc3MsIHdoaWNoIGlzIHVzZWQgdG8gc2F2ZSB0aGUgYW5ub3RhdGlvbnMuDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbldyaXRlcg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbldyaXRlciB3cml0ZXIgPSBudWxsOw0KLQlwcml2YXRlIGZpbmFsIElGaWxlVXRpbHMgZmlsZVV0aWxzID0gRmlsZVV0aWxzLmdldEluc3RhbmNlKCk7DQotDQotCS8qKg0KLQkgKiBUaGUgZmFjdG9yeSBtZXRob2QuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGEgQW5ub3RhdGlvbldyaXRlciBpbnN0YW5jZS4NCi0JICovDQotCXB1YmxpYyBzdGF0aWM8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gQW5ub3RhdGlvbldyaXRlciBnZXRJbnN0YW5jZSgpDQotCXsNCi0JCWlmICh3cml0ZXIgPT0gbnVsbCkNCi0JCXsNCi0JCQl3cml0ZXIgPSBuZXcgQW5ub3RhdGlvbldyaXRlcigpOw0KLQkJfQ0KLQkJcmV0dXJuIHdyaXRlcjsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEFkZHMgQW5ub3RhdGlvbiB0byBzcGVjaWZpYyBJSmF2YUVsZW1lbnQuDQotCSAqIA0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0PmphdmFFbGVtZW50PC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IElUeXBlLCBJTWV0aG9kLCBJRmllbGQsIElUeXBlUGFyYW1ldGVyLg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24uDQotCSAqLw0KLQlwdWJsaWMgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgc2V0QXBwbGllZEVsZW1lbnQoZmluYWwgSUFubm90YXRpb248VD4gYW5ub3RhdGlvbiwgZmluYWwgVCBqYXZhRWxlbWVudCkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwgPSAoQW5ub3RhdGlvbkltcGw8VD4pYW5ub3RhdGlvbjsNCi0JCWFubm90YXRpb25JbXBsLnNldEphdmFFbGVtZW50KGphdmFFbGVtZW50KTsNCi0JCQ0KLQkJc2V0QW5ub3RhdGF0aW9uU3RyaW5nVmFsbHVlKGFubm90YXRpb25JbXBsLCB0cnVlLCBqYXZhRWxlbWVudCk7DQotCX0NCi0JDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgc2V0QW5ub3RhdGF0aW9uU3RyaW5nVmFsbHVlKEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsLCBib29sZWFuIG5lZWRTYXZlLCBmaW5hbCBUIGphdmFFbGVtZW50KSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoIW5lZWRTYXZlKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKQ0KLQkJew0KLQkJCWFkZFRvQ2xhc3MoYW5ub3RhdGlvbkltcGwsIChJVHlwZSlqYXZhRWxlbWVudCk7CQkJCQ0KLQkJfQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpDQotCQl7DQotCQkJYWRkVG9GaWVsZChhbm5vdGF0aW9uSW1wbCwgKElGaWVsZClqYXZhRWxlbWVudCk7DQotCQl9DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpDQotCQl7DQotCQkJYWRkVG9NZXRob2QoYW5ub3RhdGlvbkltcGwsIChJTWV0aG9kKWphdmFFbGVtZW50KTsNCi0JCX0NCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpDQotCQl7DQotCQkJYWRkVG9QYXJhbShhbm5vdGF0aW9uSW1wbCwgKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50KTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBhZGRUb0NsYXNzKEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsLCBJVHlwZSBjbGFzc1R5cGUpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBjbGFzc1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0NCi0JCWFkZFRvTWVtYmVyKGFubm90YXRpb25JbXBsLCBjbGFzc1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIGNsYXNzVHlwZSwgY2xhc3NOYW1lKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIGFkZFRvRmllbGQoQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwsIElGaWVsZCBmaWVsZFR5cGUpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBmaWVsZFR5cGUuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0NCi0JCWFkZFRvTWVtYmVyKGFubm90YXRpb25JbXBsLCBmaWVsZFR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIGZpZWxkVHlwZSwgY2xhc3NOYW1lKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIGFkZFRvTWV0aG9kKEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsLCBJTWV0aG9kIG1ldGhvZFR5cGUpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBtZXRob2RUeXBlLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7DQotDQotCQlhZGRUb01lbWJlcihhbm5vdGF0aW9uSW1wbCwgbWV0aG9kVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbWV0aG9kVHlwZSwgY2xhc3NOYW1lKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIGFkZFRvUGFyYW0oQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwsIElUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSU1lbWJlciBtZW1iZXIgPSB0eXBlUGFyYW0uZ2V0RGVjbGFyaW5nTWVtYmVyKCk7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsNCi0JCWlmIChtZW1iZXIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKQ0KLQkJew0KLQkJCWNsYXNzTmFtZSA9IG1lbWJlci5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCWNsYXNzTmFtZSA9IG1lbWJlci5nZXRFbGVtZW50TmFtZSgpOw0KLQkJfQ0KLQ0KLQkJYWRkVG9NZW1iZXIoYW5ub3RhdGlvbkltcGwsIG1lbWJlci5nZXRDb21waWxhdGlvblVuaXQoKSwgdHlwZVBhcmFtLCBjbGFzc05hbWUpOw0KLQl9DQotDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgYWRkVG9NZW1iZXIoQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwsIElDb21waWxhdGlvblVuaXQgY1VuaXQsIElKYXZhRWxlbWVudCB0eXBlLCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlpZiAoY1VuaXQgPT0gbnVsbCkNCi0JCQl7DQotCQkJCXJldHVybjsNCi0JCQl9DQotDQotCQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjVW5pdCwgbnVsbCk7DQotCQkJQVNUIGFzdCA9IHVuaXQuZ2V0QVNUKCk7DQotDQotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCB1bml0KTsNCi0JCQlpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpDQotCQkJew0KLQkJCQlzd2l0Y2ggKHR5cGUuZ2V0RWxlbWVudFR5cGUoKSkNCi0JCQkJew0KLQkJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOg0KLQkJCQkJYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uSW1wbCwgY1VuaXQsIHVuaXQsIGFzdCwgdHlwZURlY2xhcmF0aW9uKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6DQotCQkJCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24oKElNZXRob2QpIHR5cGUsIHR5cGVEZWNsYXJhdGlvbik7DQotCQkJCQlhZGRBbm5vdGF0aW9uKGFubm90YXRpb25JbXBsLCBjVW5pdCwgdW5pdCwgYXN0LCBtZXRob2REZWNsYXJhdGlvbik7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQ6DQotCQkJCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldEZpZWxkRGVjbGFyYXRpb24oKElGaWVsZCkgdHlwZSwgdHlwZURlY2xhcmF0aW9uKTsNCi0JCQkJCWFkZEFubm90YXRpb24oYW5ub3RhdGlvbkltcGwsIGNVbml0LCB1bml0LCBhc3QsIGZpZWxkRGVjbGFyYXRpb24pOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSOg0KLQkJCQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IChJVHlwZVBhcmFtZXRlcikgdHlwZTsNCi0JCQkJCWlmICh0eXBlUGFyYW1ldGVyLmdldERlY2xhcmluZ01lbWJlcigpLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkNCi0JCQkJCXsNCi0JCQkJCQltZXRob2REZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24oKElNZXRob2QpIHR5cGVQYXJhbWV0ZXIuZ2V0RGVjbGFyaW5nTWVtYmVyKCksIHR5cGVEZWNsYXJhdGlvbik7DQotCQkJCQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbURlY2xhcmF0aW9uID0gZ2V0UGFyYW1EZWNsYXJhdGlvbih0eXBlUGFyYW1ldGVyLCBtZXRob2REZWNsYXJhdGlvbik7DQotCQkJCQkJYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uSW1wbCwgY1VuaXQsIHVuaXQsIGFzdCwgcGFyYW1EZWNsYXJhdGlvbik7DQotCQkJCQl9DQotCQkJCQlicmVhazsNCi0JCQkJZGVmYXVsdDoNCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVuc3VwcG9ydGVkIHR5cGUgZm9yIGFubm90YXRpb24iKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuSW52YWxpZFRyZWVTdGF0ZU1zZywgZSk7DQotCQl9DQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ2Fubm90UGVyZm9ybUVkaXRNc2csIGUpOw0KLQkJfQ0KLQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5Db21wVW5pdE1pc3NpbmdNc2csIGUpOw0KLQkJfQ0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIGFkZEFubm90YXRpb24oQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwsIElDb21waWxhdGlvblVuaXQgY1VuaXQsIENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0LCBBU1ROb2RlIGRlY2xhcmF0aW9uKSANCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWVkaXRSZXNNYW5hZ2VyKCkuc2V0RmlsZUVkaXRhYmxlKChJRmlsZSkgY1VuaXQuZ2V0UmVzb3VyY2UoKSk7DQotDQotCQl1bml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCUV4cHJlc3Npb24gYW5ub3QgPSBhbm5vdGF0aW9uSW1wbC5nZXRFeHByZXNzaW9uKHVuaXQsIGFzdCk7DQotDQotCQlMaXN0IG1vZGlmaWVycyA9IG51bGw7DQotDQotCQlzd2l0Y2ggKGRlY2xhcmF0aW9uLmdldE5vZGVUeXBlKCkpDQotCQl7DQotCQljYXNlIEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OOg0KLQkJY2FzZSBBU1ROb2RlLkZJRUxEX0RFQ0xBUkFUSU9OOg0KLQkJY2FzZSBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT046DQotCQkJbW9kaWZpZXJzID0gKChCb2R5RGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKS5tb2RpZmllcnMoKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgQVNUTm9kZS5TSU5HTEVfVkFSSUFCTEVfREVDTEFSQVRJT046DQotCQkJbW9kaWZpZXJzID0gKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbikubW9kaWZpZXJzKCk7DQotCQkJYnJlYWs7DQotCQlkZWZhdWx0Og0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFkZEFubm90YXRpb24oKSBpbGxlZ2FsIGRlY2xhdGFpb24gdHlwZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQltb2RpZmllcnMuYWRkKDAsIGFubm90KTsNCi0NCi0JCUlEb2N1bWVudCBkb2MgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXREb2N1bWVudChjVW5pdCk7DQotDQotCQlUZXh0RWRpdCBlZGl0ID0gdW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQlJU3RhdHVzIHN0YXR1cyA9IGVkaXRSZXNNYW5hZ2VyKCkuc2V0RmlsZUVkaXRhYmxlKChJRmlsZSkgY1VuaXQuZ2V0UmVzb3VyY2UoKSk7DQotCQlpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKQ0KLQkJew0KLQkJCWZpbGVVdGlscy5zZXRDb21waWxhdGlvblVuaXRDb250ZW50QW5kU2F2ZURpcnR5RWRpdG9ycyhjVW5pdCwgZG9jLmdldCgpLCB0cnVlLCBudWxsKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbigiQW5ub3RhdHRpb24gY291bGQgbm90IGJlIHN0b3JlZCwgdGhlIGZpbGUgaXMgbm90IHdyaXRhYmxlIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJSmF4V3NVdGlsTWVzc2FnZXMuQW5ub3RhdGlvbkNhbm5vdEJlU3RvcmVkTXNnKTsgDQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBnZXRQYXJhbURlY2xhcmF0aW9uKElUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKQ0KLQl7DQotCQkvL1RPRE8gY2hlY2sgdGhpcyBtZXRob2QNCi0JCWZpbmFsIFN0cmluZyBwYXJhbU5hbWUgPSB0eXBlUGFyYW1ldGVyLmdldEVsZW1lbnROYW1lKCk7DQotDQotCQlmb3IgKE9iamVjdCBkZWNsIDogbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpKQ0KLQkJew0KLQkJCWlmICghKGRlY2wgaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSkNCi0JCQl7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0NCi0JCQlpZiAocGFyYW1OYW1lLmVxdWFscygoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIGRlY2wpLmdldE5hbWUoKS50b1N0cmluZygpKSkNCi0JCQl7DQotCQkJCXJldHVybiAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgZGVjbDsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFVwZGF0ZXMgdGhlIFBhcmFtZXRlci1WYWx1ZSBQYWlycyBvZiBzcGVjaWZpYyBBbm5vdGF0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb24gLSBBbm5vdGF0aW9uLCB3aGljaCB3aWxsIGJlIHVwZGF0ZWQuDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqLw0KLQlwdWJsaWMgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgdXBkYXRlKGZpbmFsIElBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24pIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25JbXBsPFQ+IGFubm90YXR0aW9uSW1wbCA9IG5ldyBBbm5vdGF0aW9uSW1wbDxUPihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCksIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkpOw0KLQkJdHJ5DQotCQl7DQotCQkJdXBkYXRlVGhlQW5ub3RhdGlvbihhbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCksIGFubm90YXR0aW9uSW1wbCk7DQotCQl9IA0KLQkJY2F0Y2goTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkludmFsaWRUcmVlU3RhdGVNc2csIGUpOw0KLQkJfSANCi0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNhbm5vdFBlcmZvcm1FZGl0TXNnLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ29tcFVuaXRNaXNzaW5nTXNnLCBlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFVwZGF0ZXMgdGhlIFBhcmFtLVZhbHVlIFBhaXJzIG9mIHNwZWNpZmljIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbiAtIEFubm90YXRpb24sIHdoaWNoIHdpbGwgYmUgdXBkYXRlZC4NCi0JICogQHBhcmFtIHBhcmFtVmFsdWVQYWlycyB3aGljaCB3aWxsIGJlIHVwZGF0ZWQuIE9sZCBwYWlycyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBvbmNlLg0KLQkgKiBAcGFyYW0gcmVwbGFjZVByZXZpb3VzUGFpcnMgYm9vbGVhbiB2YWx1ZSB3aGljaCBzcGVjaWZpZXMgdGhlIHdheSwgaG93IG5ldyBJUGFyYW1WYWx1ZVBhaXJzIHdpbGwgYmUgdXBkYXRlZC4gSWYgdGhlIHZhbHVlIGlzIDx0dD50cnVlPC90dD4sDQotCSAqIHRoZSBTZXQgd2l0aCB0aGUgb2xkIElQYXJhbVZhbHVlUGFpcnMgd2lsbCBiZSBjbGVhcmVkIGFuZCB0aGUgbmV3IHZhbHVlcyB3aWxsIGJlIGFwcGxpZWQuIElmIHRoZSB2YWx1ZSBpcyA8dHQ+ZmFsc2U8L3R0PiB0aGUgb2xkIHBhaXJzIHdpbGwgYmUga2VwdA0KLQkgKiBhbmQgd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlICB2YWx1ZXMgZnJvbSB0aGUgbmV3IFNldCwgaWYgdGhlcmUgYXJlIHBhcmFtcyB3aGljaCBkbyBub3QgZXhpc3QgaW4gdGhlIG9sZCBvbmUsIHRoZXkgd2lsbCBiZSBhZGRlZC4NCi0JICogDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqIA0KLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBwdWJsaWMgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgdXBkYXRlKGZpbmFsIElBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24pIGluc3RlYWQuDQotCSAqLw0KLQlARGVwcmVjYXRlZA0KLQlwdWJsaWMgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgdXBkYXRlKGZpbmFsIElBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24sIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycywgYm9vbGVhbiByZXBsYWNlUHJldmlvdXNQYWlycykgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0JewkNCi0JCXVwZGF0ZUFubm90YXRpb24oYW5ub3RhdGlvbiwgYW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLCBwYXJhbVZhbHVlUGFpcnMsIHJlcGxhY2VQcmV2aW91c1BhaXJzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogDQotCSAqIEBwYXJhbSA8VD4NCi0JICogQHBhcmFtIGFubm90YXRpb24NCi0JICogQHBhcmFtIGphdmFFbGVtZW50DQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlUGFpcnMNCi0JICogQHBhcmFtIHJlcGxhY2VQcmV2aW91c1BhaXJzDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICogDQotCSAqLw0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHVwZGF0ZUFubm90YXRpb24oZmluYWwgSUFubm90YXRpb248VD4gYW5ub3RhdGlvbiwgZmluYWwgVCBqYXZhRWxlbWVudCwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzLCBib29sZWFuIHJlcGxhY2VQcmV2aW91c1BhaXJzKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCA9IChBbm5vdGF0aW9uSW1wbDxUPilhbm5vdGF0aW9uOw0KLQkJdHJ5DQotCQl7DQotCQkJaWYocmVwbGFjZVByZXZpb3VzUGFpcnMpDQotCQkJew0KLQkJCQlhbm5vdGF0aW9uSW1wbC5zZXRQYXJhbVZhbHVlUGFpcnMocGFyYW1WYWx1ZVBhaXJzKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFpciA6IHBhcmFtVmFsdWVQYWlycykNCi0JCQkJew0KLQkJCQkJYm9vbGVhbiBpc1VwZGF0ZWQgPSBmYWxzZTsNCi0JCQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHRtcFBhcmFtVmFsdWVQYWlycyA9IGFubm90YXRpb25JbXBsLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJCQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgdGhpc1BhaXIgOiB0bXBQYXJhbVZhbHVlUGFpcnMpDQotCQkJCQl7DQotCQkJCQkJaWYodGhpc1BhaXIuZ2V0UGFyYW0oKS5lcXVhbHMocGFpci5nZXRQYXJhbSgpKSkNCi0JCQkJCQl7DQotCQkJCQkJCXRtcFBhcmFtVmFsdWVQYWlycy5yZW1vdmUodGhpc1BhaXIpOw0KLQkJCQkJCQl0bXBQYXJhbVZhbHVlUGFpcnMuYWRkKHBhaXIpOw0KLQkJCQkJCQlpc1VwZGF0ZWQgPSB0cnVlOw0KLQkJCQkJCQlicmVhazsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCQlpZighaXNVcGRhdGVkKQ0KLQkJCQkJew0KLQkJCQkJCXRtcFBhcmFtVmFsdWVQYWlycy5hZGQocGFpcik7DQotCQkJCQl9DQotCQkJCQlhbm5vdGF0aW9uSW1wbC5zZXRQYXJhbVZhbHVlUGFpcnModG1wUGFyYW1WYWx1ZVBhaXJzKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQl1cGRhdGVUaGVBbm5vdGF0aW9uKGphdmFFbGVtZW50LCBhbm5vdGF0aW9uSW1wbCk7DQotCQkJDQotCQkJLy9yZW1vdmUoYW5ub3RhdGlvbik7DQotCQkJLy9zZXRBcHBsaWVkRWxlbWVudChhbm5vdGF0aW9uLCBqYXZhRWxlbWVudCk7DQotCQl9IA0KLQkJY2F0Y2goTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkludmFsaWRUcmVlU3RhdGVNc2csIGUpOw0KLQkJfSANCi0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNhbm5vdFBlcmZvcm1FZGl0TXNnLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ29tcFVuaXRNaXNzaW5nTXNnLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogUmVtb3ZlcyBBbm5vdGF0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb24gLSBBbm5vdGF0aW9uLCB3aGljaCB3aWxsIGJlIHJlbW92ZWQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiANCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gDQotCSAqLw0KLQlwdWJsaWMgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgcmVtb3ZlKGZpbmFsIElBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24pIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXJlbW92ZUFubm90YXRpb24oYW5ub3RhdGlvbiwgYW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHJlbW92ZUFubm90YXRpb24oZmluYWwgSUFubm90YXRpb248VD4gYW5ub3RhdGlvbiwgZmluYWwgVCBqYXZhRWxlbWVudCkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwgPSAoQW5ub3RhdGlvbkltcGw8VD4pYW5ub3RhdGlvbjsNCi0JCXRyeQ0KLQkJew0KLS8vCQkJaWYoYW5ub3RhdGlvbkltcGwuZ2V0QW5ub3RhdGlvblN0cmluZ1ZhbHVlKCkgPT0gbnVsbCB8fCBhbm5vdGF0aW9uSW1wbC5nZXRBbm5vdGF0aW9uU3RyaW5nVmFsdWUoKS50cmltKCkuZXF1YWxzKCIiKSkNCi0vLwkJCXsNCi0vLwkJCQlhbm5vdGF0aW9uSW1wbC5zZXRBbm5vdGF0aW9uU3RyaW5nVmFsdWUoY3JlYXRlQW5ub3RhdGF0aW9uU3RyaW5nVmFsbHVlKGFubm90YXRpb25JbXBsLCBqYXZhRWxlbWVudCkpOw0KLS8vCQkJCUFubm90YXRpb25VdGlscy5nZXRJbnN0YW5jZSgpLnJlbW92ZUFubm90YXRpb24oamF2YUVsZW1lbnQsIGFubm90YXRpb25JbXBsLmdldEFubm90YXRpb25TdHJpbmdWYWx1ZSgpKTsNCi0vLwkJCX0NCi0vLwkJCWVsc2UNCi0vLwkJCXsNCi0JCQkJQW5ub3RhdGlvblV0aWxzLmdldEluc3RhbmNlKCkucmVtb3ZlQW5ub3RhdGlvbihqYXZhRWxlbWVudCwgYW5ub3RhdGlvbkltcGwuZ2V0U2ltcGxlQW5ub3RhdGlvbk5hbWUoKSk7DQotLy8JCQl9DQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBibGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oYmxlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ2Fubm90UGVyZm9ybUVkaXRNc2csIGJsZSk7DQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihmbmZlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ29tcFVuaXRNaXNzaW5nTXNnLCBmbmZlKTsNCi0JCX0JDQotCX0NCi0NCi0JLy8gaTAzNjUwOSBhZGRlZA0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCB1cGRhdGVUaGVBbm5vdGF0aW9uKGZpbmFsIFQgamF2YUVsZW1lbnQsIGZpbmFsIEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQl7CQkNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgaUN1ID0gZ2V0Q3UoamF2YUVsZW1lbnQpOw0KLQkJZmluYWwgQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChpQ3UsIG51bGwpOw0KLQkJDQotCQlCb2R5RGVjbGFyYXRpb24gYmQgPSBudWxsOw0KLQkJQW5ub3RhdGlvbiBmb3VuZCA9IG51bGw7DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKQ0KLQkJew0KLQkJCWJkID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oamF2YUVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSwgdW5pdCk7DQotCQkJZm91bmQgPSBmaW5kQW5ub3RhdGlvbihiZCwgYW5ub3RhdGlvbkltcGwpOw0KLQ0KLQkJCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJCWlmIChmb3VuZCE9bnVsbCkgew0KLQkJCQliZC5tb2RpZmllcnMoKS5yZW1vdmUoZm91bmQpOw0KLQkJCX0NCi0JCQkNCi0JCQlmaW5hbCBFeHByZXNzaW9uIGFubm90ID0gYW5ub3RhdGlvbkltcGwuZ2V0RXhwcmVzc2lvbih1bml0LCB1bml0LmdldEFTVCgpKTsNCi0JCQliZC5tb2RpZmllcnMoKS5hZGQoMCwgYW5ub3QpOw0KLQkJfQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKQ0KLQkJew0KLQkJCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IChUeXBlRGVjbGFyYXRpb24pQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oKChJTWV0aG9kKWphdmFFbGVtZW50KS5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0RWxlbWVudE5hbWUoKSwgdW5pdCk7DQotCQkJYmQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKCgoSU1ldGhvZClqYXZhRWxlbWVudCksIHRkKTsNCi0JCQlmb3VuZCA9IGZpbmRBbm5vdGF0aW9uKGJkLCBhbm5vdGF0aW9uSW1wbCk7DQotCQkNCi0JCQl1bml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCQlpZiAoZm91bmQhPW51bGwpIHsNCi0JCQkJYmQubW9kaWZpZXJzKCkucmVtb3ZlKGZvdW5kKTsNCi0JCQl9DQotCQkJDQotCQkJZmluYWwgRXhwcmVzc2lvbiBhbm5vdCA9IGFubm90YXRpb25JbXBsLmdldEV4cHJlc3Npb24odW5pdCwgdW5pdC5nZXRBU1QoKSk7DQotCQkJYmQubW9kaWZpZXJzKCkuYWRkKDAsIGFubm90KTsNCi0JCX0NCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKQ0KLQkJew0KLQkJCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IChUeXBlRGVjbGFyYXRpb24pQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oKChJRmllbGQpamF2YUVsZW1lbnQpLmdldERlY2xhcmluZ1R5cGUoKS5nZXRFbGVtZW50TmFtZSgpLCB1bml0KTsNCi0JCQliZCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RmllbGREZWNsYXJhdGlvbigoKElGaWVsZClqYXZhRWxlbWVudCksIHRkKTsNCi0JCQlmb3VuZCA9IGZpbmRBbm5vdGF0aW9uKGJkLCBhbm5vdGF0aW9uSW1wbCk7DQotCQkNCi0JCQl1bml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCQlpZiAoZm91bmQhPW51bGwpIHsNCi0JCQkJYmQubW9kaWZpZXJzKCkucmVtb3ZlKGZvdW5kKTsNCi0JCQl9DQotCQkJDQotCQkJZmluYWwgRXhwcmVzc2lvbiBhbm5vdCA9IGFubm90YXRpb25JbXBsLmdldEV4cHJlc3Npb24odW5pdCwgdW5pdC5nZXRBU1QoKSk7DQotCQkJYmQubW9kaWZpZXJzKCkuYWRkKDAsIGFubm90KTsNCi0JCX0NCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpDQotCQl7DQotCQkJaWYoKChJVHlwZVBhcmFtZXRlcilqYXZhRWxlbWVudCkuZ2V0RGVjbGFyaW5nTWVtYmVyKCkgaW5zdGFuY2VvZiBJVHlwZSkNCi0JCQl7DQotCQkJCWJkID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oKChJVHlwZVBhcmFtZXRlcilqYXZhRWxlbWVudCkuZ2V0RGVjbGFyaW5nTWVtYmVyKCkuZ2V0RWxlbWVudE5hbWUoKSwgdW5pdCk7DQotCQkJCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW0gPSBmaW5kUGFyYW1ldGVyKGJkLCBqYXZhRWxlbWVudCk7DQotCQkJCWlmKHBhcmFtICE9IG51bGwpDQotCQkJCXsNCi0JCQkJCWZvdW5kID0gZmluZFBhcmFtQW5ub3RhdGlvbihwYXJhbSwgYW5ub3RhdGlvbkltcGwsIGphdmFFbGVtZW50KTsNCi0JCQkJfQ0KLQ0KLQkJCQl1bml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCQkJaWYgKGZvdW5kIT1udWxsKSB7DQotCQkJCQlwYXJhbS5tb2RpZmllcnMoKS5yZW1vdmUoZm91bmQpOw0KLQkJCQl9DQotCQkJCQ0KLQkJCQlmaW5hbCBFeHByZXNzaW9uIGFubm90ID0gYW5ub3RhdGlvbkltcGwuZ2V0RXhwcmVzc2lvbih1bml0LCB1bml0LmdldEFTVCgpKTsNCi0JCQkJcGFyYW0ubW9kaWZpZXJzKCkuYWRkKDAsIGFubm90KTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJVHlwZURlY2xhcmF0aW9uIHRkID0gKFR5cGVEZWNsYXJhdGlvbilBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbigoKElNZXRob2QpKChJVHlwZVBhcmFtZXRlcilqYXZhRWxlbWVudCkuZ2V0UGFyZW50KCkpLmdldERlY2xhcmluZ1R5cGUoKS4gZ2V0RWxlbWVudE5hbWUoKSwgdW5pdCk7DQotCQkJCWJkID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbigoKElNZXRob2QpKChJVHlwZVBhcmFtZXRlcilqYXZhRWxlbWVudCkuZ2V0UGFyZW50KCkpLCB0ZCk7DQotCQkJCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW0gPSBmaW5kUGFyYW1ldGVyKGJkLCBqYXZhRWxlbWVudCk7DQotCQkJCWlmKHBhcmFtICE9IG51bGwpDQotCQkJCXsNCi0JCQkJCWZvdW5kID0gZmluZFBhcmFtQW5ub3RhdGlvbihwYXJhbSwgYW5ub3RhdGlvbkltcGwsIGphdmFFbGVtZW50KTsNCi0JCQkJfQ0KLQ0KLQkJCQl1bml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCQkJaWYgKGZvdW5kIT1udWxsKSB7DQotCQkJCQlwYXJhbS5tb2RpZmllcnMoKS5yZW1vdmUoZm91bmQpOw0KLQkJCQl9DQotCQkJCQ0KLQkJCQlmaW5hbCBFeHByZXNzaW9uIGFubm90ID0gYW5ub3RhdGlvbkltcGwuZ2V0RXhwcmVzc2lvbih1bml0LCB1bml0LmdldEFTVCgpKTsNCi0JCQkJcGFyYW0ubW9kaWZpZXJzKCkuYWRkKDAsIGFubm90KTsNCi0JCQl9DQotCQl9DQotCQkJCQ0KLQkJc2V0QW5ub3RhdGF0aW9uU3RyaW5nVmFsbHVlKGFubm90YXRpb25JbXBsLCBmYWxzZSwgamF2YUVsZW1lbnQpOw0KLQkJZmluYWwgSURvY3VtZW50IGRvYyA9IEFubm90YXRpb25VdGlscy5nZXRJbnN0YW5jZSgpLmdldERvY3VtZW50KGlDdSk7CQ0KLQkJZmluYWwgVGV4dEVkaXQgZWRpdCA9IHVuaXQucmV3cml0ZShkb2MsIGphdmFFbGVtZW50LmdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9ucyh0cnVlKSk7DQotCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQlJU3RhdHVzIHN0YXR1cyA9IGVkaXRSZXNNYW5hZ2VyKCkuc2V0RmlsZUVkaXRhYmxlKChJRmlsZSkgaUN1LmdldFJlc291cmNlKCkpOw0KLQkJaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSykNCi0JCXsNCi0JCQlmaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoaUN1LCBkb2MuZ2V0KCksIHRydWUsIG51bGwpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKCJBbm5vdGF0dGlvbiBjb3VsZCBub3QgYmUgc3RvcmVkLCB0aGUgZmlsZSBpcyBub3Qgd3JpdGFibGUiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQlKYXhXc1V0aWxNZXNzYWdlcy5Bbm5vdGF0aW9uQ2Fubm90QmVTdG9yZWRNc2cpOyANCi0JCX0NCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgQW5ub3RhdGlvbiBmaW5kQW5ub3RhdGlvbihmaW5hbCBCb2R5RGVjbGFyYXRpb24gdGQsIGZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24pDQotCXsNCi0JCUFubm90YXRpb24gYW5uOw0KLQkJZm9yIChJRXh0ZW5kZWRNb2RpZmllciBtb2RpZmllciA6IChMaXN0PElFeHRlbmRlZE1vZGlmaWVyPil0ZC5tb2RpZmllcnMoKSkgDQotCQl7DQotCQkJaWYoIW1vZGlmaWVyLmlzQW5ub3RhdGlvbigpKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlhbm4gPSAoQW5ub3RhdGlvbiltb2RpZmllcjsNCi0JCQlpZiAoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVuZHNXaXRoKGFubi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgew0KLQkJCQlyZXR1cm4gYW5uOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZmluZFBhcmFtZXRlcihmaW5hbCBCb2R5RGVjbGFyYXRpb24gdGQsIFQgamF2YUVsZW1lbnQpDQotCXsNCi0JCWlmICh0ZCAhPSBudWxsKQ0KLQkJew0KLQkJCWZvciAoT2JqZWN0IHBhcmFtIDogKChNZXRob2REZWNsYXJhdGlvbil0ZCkucGFyYW1ldGVycygpKQ0KLQkJCXsNCi0JCQkJaWYgKHBhcmFtIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiAmJg0KLQkJCQkJCSgoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQpLmdldEVsZW1lbnROYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKXBhcmFtKS5nZXROYW1lKCkudG9TdHJpbmcoKSkpDQotCQkJCXsNCi0JCQkJCXJldHVybiAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbilwYXJhbTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gQW5ub3RhdGlvbiBmaW5kUGFyYW1Bbm5vdGF0aW9uKGZpbmFsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW0sIGZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24sIFQgamF2YUVsZW1lbnQpDQotCXsNCi0JCUFubm90YXRpb24gYW5uOw0KLQkJZm9yIChJRXh0ZW5kZWRNb2RpZmllciBtb2RpZmllciA6IChMaXN0PElFeHRlbmRlZE1vZGlmaWVyPikocGFyYW0ubW9kaWZpZXJzKCkpKSANCi0JCXsNCi0JCQlpZighbW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCWFubiA9IChBbm5vdGF0aW9uKW1vZGlmaWVyOw0KLQkJCWlmIChhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZW5kc1dpdGgoYW5uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKSB7DQotCQkJCXJldHVybiBhbm47DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBnZXRDdShmaW5hbCBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpDQotCXsNCi0JCXN3aXRjaCAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgDQotCQl7DQotCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOg0KLQkJCXJldHVybiAoKElUeXBlKSBqYXZhRWxlbWVudCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRDoNCi0JCQlyZXR1cm4gKChJRmllbGQpIGphdmFFbGVtZW50KS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoNCi0JCQlyZXR1cm4gKChJTWV0aG9kKSBqYXZhRWxlbWVudCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQljYXNlIElKYXZhRWxlbWVudC5UWVBFX1BBUkFNRVRFUjoNCi0JCQlyZXR1cm4gKChJVHlwZVBhcmFtZXRlcikgamF2YUVsZW1lbnQpLmdldERlY2xhcmluZ01lbWJlcigpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBFZGl0UmVzb3VyY2VzTWFuYWdlciBlZGl0UmVzTWFuYWdlcigpDQotCXsNCi0JCXJldHVybiBuZXcgRWRpdFJlc291cmNlc01hbmFnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkOGQ4MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIENvbXBsZXggQW5ub3RhdGlvbiBjb25zaXN0aW5nIG9mIHBhcmFtLXZhbHVlIHBhaXJzLg0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb248VCBleHRlbmRzIElKYXZhRWxlbWVudD4NCi17DQotCS8qKg0KLQkgKiBSZXR1cm4gdGhlIHBhcmFtLXZhbHVlIHBhaXJzIHdoaWNoIHRoaXMgQW5ub3RhdGlvbiBoYXMuDQotCSAqIA0KLQkgKiBAcmV0dXJuIFNldCBvZiBwYXJhbS12YWx1ZXMgcGFpcnMuDQotCSAqLw0KLQlwdWJsaWMgU2V0PElQYXJhbVZhbHVlUGFpcj4gZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciB3aXRoIG5hbWUgcGFyYW0uIA0KLQkgKiBAcGFyYW0gcGFyYW0gLSB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHdobydzIHZhbHVlIGlzIHJlcXVlc3RlZA0KLQkgKiBAcmV0dXJuIC0gdGhlIHZhbHVlIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLiBOdWxsIGlmIHN1Y2ggcGFyYW1ldGVyIGNhbm5vdCBiZSBmb3VuZCBvciBoYXMgYSB2YWx1ZSBvZiBudWxsLg0KLQkgKiBAdGhyb3dzIC0gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgcGFyYW0gaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBwYXJhbSk7DQotCQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIFQsIHRvIHdoaWNoIHRoaXMgYW5ub3RhdHRpb24gaXMgYXNzb2NpYXRlZC4NCi0JICovDQotICAgIHB1YmxpYyBUIGdldEFwcGxpZWRFbGVtZW50KCk7DQotICAgICAgICANCi0gICAgDQotLy9Gcm9tIElBbm5vdGF0dGlvbkJhc2UgICAgDQotCS8qKg0KLQkgKiBAcmV0dXJuIC0gYW5ub3RhdGlvbiBuYW1lDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7DQotCQ0KLQkvKioNCi0JICogR2V0cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBjb2RlLg0KLQkgKiANCi0JICogQHJldHVybiBJTG9jYXRvcg0KLQkgKi8NCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKTsNCi0JDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25CYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZjkwMGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25CYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBCYXNlIGludGVyZmFjZSByZXByZXNlbnRpbmcgQW5ub3RhdGlvbiBhbmQgdGhlIGZ1bmN0aW9uYWxpdHksIHJlcXVpcmVkIGJ5IGl0Lg0KLSAqDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbkJhc2U8VCBleHRlbmRzIElKYXZhRWxlbWVudD4NCi17DQotCS8qKiBzaW1wbGUgYW5ub3RhdGlvbiB0eXBlIElEICovDQotCXB1YmxpYyBmaW5hbCBpbnQgU0lNUExFX0FOTk9UQVRJT04gPSAxOw0KLQ0KLQkvKiogc2luZ2xlIGVsZW1lbnQgYW5ub3RhdGlvbiB0eXBlIElEICovDQotCXB1YmxpYyBmaW5hbCBpbnQgU0lOR0xFX0VMRU1FTlRfQU5OT1RBVElPTiA9IDI7DQotDQotCS8qKiBjb21wbGV4IGFubm90YXRpb24gdHlwZSBJRCAqLw0KLQlwdWJsaWMgZmluYWwgaW50IENPTVBMRVhfQU5OT1RBVElPTiA9IDQ7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIC0gYW5ub3RhdGlvbiBuYW1lDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7DQotDQotCS8qKg0KLQkgKiBHZXR0aW5nIHRoZSBUeXBlSUQgb2YgY3VycmVudCBBbm5vdGF0aW9uDQotCSAqIA0KLQkgKiBAcmV0dXJuIEludGVnZXIgdmFsdWUsIHdoaWNoIHJlcHJlc2VudHMgdGhlIEFubm90YXRpb24gVHlwZUlEDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFR5cGUoKTsNCi0JDQotCS8qKg0KLQkgKiBBZGRzIGN1cnJlbnQgQW5ub3RhdGlvbiB0byBzcGVjaWZpYyBJSmF2YUVsZW1lbnQuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIElNZW1iZXIgYXMgcGFyYW1ldGVyIGJlY2F1c2UgdGhlcmUgaXMgSVR5cGVQYXJhbWV0ZXIgYXMgcGFyYW1ldGVyIHdoZW4gYWRkIHRvIFR5cFBhcmFtZXRlciBpcyBleGVjdXRlZC4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+amF2YUVsZW1lbnQ8L3R0PiBpcyBudWxsLg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPiBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4gU3VwcG9ydGVkIHR5cGVzIGFyZTogSVR5cGUsIElNZXRob2QsIElGaWVsZCwgSVR5cGVQYXJhbWV0ZXIuDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbi4NCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEFwcGxpZWRFbGVtZW50KFQgamF2YUVsZW1lbnQpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZSB0aGUgY3VycmVudCBBbm5vdGF0aW9uIGZyb20gdGhlIGFzc29jaWF0ZWQgSmF2YUVsZW1lbnQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiANCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLQkNCi0JLyoqDQotCSAqIEdldHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4NCi0JICogDQotCSAqIEByZXR1cm4gSUxvY2F0b3INCi0JICovDQotCXB1YmxpYyBJTG9jYXRvciBnZXRMb2NhdG9yKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25JbnNwZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25JbnNwZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzNmMDVmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uSW5zcGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25JbnNwZWN0b3INCi17DQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgYWxsIFR5cGUgbGV2ZWwgQW5ub3RhdGlvbnMgZnJvbSA8Y29kZT50eXBlPC9jb2RlPiwgd2hpY2ggaXMgdXNlZCB0byBpbnN0YW50aWF0ZSB0aGUgSUFubm90YXRpb25JbnNwZWN0b3IuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbnRhaW5lZCBUeXBlIGxldmVsIEFubm90YXRpb25zIGluIDxjb2RlPnR5cGU8L2NvZGU+IG9yIGVtcHR5IENvbGxlY3Rpb24gaWYgbm90IHByZXNlbnQuDQotCSAqDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gaW5zcGVjdFR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIGEgVHlwZSBsZXZlbCBBbm5vdGF0aW9uIHdpdGggc3BlY2lmaWMgUU5hbWUgZnJvbSA8Y29kZT50eXBlPC9jb2RlPiwgd2hpY2ggaXMgdXNlZCB0byBpbnN0YW50aWF0ZSB0aGUgSUFubm90YXRpb25JbnNwZWN0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvblFOYW1lIC0gc3BlY2lmaWVkIFFOYW1lIGZvciB0aGUgQW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEByZXR1cm4gVHlwZSBsZXZlbCBBbm5vdGF0aW9uIGluIDxjb2RlPnR5cGU8L2NvZGU+IG9yIDxjb2RlPm51bGw8L2NvZGU+LCBpZiBzdWNoIEFubm90YXRpb24gZG8gbm90IHByZXNlbnQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gaXMgZW1wdHkgU3RyaW5nLg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JSUFubm90YXRpb248SVR5cGU+IGluc3BlY3RUeXBlKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgYWxsIE1ldGhvZCBsZXZlbCBBbm5vdGF0aW9ucyBmcm9tIDxjb2RlPm1ldGhvZDwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gbWV0aG9kDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbnRhaW5lZCBNZXRob2QgbGV2ZWwgQW5ub3RhdGlvbnMgaW4gPGNvZGU+bWV0aG9kPC9jb2RlPiBvciBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vdCBwcmVzZW50Lg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+bWV0aG9kPC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotICAgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gaW5zcGVjdE1ldGhvZChJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyBhIE1ldGhvZCBsZXZlbCBBbm5vdGF0aW9uIHdpdGggc3BlY2lmaWMgUU5hbWUgZnJvbSA8Y29kZT5tZXRob2Q8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIG1ldGhvZA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvblFOYW1lIC0gc3BlY2lmaWVkIFFOYW1lIGZvciB0aGUgQW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEByZXR1cm4gY29udGFpbmVkIE1ldGhvZCBsZXZlbCBBbm5vdGF0aW9uIGluIDxjb2RlPm1ldGhvZDwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5tZXRob2Q8L3R0PiBvciA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGFyZSA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBpcyBlbXB0eSBTdHJpbmcuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLSAgSUFubm90YXRpb248SU1ldGhvZD4gaW5zcGVjdE1ldGhvZChJTWV0aG9kIG1ldGhvZCwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0NCi0gICAgLyoqDQotCSAqIFJldHJpZXZlcyBhbGwgRmllbGQgbGV2ZWwgQW5ub3RhdGlvbnMgZnJvbSA8Y29kZT5maWVsZDwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gZmllbGQNCi0JICogDQotCSAqIEByZXR1cm4gY29udGFpbmVkIEZpbGVkIGxldmVsIEFubm90YXRpb25zIGluIDxjb2RlPmZpZWxkPC9jb2RlPiBvciBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vdCBwcmVzZW50Lg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5maWVsZDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLSAgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJRmllbGQ+PiBpbnNwZWN0RmllbGQoSUZpZWxkIGZpZWxkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLSAgIA0KLSAgICAvKioNCi0JICogUmV0cmlldmVzIGEgRmllbGQgbGV2ZWwgQW5ub3RhdGlvbiB3aXRoIHNwZWNpZmljIFFOYW1lIGZyb20gPGNvZGU+ZmllbGQ8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIGZpZWxkDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uUU5hbWUgLSBzcGVjaWZpZWQgUU5hbWUgZm9yIHRoZSBBbm5vdGF0aW9uLg0KLQkgKiANCi0JICogQHJldHVybiBjb250YWluZWQgRmlsZWQgbGV2ZWwgQW5ub3RhdGlvbnMgaW4gPGNvZGU+ZmllbGQ8L2NvZGU+IG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5maWVsZDwvY29kZT4gb3IgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBhcmUgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gaXMgZW1wdHkgU3RyaW5nLg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0gIElBbm5vdGF0aW9uPElGaWVsZD4gaW5zcGVjdEZpZWxkKElGaWVsZCBmaWVsZCwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0NCi0gICAgLyoqDQotCSAqIFJldHJpZXZlcyBhbGwgVHlwZVBhcmFtZXRlciBsZXZlbCBBbm5vdGF0aW9ucyBmcm9tIDxjb2RlPnBhcmFtPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBwYXJhbQ0KLQkgKiANCi0JICogQHJldHVybiBjb250YWluZWQgVHlwZVBhcmFtZXRlciBsZXZlbCBBbm5vdGF0aW9ucyBpbiA8Y29kZT5wYXJhbTwvY29kZT4gb3IgZW1wdHkgQ29sbGVjdGlvbiBpZiBub3QgcHJlc2VudC4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+cGFyYW08L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0gIENvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBpbnNwZWN0UGFyYW0oSVR5cGVQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotICAgDQotICAgIC8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBUeXBlUGFyYW1ldGVyIGxldmVsIEFubm90YXRpb24gd2l0aCBzcGVjaWZpYyBRTmFtZSBmcm9tIDxjb2RlPnBhcmFtPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBwYXJhbQ0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvblFOYW1lIC0gc3BlY2lmaWVkIFFOYW1lIGZvciB0aGUgQW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEByZXR1cm4gY29udGFpbmVkIFR5cGVQYXJhbWV0ZXIgbGV2ZWwgQW5ub3RhdGlvbnMgaW4gPGNvZGU+cGFyYW08L2NvZGU+IG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5wYXJhbTwvY29kZT4gb3IgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBhcmUgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gaXMgZW1wdHkgU3RyaW5nLg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0gIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBpbnNwZWN0UGFyYW0oSVR5cGVQYXJhbWV0ZXIgcGFyYW0sIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotICAgDQotICAgDQotICAgDQotCQ0KLS8vCS8qKg0KLS8vCSAqIFJldHJpZXZlcyBhbGwgYW5ub3RhdGlvbnMgZnJvbSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4uDQotLy8JICogDQotLy8JICogQHBhcmFtIGphdmFFbGVtZW50DQotLy8JICogDQotLy8JICogQHJldHVybiBjb250YWluZWQgYW5ub3RhdGlvbnMgaW4gPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IG9yIGVtcHR5IENvbGxlYWN0aW9uIGlmIG5vdCBwcmVzZW50Lg0KLS8vCSAqIA0KLS8vCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0PmphdmFFbGVtZW50PC90dD4gaXMgbnVsbC4NCi0vLwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPiBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4gU3VwcG9ydGVkIHR5cGVzIGFyZTogSXR5cGUsIElNZXRob2QsIElGaWVsZC4NCi0vLwkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLS8vCSAqLw0KLS8vCXB1YmxpYyBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPiBpbnNwZWN0KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvblByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI5MGJjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5BdHRyaWJ1dGVUeXBlRW51bTsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uUHJvcGVydHkNCi17DQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKTsNCi0NCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCk7DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCk7DQotCQ0KLQlwdWJsaWMgQXR0cmlidXRlVHlwZUVudW0gZ2V0QXR0cmlidXRlVHlwZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzY2M3Njk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25Qcm9wZXJ0eTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgZm9yIGFubm90YXRpb25zIGNvbnRhaW5lci4NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcg0KLXsNCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvblByb3BlcnR5KGZpbmFsIEFubm90YXRpb25Qcm9wZXJ0eSBhbm5vdGF0aW9uUHJvcGVydHksIGZpbmFsIEVsZW1lbnRUeXBlIHRhcmdldCk7DQotCQ0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoSVR5cGVQYXJhbWV0ZXIgdFBhcmFtKTsNCi0NCi0JcHVibGljIFNldDxJQW5ub3RhdGlvbjxJVHlwZT4+IGdldFR5cGVBbm5vdGF0aW9ucyhJVHlwZSB0eXBlKTsNCi0NCi0JcHVibGljIFNldDxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gZ2V0TWV0aG9kQW5ub3RhdGlvbnMoSU1ldGhvZCBtZXRob2QpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lMb2NhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0NzYzNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotLyoqDQotICogQ2xhc3MgdGhhdCBob2xkcyBpbmZvcm1hdGlvbiB0byBsb2NhdGUgc3BlY2lmaWMgcmVnaW9uIGluIHRoZSBzb3VyY2UgY29kZSANCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUxvY2F0b3INCi17DQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBsaW5lIG51bWJlciBpbiB0aGUgc291cmNlIHdoZXJlIHRoZSByZWdpb24gcG9pbnRlZCBieSB0aGlzIGxvY2F0b3Igc3RhcnRzICANCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpOw0KLQkNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhpcyByZWdpb24gaW4gc291cmNlIGNvZGUNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRQb3NpdGlvbigpOw0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lQYXJhbVZhbHVlUGFpci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JUGFyYW1WYWx1ZVBhaXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmZlNmU1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lQYXJhbVZhbHVlUGFpci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotLyoqDQotICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBwYXJhbSB2YWx1ZSBwYWlyIGluIGFubm90YXRpb24uIFBhcmFtIHZhbHVlIHBhaXIgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybTogcGFyYW09dmFsdWUNCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElQYXJhbVZhbHVlUGFpcg0KLXsNCi0JLyoqDQotCSAqIEByZXR1cm4gcGFyYW0gbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbSgpOw0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgdmFsdWUNCi0JICovDQotCXB1YmxpYyBJVmFsdWUgZ2V0VmFsdWUoKTsNCi0JDQotCS8qKg0KLQkgKiBHZXRzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBsb2NhdGlvbiBpbiB0aGUgc291cmNlIGNvZGUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIElMb2NhdG9yDQotCSAqLw0KLQlwdWJsaWMgSUxvY2F0b3IgZ2V0TG9jYXRvcigpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzJjNGE0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotLyoqDQotICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBhcnRpZmFjdCB2YWx1ZSBpbiBhbm5vdGF0aW9uLg0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbHVlDQotew0KLQkvKioNCi0JICogT2J0YWlucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmFsdWUuIFRoZSBvYnRhaW5lZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gY2FuIGxhdGVyIG9uIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUNCi0JICogYW4gaW5zdGFuY2Ugb2YgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBjb25zaWRlZGVyZWQgZXF1YWwgdG8gdGhlIHJldHVybmVkIHZhbHVlLg0KLQkgKiA8cD4NCi0JICogCTxjPkBBbm5vdGF0aW9uRXhhbXBsZSgxKTwvYz4gLy9hbm5vYXRpb24gd2l0aCBvbmUgYXR0cmlidXRlL3BhcmFtZXRlciBjYWxsZWQgInZhbHVlIiB3aXRoIHZhbHVlIG9mICIxIi4gDQotCSAqIDwvcD4NCi0JICogVGhlIHRvU3RyaW5nIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc3RyaW5nICIxIiwgd2hpY2ggY2FuIGxhdGVyIG9uIGJlIHVzZWQgYnkgSW50ZWdlci5wYXJzZShTdHJpbmcpIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBJbnRlZ2VyDQotCSAqIGVxdWFsIHRvIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgaW50ZWdlciBsaXRlcmFsIDENCi0JICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmFsdWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKTsNCi0JDQotCS8qKg0KLQkgKiBHZXRzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBsb2NhdGlvbiBpbiB0aGUgc291cmNlIGNvZGUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIElMb2NhdG9yDQotCSAqLw0KLQlwdWJsaWMgSUxvY2F0b3IgZ2V0TG9jYXRvcigpOw0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9jbGF6ei9BU1RVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9jbGF6ei9BU1RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMTk5N2VkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvY2xhenovQVNUVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6ejsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUUGFyc2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLkZpbGVVdGlsczsNCi0NCi0vKioNCi0gKiBVdGlsaXR5IGNsYXNzIHRoYXQgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgZm9yIHtAbGluayBBU1R9IHByb2Nlc3NpbmcuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBU1RVdGlscyANCi17DQotCXByaXZhdGUgc3RhdGljIEFTVFV0aWxzIGluc3RhbmNlOw0KLQkNCi0JcHJpdmF0ZSBBU1RVdGlscygpIHsNCi0JCS8vIGRpc2FibGUgY29uc3RydWN0aW9uDQotCX0NCi0JDQotCS8qKg0KLQkgKiBAcmV0dXJuIGNyZWF0ZSBuZXcgaW5zdGFuY2UgZm9yIHRoaXMgdXRpbGl0eQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBBU1RVdGlscyBnZXRJbnN0YW5jZSgpIHsNCi0JCWlmKGluc3RhbmNlPT1udWxsKSB7DQotCQkJaW5zdGFuY2UgPSBuZXcgQVNUVXRpbHMoKTsgDQotCQl9DQotCQlyZXR1cm4gaW5zdGFuY2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIEFTVCB0cmVlIG91dCBvZiB7QGxpbmsgRmlsZX0gaW5zdGFuY2UuDQotCSAqIEBwYXJhbSBzb3VyY2VGaWxlIGphdmEgY2xhc3MgZmlsZSAgDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3INCi0JICogQHJldHVybiBjcmVhdGVkIHtAbGluayBBU1ROb2RlfQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgQVNUTm9kZSBjcmVhdGVBU1QoZmluYWwgRmlsZSBzb3VyY2VGaWxlLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oc291cmNlRmlsZSwgInNvdXJjZUZpbGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJDQotCQlmaW5hbCBBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7DQotCQlwYXJzZXIuc2V0U291cmNlKEZpbGVVdGlscy5nZXRJbnN0YW5jZSgpLmdldEZpbGVDb250ZW50KHNvdXJjZUZpbGUpLnRvQ2hhckFycmF5KCkpOw0KLQkJcmV0dXJuIHBhcnNlci5jcmVhdGVBU1QobW9uaXRvcik7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIEFTVH0gdHJlZSBvdXQgb2Yge0BsaW5rIElUeXBlfSBpbnN0YW5jZS4NCi0JICogQHBhcmFtIHNvdXJjZVR5cGUgamF2YSBjbGFzcw0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yDQotCSAqIEByZXR1cm4gY3JlYXRlZCB7QGxpbmsgQVNUTm9kZX0gaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KGZpbmFsIElDb21waWxhdGlvblVuaXQgc291cmNlQ3UsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oc291cmNlQ3UsICJzb3VyY2VDdSIpOyAvLyROT04tTkxTLTEkDQotCQlmaW5hbCBBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7DQotCQlwYXJzZXIuc2V0U291cmNlKHNvdXJjZUN1KTsNCi0JCXBhcnNlci5zZXRCaW5kaW5nc1JlY292ZXJ5KGZhbHNlKTsNCi0JCXJldHVybiAoQ29tcGlsYXRpb25Vbml0KXBhcnNlci5jcmVhdGVBU1QobW9uaXRvcik7DQotCX0JCQ0KLQkNCi0JLyoqDQotCSAqIEZpbmRzIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBpbiB7QGxpbmsgVHlwZURlY2xhcmF0aW9ufSB3aXRoIG5hbWUgPGNvZGU+ZmllbGRUeXBlLmdldEVsZW1lbnROYW1lKCk8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIGZpZWxkVHlwZQ0KLQkgKiBAcGFyYW0gdHlwZURlY2xhcmF0aW9uDQotCSAqIEByZXR1cm4gZm91bmQgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBnZXRGaWVsZERlY2xhcmF0aW9uKGZpbmFsIElGaWVsZCBmaWVsZFR5cGUsIGZpbmFsIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pDQotCXsNCi0JCWZvciAoRmllbGREZWNsYXJhdGlvbiBmZCA6IHR5cGVEZWNsYXJhdGlvbi5nZXRGaWVsZHMoKSkNCi0JCXsNCi0JCQlmb3IgKE9iamVjdCBmciA6IGZkLmZyYWdtZW50cygpKQ0KLQkJCXsNCi0JCQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZkZiA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyOw0KLQkJCQlpZiAodmRmLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoZmllbGRUeXBlLmdldEVsZW1lbnROYW1lKCkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gZmQ7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgYm9vbGVhbiBjb21wYXJlTWV0aG9kUGFyYW1zKGZpbmFsIElNZXRob2QgbWV0aG9kVHlwZSwgZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbWQpDQotCXsNCi0JCUxpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gbGlzdCA9IG1kLnBhcmFtZXRlcnMoKTsNCi0JCWlmIChsaXN0LnNpemUoKSA9PSBtZXRob2RUeXBlLmdldE51bWJlck9mUGFyYW1ldGVycygpKQ0KLQkJew0KLQkJCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gbWV0aG9kVHlwZS5nZXRQYXJhbWV0ZXJUeXBlcygpOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykNCi0JCQl7DQotCQkJCWlmICghaXNTYW1lUGFyYW0ocGFyYW1ldGVyVHlwZXNbaV0sIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBsaXN0LmdldChpKSkpDQotCQkJCXsNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGlzU2FtZVBhcmFtKGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHN2RGVjbCkNCi0Jew0KLQkJcmV0dXJuIHR5cGUuZXF1YWxzKGdldFR5cGVTaWduYXR1cmUoc3ZEZWNsKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgdHlwZSBzaWduYXR1cmUgZnJvbSB7QGxpbmsgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbn0uIEFzIHtAbGluayBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9ufSByZXR1cm5zIG9ubHkgdGhlIGNsZWFuIHR5cGUgaW4gY2FzZQ0KLQkgKiBkZWNsYXJhdGlvbiBvZiB0eXBlIDx0dD5pbnQgcGFyYUFycltdW108L3R0PiBpcyBpbiBjb2RlIHRoZSBtZXRob2QgYWRkcyBhcnJheSBpZGVudGlmaWVycyBmb3IgdHlwZSBkZWNsYXJhdGlvbiBpbnQgdGhpcyBjYXNlLg0KLQkgKiANCi0JICogQHBhcmFtIHN2RGVjbA0KLQkgKiBAcmV0dXJuIHRoZSBzaWduYXR5cmUgZm9yIHRoZSB0eXBlDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoZmluYWwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzdkRlY2wpDQotCXsNCi0JCVN0cmluZyB0eXBlTmFtZSA9IGNyZWF0ZURpbWVuc2lvbmVkVHlwZU5hbWUoU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoc3ZEZWNsLmdldFR5cGUoKS50b1N0cmluZygpLCBmYWxzZSksIHN2RGVjbC5nZXRFeHRyYURpbWVuc2lvbnMoKSk7DQotDQotCQkvLyBWYXJhcmdzIGFwcGVuZCBhbm90aGVyIGRpbWVuc2lvbg0KLQkJaWYgKHN2RGVjbC5pc1ZhcmFyZ3MoKSkNCi0JCXsNCi0JCQl0eXBlTmFtZSA9IFNpZ25hdHVyZS5DX0FSUkFZICsgdHlwZU5hbWU7DQotCQl9DQotDQotCQlyZXR1cm4gdHlwZU5hbWU7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZURpbWVuc2lvbmVkVHlwZU5hbWUoZmluYWwgU3RyaW5nIHR5cGVOYW1lLCBmaW5hbCBpbnQgZGltZW5zaW9ucykNCi0Jew0KLQkJZmluYWwgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcih0eXBlTmFtZSk7DQotCQlmaW5hbCBTdHJpbmcgZGltZW5zaW9uU3RyaW5nID0gY3JlYXRlRGltZW5zaW9uU3RyaW5nKGRpbWVuc2lvbnMpOw0KLQkJd2hpbGUoIXJlc3VsdC50b1N0cmluZygpLnN0YXJ0c1dpdGgoZGltZW5zaW9uU3RyaW5nKSkNCi0JCXsNCi0JCQlyZXN1bHQuaW5zZXJ0KDAsIFNpZ25hdHVyZS5DX0FSUkFZKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVEaW1lbnNpb25TdHJpbmcoZmluYWwgaW50IGRpbWVuc2lvbnMpDQotCXsNCi0JCWZpbmFsIGNoYXJbXSBkaW1lbnNpb25DaGFycyA9IG5ldyBjaGFyW2RpbWVuc2lvbnNdOw0KLQkJQXJyYXlzLmZpbGwoZGltZW5zaW9uQ2hhcnMsIFNpZ25hdHVyZS5DX0FSUkFZKTsNCi0JCXJldHVybiBuZXcgU3RyaW5nKGRpbWVuc2lvbkNoYXJzKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEZpbmRzIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn0gaW4ge0BsaW5rIFR5cGVEZWNsYXJhdGlvbn0gaGF2aW5nIG5hbWUgPGNvZGU+bWV0aG9kVHlwZS5nZXRFbGVtZW50TmFtZSgpPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBtZXRob2RUeXBlDQotCSAqIEBwYXJhbSB0eXBlRGVjbGFyYXRpb24NCi0JICogQHJldHVybiBmb3VuZCBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyAgTWV0aG9kRGVjbGFyYXRpb24gZ2V0TWV0aG9kRGVjbGFyYXRpb24oZmluYWwgSU1ldGhvZCBtZXRob2RUeXBlLCBmaW5hbCBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKQ0KLQl7DQotCQlmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1kIDogdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKSkNCi0JCXsNCi0JCQlpZiAobWQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhtZXRob2RUeXBlLmdldEVsZW1lbnROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJaWYgKGNvbXBhcmVNZXRob2RQYXJhbXMobWV0aG9kVHlwZSwgbWQpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gbWQ7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHJpZXZlcyB7QGxpbmsgVHlwZURlY2xhcmF0aW9ufSBmcm9tIHtAbGluayBDb21waWxhdGlvblVuaXR9IHdpdGggbmFtZSA8dHQ+Y2xhc3NOYW1lPC90dD4NCi0JICogDQotCSAqIEBwYXJhbSBjbGFzc05hbWUNCi0JICogQHBhcmFtIHVuaXQNCi0JICogQHJldHVybiBmb3VuZCB7QGxpbmsgVHlwZURlY2xhcmF0aW9ufSBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgQ29tcGlsYXRpb25Vbml0IHVuaXQpDQotCXsNCi0JCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IG51bGw7DQotCQkvLyBsb29raW5nIHVwIHRoZSBzZWxlY3RlZCB0eXBlDQotCQlmb3IgKE9iamVjdCB0eXBlT2JqZWN0IDogdW5pdC50eXBlcygpKQ0KLQkJew0KLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHRtcFR5cGVEZWNsYXJhdGlvbiA9IChBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbikgdHlwZU9iamVjdDsNCi0JCQlpZiAodG1wVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkNCi0JCQl7DQotCQkJCXR5cGVEZWNsYXJhdGlvbiA9IHRtcFR5cGVEZWNsYXJhdGlvbjsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpDQotCQl7DQotCQkJTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gbGlzdCA9IHVuaXQudHlwZXMoKTsNCi0JCQl0eXBlRGVjbGFyYXRpb24gPSBnZXRJbm5lckNsYXNzKGxpc3QudG9BcnJheShuZXcgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb25bbGlzdC5zaXplKCldKSwgY2xhc3NOYW1lKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRJbm5lckNsYXNzKGZpbmFsIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uW10gdHlwZXMsIGZpbmFsIFN0cmluZyBjbGFzc05hbWUpDQotCXsNCi0JCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7DQotCQlmb3IgKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZSA6IHR5cGVzKQ0KLQkJew0KLQkJCWlmIChhYnN0cmFjdFR5cGUuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7DQotCQkJCXJldHVybiBhYnN0cmFjdFR5cGU7DQotCQkJfQ0KLQ0KLQkJCWlmICghKGFic3RyYWN0VHlwZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikpIHsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCXJlc3VsdCA9IGdldElubmVyQ2xhc3MoKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uW10pICgoVHlwZURlY2xhcmF0aW9uKSBhYnN0cmFjdFR5cGUpLmdldFR5cGVzKCksIGNsYXNzTmFtZSk7DQotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZG9tL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlYTdiNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5kb20udmFsaWRhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgRG9tVmFsaWRhdGlvbkNvbnN0YW50cyANCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLldzVmFsaWRhdG9yTWFya2VyIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT04gPSAiaW1wbGVtZW50YXRpb24iOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19DT05TVFJBSU5UX0lEID0gIndlYlNlcnZpY2VDb25zdHJhaW50IjsgLy8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUF9DT05TVFJBSU5UX0lEID0gIndlYlBhcmFtQ29uc3RyYWludCI7IC8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01fQ09OU1RSQUlOVF9JRCA9ICJ3ZWJNZXRob2RDb25zdHJhaW50IjsgLy8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUlfQ09OU1RSQUlOVF9JRCA9ICJzZWlDb25zdHJhaW50IjsgLy8kTk9OLU5MUy0xJA0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2V4Y2VwdGlvbi9Mb2NhbGl6ZWRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL0xvY2FsaXplZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxY2UwODQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL0xvY2FsaXplZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLQ0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgYmFzZSBjbGFzcyBmb3IgYWxsIENIRUNLRUQgZXhjZXB0aW9ucyBmb3IgdGhlIFdTIFRvb2xzDQotICogdG9vbHNldC4gVGhpcyBleGNlcHRpb24gY29ycmVjdGx5IG92ZXJyaWRlcyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkNCi0gKiBvZiBFeGNlcHRpb24gY2xhc3MgYW5kIHByb3ZpZGUgcHJvcGVyIGxvY2FsaXplZCBtZXNzYWdlLg0KLSAqIFRvIGFjaGlldmUgdGhhdCB0aGVyZSBpcyBhIGxpbWl0YXRpb24gLSBpdCB3aWxsIGJlIGltcG9zc2libGUgdG8gcmV0dXJuIGxvY2FsaXplZA0KLSAqIG1lc3NhZ2UgaWYgaXQgaGF2ZW4ndCBiZWVuIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igb2YgZXhjZXB0aW9uLCBzbyB0aGVyZSBpcyBubw0KLSAqIGNvbnN0cnVjdG9yIHdpdGhvdXQgbG9jYWxpemVkIG1lc3NhZ2UuDQotICogDQotICogQGF1dGhvciBNbGFkZW4gVG9tb3YNCi0gKiovDQotDQotcHVibGljIGNsYXNzIExvY2FsaXplZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZTsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RzIGV4Y2VwdGlvbiB3aXRoIGFiaWxpdHkgdG8gcHJvdmlkZSBsb2NhbGl6ZWQgbWVzc2FnZQ0KLQkgKiBAcGFyYW0gbWVzc2FnZSAtIHRoZSBkZXRhaWwgbWVzc2FnZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbA0KLSAgICAgKiAgICAgICAgIGJ5IHRoZSB7QGxpbmsgI2dldE1lc3NhZ2UoKX0gbWV0aG9kKQ0KLQkgKiBAcGFyYW0gbG9jYWxpemVkTWVzc2FnZSAtIHRoZSBsb2NhbGl6ZWQgbWVzc2FnZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbA0KLSAgICAgKiAgICAgICAgIGJ5IHRoZSB7QGxpbmsgI2dldExvY2FsaXplZE1lc3NhZ2UoKX0gbWV0aG9kKQ0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgLSBpbiBjYXNlIGxvY2FsaXplZCBtZXNzYWdlIGlzIG51bGwNCi0JICogKi8NCi0JcHVibGljIExvY2FsaXplZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UpIHsNCi0JCXN1cGVyKG1lc3NhZ2UpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGxvY2FsaXplZE1lc3NhZ2UsICJsb2NhbGl6ZWRNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQNCi0JCXRoaXMubG9jYWxpemVkTWVzc2FnZSA9IGxvY2FsaXplZE1lc3NhZ2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgZXhjZXB0aW9uIHdpdGggYWJpbGl0eSB0byBwcm92aWRlIGxvY2FsaXplZCBtZXNzYWdlDQotCSAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIGRldGFpbCBtZXNzYWdlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsDQotICAgICAqICAgICAgICAgYnkgdGhlIHtAbGluayAjZ2V0TWVzc2FnZSgpfSBtZXRob2QpDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlIC0gdGhlIGxvY2FsaXplZCBtZXNzYWdlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsDQotICAgICAqICAgICAgICAgYnkgdGhlIHtAbGluayAjZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSBtZXRob2QpDQotCSAqIEBwYXJhbSBjYXVzZSAtICBjYXVzZSB0aGUgY2F1c2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwgYnkgdGhlDQotICAgICAqICAgICAgICAge0BsaW5rICNnZXRDYXVzZSgpfSBtZXRob2QpLg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgLSBpbiBjYXNlIGxvY2FsaXplZCBtZXNzYWdlIGlzIG51bGwNCi0JICogKi8NCi0JDQotCXB1YmxpYyBMb2NhbGl6ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShsb2NhbGl6ZWRNZXNzYWdlLCAibG9jYWxpemVkTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkDQotCQl0aGlzLmxvY2FsaXplZE1lc3NhZ2UgPSBsb2NhbGl6ZWRNZXNzYWdlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyBsb2NhbGl6ZWQgbWVzc2FnZSB3aXRoIHdoaWNoIHRoZSBleGNlcHRpb24gd2FzIGNvbnN0cnVjdGVkLiovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7DQotCQlyZXR1cm4gbG9jYWxpemVkTWVzc2FnZTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2V4Y2VwdGlvbi9NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTIxMjk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEluZGljYXRlcyB0aGF0IGEgcmVzb3VyY2Ugb2YgYW55IGtpbmQgY291bGRuJ3QgYmUgZm91bmQgYnV0IHRoaXMgd2FzIGV4cGVjdGVkLg0KLSAqIA0KLSAqIEBhdXRob3IgSm9lcmcgRGVobWVsDQotICovDQotcHVibGljIGNsYXNzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleHRlbmRzIExvY2FsaXplZEV4Y2VwdGlvbg0KLXsNCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIHdpdGggYSBtZXNzYWdlIGFuZCBhIGxvY2FsaXplZCBtZXNzYWdlLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBlcnJvciBtZXNzYWdlDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlDQotCSAqICAgICAgICAgICAgbG9jYWxpemVkIG1lc3NhZ2UNCi0JICovDQotCXB1YmxpYyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlKQ0KLQl7DQotCQlzdXBlcihtZXNzYWdlLCBsb2NhbGl6ZWRNZXNzYWdlKTsJCQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIHdpdGggbWVzc2FnZSwgbG9jYWxpemVkIG1lc3NhZ2UgYW5kIGNhdXNpbmcgZXhjZXB0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBlcnJvciBtZXNzYWdlDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlDQotCSAqICAgICAgICAgICAgbG9jYWxpemVkIG1lc3NhZ2UNCi0JICogQHBhcmFtIGNhdXNlDQotCSAqICAgICAgICAgICAgY2F1c2luZyBleGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCXN1cGVyKG1lc3NhZ2UsIGxvY2FsaXplZE1lc3NhZ2UsIGNhdXNlKTsJCQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZmFjZXRzL0ZhY2V0VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZmFjZXRzL0ZhY2V0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTg4ZGE3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ZhY2V0cy9GYWNldFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBGYWNldFV0aWxzIGltcGxlbWVudHMgSUZhY2V0VXRpbHMNCi17DQotCS8qKg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGlmIDxjPnByb2plY3Q8L2M+IG9yIDxjPmZhY2V0SWRzPC9jPiBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlGYWNldChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcuLi4gZmFjZXRJZHMpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShwcm9qZWN0KTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmYWNldElkcyk7DQotDQotCQlpZiAoIWlzRmFjZXRlZFByb2plY3QocHJvamVjdCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gZ2V0RmFjZXRlZFByb2plY3QocHJvamVjdCk7DQotCQlmb3IgKFN0cmluZyBmYWNldElkIDogZmFjZXRJZHMpDQotCQl7DQotCQkJZmluYWwgSVByb2plY3RGYWNldCBmYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChmYWNldElkKTsNCi0JCQlpZiAoZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGZhY2V0KSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGYWNldFdpdGhWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldElkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gaGFzRmFjZXRXaXRoVmVyc2lvbihwcm9qZWN0LCBmYWNldFZlcnNpb24sIGZhY2V0SWQsIHRydWUpOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGlzRmFjZXRlZFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJU2V0PElGYWNldGVkUHJvamVjdD4gZmFjZXRlZFByb2plY3RzID0gZ2V0QWxsV29ya3NwYWNlRmFjZXRlZFByb2plY3RzKCk7DQotCQlmaW5hbCBJdGVyYXRvcjxJRmFjZXRlZFByb2plY3Q+IGkgPSBmYWNldGVkUHJvamVjdHMuaXRlcmF0b3IoKTsNCi0JCXdoaWxlIChpLmhhc05leHQoKSkNCi0JCXsNCi0JCQlmaW5hbCBJRmFjZXRlZFByb2plY3QgZnAgPSAoSUZhY2V0ZWRQcm9qZWN0KSBpLm5leHQoKTsNCi0JCQlpZiAocHJvamVjdC5lcXVhbHMoZnAuZ2V0UHJvamVjdCgpKSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGYWNldFdpdGhWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldElkLCBib29sZWFuIGFjY2VwdEhpZ2hlckZhY2V0VmVyc2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHByb2plY3QpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZhY2V0VmVyc2lvbik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZmFjZXRJZCk7DQotDQotCQlpZiAoIWlzRmFjZXRlZFByb2plY3QocHJvamVjdCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBhbGxGYWNldHNWZXJzaW9ucyA9IGdldFByb2plY3RGYWNldHMocHJvamVjdCk7DQotCQlmb3IgKElQcm9qZWN0RmFjZXRWZXJzaW9uIHZlciA6IGFsbEZhY2V0c1ZlcnNpb25zKQ0KLQkJew0KLQkJCWlmICh2ZXIuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKS5lcXVhbHMoZmFjZXRJZCkpDQotCQkJew0KLQkJCQlyZXR1cm4gaXNGYWNldEFjY2VwdGFibGUodmVyLCBmYWNldFZlcnNpb24sIGFjY2VwdEhpZ2hlckZhY2V0VmVyc2lvbik7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBpc0ZhY2V0QWNjZXB0YWJsZShJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldFZlcnNpb25JZCwgYm9vbGVhbiBhY2NlcHRIaWdoZXJGYWNldFZlcnNpb24pDQotCQkJCQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IGZhY2V0VmVyc2lvbiAhPSBudWxsOw0KLQ0KLQkJLy8gQ2hlY2sgZm9yIGV4YWN0IHZlcnNpb24NCi0JCWlmICghYWNjZXB0SGlnaGVyRmFjZXRWZXJzaW9uKQ0KLQkJew0KLQkJCXJldHVybiBmYWNldFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpLmVxdWFscyhmYWNldFZlcnNpb25JZCk7DQotCQl9DQotDQotCQlDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvciA9IGZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRWZXJzaW9uQ29tcGFyYXRvcigpOw0KLQkJU3RyaW5nIGN1cnJlbnRGYWNldFZlcnNpb24gPSBmYWNldFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpOw0KLQkJcmV0dXJuIGNvbXBhcmF0b3IuY29tcGFyZShjdXJyZW50RmFjZXRWZXJzaW9uLCBmYWNldFZlcnNpb25JZCkgPj0gMDsNCi0JfQ0KLQ0KLQlwcml2YXRlIElGYWNldGVkUHJvamVjdCBnZXRGYWNldGVkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOw0KLQl9DQotDQotCXByaXZhdGUgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWFzc2VydCBpc0ZhY2V0ZWRQcm9qZWN0KHByb2plY3QpOw0KLQ0KLQkJcmV0dXJuIGdldEZhY2V0ZWRQcm9qZWN0KHByb2plY3QpLmdldFByb2plY3RGYWNldHMoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFNldDxJRmFjZXRlZFByb2plY3Q+IGdldEFsbFdvcmtzcGFjZUZhY2V0ZWRQcm9qZWN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRGYWNldGVkUHJvamVjdHMoKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ZhY2V0cy9JRmFjZXRVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9mYWNldHMvSUZhY2V0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODcyNzc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ZhY2V0cy9JRmFjZXRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotCQ0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhY2V0VXRpbHMNCi17DQotCS8qKg0KLQkgKiBDb25zdGFudCBmb3IgRUpCMzAgZmFjZXQgSUQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl8zMF9GQUNFVF9JRCA9ICJqc3QuZWpiIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIENvbnN0YW50IGZvciBFSkIzMCBmYWNldCB2ZXJzaW9uIDMuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCXzMwX0ZBQ0VUX1ZFUlNJT04gPSAiMy4wIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIENvbnN0YW50IGZvciBXZWIgMi41IGZhY2V0IElEDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfMjVfRkFDRVRfSUQgPSAianN0LndlYiI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCS8qKg0KLQkgKiBDb25zdGFudCBmb3IgV2ViIGZhY2V0IHZlcnNpb24gMi41DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfMjVfRkFDRVRfVkVSU0lPTiA9ICIyLjUiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDb25zdGFudCBmb3IgQXBwbGljYXRpb24gY2xpZW50IGZhY2V0IElEDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfMjVfRkFDRVRfSUQgPSAianN0LmFwcGNsaWVudCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIENvbnN0YW50IGZvciBBcHBsaWNhdGlvbiBjbGllbnQgZmFjZXQgdmVyc2lvbiAyLjUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF8yNV9GQUNFVF9WRVJTSU9OCT0gIjUuMCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIENoZWNrcyB3aGV0aGVyIDxjb2RlPnByb2plY3Q8L2NvZGU+IGhhcyBhIGZhY2V0IHdpdGggaWQgPGNvZGU+ZmFjZXRJZDwvY29kZT4gd2l0aCB2ZXJzaW9uIDxjb2RlPmZhY2V0VmVyc2lvbjwvY29kZT4NCi0JICogSW4gY2FzZSB0aGUgcHJvamVjdCBzcGVjaWZpZWQgaXMgbm90IGEgZmFjZXRlZCBwcm9qZWN0LCBmYWxzZSBpcyByZXR1cm5lZCANCi0JICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGlzIGVxdWl2YWxlbnQgdG8gaW52b2tpbmcgaGFzRmFjZXRXaXRoVmVyc2lvbihwcm9qZWN0LCBmYWNldFZlcnNpb24sIGZhY2V0SWQsIGZhbHNlKQ0KLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdA0KLQkgKiBAcGFyYW0gZmFjZXRWZXJzaW9uIHRoZSBmYWNldCB2ZXJzaW9uDQotCSAqIEBwYXJhbSBmYWNldElkIHRoZSBmYWNldCBpZA0KLQkgKiBAcmV0dXJuIHRydWUgaW4gY2FzZSB0aGUgcHJvamVjdCBzcGVjaWZpZWQgaXMgYSBmYWNldGVkIHByb2plY3QgYW5kIGhhcyB0aGUgZmFjZXQgd2l0aCB0aGUgdmVyc2lvbiBzcGVjaWZpZWQ7IGZhbHNlIG90aGVyd2lzZQ0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFueSBvZiB0aGUgaW5wdXQgcGFyYW1ldGVycyBpcyBudWxsDQotCSAqIEBzZWUgSUZhY2V0VXRpbHMjaGFzRmFjZXRXaXRoVmVyc2lvbihJUHJvamVjdCwgU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4pDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGYWNldFdpdGhWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldElkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0JDQotCS8qKg0KLQkgKiBDaGVja3Mgd2hldGhlciA8Y29kZT5wcm9qZWN0PC9jb2RlPiBoYXMgYSBmYWNldCB3aXRoIGlkIDxjb2RlPmZhY2V0SWQ8L2NvZGU+IHdpdGggdmVyc2lvbiA8Y29kZT5mYWNldFZlcnNpb248L2NvZGU+DQotCSAqIEluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIG5vdCBhIGZhY2V0ZWQgcHJvamVjdCwgZmFsc2UgaXMgcmV0dXJuZWQgDQotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0DQotCSAqIEBwYXJhbSBmYWNldFZlcnNpb24gdGhlIGZhY2V0IHZlcnNpb24NCi0JICogQHBhcmFtIGZhY2V0SWQgdGhlIGZhY2V0IGlkDQotCSAqIEBwYXJhbSBhY2NlcHRIaWdoZXJGYWNldFZlcnNpb24gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBoaWdoZXIgZmFjZXQgdmVyc2lvbnMgYXJlIGFjY2VwdGFibGUNCi0JICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgZmFjZXRlZCBwcm9qZWN0IGFuZCBoYXMgdGhlIGZhY2V0IHdpdGggdGhlIHZlcnNpb24gc3BlY2lmaWVkOyBmYWxzZSBvdGhlcndpc2UNCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbnkgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaGFzRmFjZXRXaXRoVmVyc2lvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmFjZXRWZXJzaW9uLCBTdHJpbmcgZmFjZXRJZCwgYm9vbGVhbiBhY2NlcHRIaWdoZXJGYWNldFZlcnNpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgZmFjZXRlZCBwcm9qZWN0DQotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0DQotCSAqIEByZXR1cm4NCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+cHJvamVjdDwvY29kZT4gaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNGYWNldGVkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25CYXNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25CYXNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMmVkYTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uQmFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25CYXNlOw0KLQ0KLS8qKg0KLSAqIEJhc2Uge0BsaW5rIElBbm5vdGF0aW9uQmFzZX0gaW1wbGVtZW50YXRpb24NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5ub3RhdGlvbkJhc2VJbXBsPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGV4dGVuZHMgVmFsdWVJbXBsDQotew0KLQlwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uTmFtZTsvLyBDb250YWluZXIgZm9yIEFubm90YXRpb24gTmFtZTsNCi0JcHJvdGVjdGVkIFQgamF2YUVsZW1lbnQ7IC8vIENvbmF0aW5lciBmb3IgdGhlIHBhcmVudCBJSmF2YUVsZW1lbnQ7DQotCS8vcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvblN0cmluZ1ZhbHVlOy8vQ29uYXRpbmVyIHRvIGN1cnJlbnQgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYW5ub3RhdGlvbg0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5hbm5vdGF0aW9uTmFtZTwvY29kZT4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5hbm5vdGF0aW9uTmFtZTwvY29kZT4gaXMgZW1wdHkgU3RyaW5nLg0KLQkgKi8NCi0JcHVibGljIEFubm90YXRpb25CYXNlSW1wbChTdHJpbmcgYW5ub3RhdGlvbk5hbWUpDQotCXsNCi0JCXRoaXMuYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRXh0cmFjdHMgb25seSB0aGUgQW5ub3RhdGlvbiBuYW1lIGluIGNhc2UgaXQgaXMgaW4gZnVsbHkgcXVhbGlmaWVkIGZvcm0uDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBzaW1wbGUgQW5ub3RhdGlvbiBuYW1lLg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRTaW1wbGVBbm5vdGF0aW9uTmFtZSgpDQotCXsNCi0JCWludCBsYXN0RG90SW5kZXggPSBhbm5vdGF0aW9uTmFtZS5sYXN0SW5kZXhPZihET1QpOw0KLQ0KLQkJaWYgKGxhc3REb3RJbmRleCA9PSAtMSkNCi0JCXsNCi0JCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWU7DQotCQl9DQotDQotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUuc3Vic3RyaW5nKGxhc3REb3RJbmRleCArIDEpOw0KLQl9DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKQ0KLQl7DQotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEFkZHMgQW5ub3RhdGlvbiB0byBzcGVjaWZpYyBJSmF2YUVsZW1lbnQuDQotCSAqIA0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0PmphdmFFbGVtZW50PC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IElUeXBlLCBJTWV0aG9kLCBJRmllbGQsIElUeXBlUGFyYW1ldGVyLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShUIGphdmFFbGVtZW50KQ0KLQl7DQotCQlzZXRKYXZhRWxlbWVudChqYXZhRWxlbWVudCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0SmF2YUVsZW1lbnQoVCBqYXZhRWxlbWVudCkNCi0Jew0KLQkJaWYgKGphdmFFbGVtZW50ID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJqYXZhRWxlbWVudCBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKCEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiamF2YUVsZW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgdHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJdGhpcy5qYXZhRWxlbWVudCA9IGphdmFFbGVtZW50Ow0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIGFubm90YXRpb25OYW1lLmhhc2hDb2RlKCk7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotCXsNCi0JCWlmICh0aGlzID09IG9iaikNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmogPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBBbm5vdGF0aW9uQmFzZUltcGw8VD4gb3RoZXIgPSAgKEFubm90YXRpb25CYXNlSW1wbDxUPilvYmo7DQotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUuZXF1YWxzKG90aGVyLmFubm90YXRpb25OYW1lKTsNCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQzYjVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotDQotLyoqDQotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElBbm5vdGF0aW9ufQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uSW1wbDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBleHRlbmRzIEFubm90YXRpb25CYXNlSW1wbDxUPiBpbXBsZW1lbnRzIElBbm5vdGF0aW9uPFQ+DQotew0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb24jZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBwYXJhbSkNCi0Jew0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFpciA6IGdldFBhcmFtVmFsdWVQYWlycygpKQ0KLQkJew0KLQkJCWlmIChwYXJhbS5lcXVhbHMocGFpci5nZXRQYXJhbSgpKSkNCi0JCQl7DQotCQkJCXJldHVybiBwYWlyLmdldFZhbHVlKCkhPW51bGwgPyBwYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKSA6IG51bGw7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHJpdmF0ZSBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnM7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lIC0NCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiBhbm5vdGF0aW9uDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlUGFpcnMgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBwYXJhbT12YWx1ZSBwYXJpcw0KLQkgKi8NCi0JcHVibGljIEFubm90YXRpb25JbXBsKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzKQ0KLQl7DQotCQlzdXBlcihhbm5vdGF0aW9uTmFtZSk7DQotCQl0aGlzLnBhcmFtVmFsdWVQYWlycyA9IHBhcmFtVmFsdWVQYWlyczsNCi0JfQ0KLQ0KLQlwdWJsaWMgU2V0PElQYXJhbVZhbHVlUGFpcj4gZ2V0UGFyYW1WYWx1ZVBhaXJzKCkNCi0Jew0KLQkJcmV0dXJuIHBhcmFtVmFsdWVQYWlyczsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbVZhbHVlUGFpcnMoU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzKQ0KLQl7DQotCQl0aGlzLnBhcmFtVmFsdWVQYWlycyA9IHBhcmFtVmFsdWVQYWlyczsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLQl7DQotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90ID0gYXN0Lm5ld05vcm1hbEFubm90YXRpb24oKTsNCi0JCWJvb2xlYW4gd2FzQWRkZWQgPSBhZGRJbXBvcnRzKGFzdCwgdW5pdCwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlpZiAod2FzQWRkZWQpDQotCQl7DQotCQkJKChTaW1wbGVOYW1lKSBhbm5vdC5nZXRUeXBlTmFtZSgpKS5zZXRJZGVudGlmaWVyKGdldFNpbXBsZUFubm90YXRpb25OYW1lKCkpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJTmFtZSBuYW1lID0gYXN0Lm5ld05hbWUoZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQkJYW5ub3Quc2V0VHlwZU5hbWUobmFtZSk7DQotCQl9DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcmFtVmFsdWVQYWlycykNCi0JCXsNCi0JCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IGFzdC5uZXdNZW1iZXJWYWx1ZVBhaXIoKTsNCi0JCQlwYWlyLmdldE5hbWUoKS5zZXRJZGVudGlmaWVyKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkpOw0KLQkJCXBhaXIuc2V0VmFsdWUoKChWYWx1ZUltcGwpIHBhcmFtVmFsdWVQYWlyLmdldFZhbHVlKCkpLmdldEV4cHJlc3Npb24odW5pdCwgYXN0KSk7DQotCQkJYW5ub3QudmFsdWVzKCkuYWRkKHBhaXIpOw0KLQkJfQ0KLQkJcmV0dXJuIGFubm90Ow0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJaWYocGFyYW1WYWx1ZVBhaXJzID09IG51bGwgfHwgcGFyYW1WYWx1ZVBhaXJzLnNpemUoKSA8IDEpDQotCQl7DQotCQkJcmV0dXJuIDMxICogc3VwZXIuaGFzaENvZGUoKTsNCi0JCX0NCi0JCXJldHVybiAzMSAqIHN1cGVyLmhhc2hDb2RlKCkgKyBBcnJheXMuaGFzaENvZGUocGFyYW1WYWx1ZVBhaXJzLnRvQXJyYXkobmV3IElQYXJhbVZhbHVlUGFpcltwYXJhbVZhbHVlUGFpcnMuc2l6ZSgpXSkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKCFzdXBlci5lcXVhbHMob2JqKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBBbm5vdGF0aW9uSW1wbDw/PiBvdGhlciA9IChBbm5vdGF0aW9uSW1wbDw/Pikgb2JqOw0KLQkJcmV0dXJuIChBcnJheXMuZXF1YWxzKHBhcmFtVmFsdWVQYWlycy50b0FycmF5KG5ldyBJUGFyYW1WYWx1ZVBhaXJbcGFyYW1WYWx1ZVBhaXJzLnNpemUoKV0pLCBvdGhlci5wYXJhbVZhbHVlUGFpcnMudG9BcnJheShuZXcgSVBhcmFtVmFsdWVQYWlyW3BhcmFtVmFsdWVQYWlycy5zaXplKCldKSkpOw0KLQl9DQotDQotCXB1YmxpYyBUIGdldEFwcGxpZWRFbGVtZW50KCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuamF2YUVsZW1lbnQ7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25JbnNwZWN0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkluc3BlY3RvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmM4NjdlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkluc3BlY3RvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZFR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6ei5BU1RVdGlsczsNCi0NCi0vKioNCi0gKiBDbGFzcywgd2hpY2ggaXMgbWFkZSB0byBsb2FkIGFuZCByZXR1cm4gYW5ub3RhdGlvbnMgZnJvbSBhIGdpdmVuIElKYXZhRWxlbWV0Lg0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbCBpbXBsZW1lbnRzIElBbm5vdGF0aW9uSW5zcGVjdG9yDQotew0KLQlwcml2YXRlIElUeXBlIGlUeXBlOw0KLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBjVW5pdDsNCi0NCi0JcHVibGljIEFubm90YXRpb25JbnNwZWN0b3JJbXBsKGZpbmFsIElUeXBlIHR5cGUpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbSh0eXBlLCAidHlwZSIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCXRoaXMuaVR5cGUgPSB0eXBlOw0KLQl9CQ0KLQ0KLQlwdWJsaWMgSUFubm90YXRpb248SU1ldGhvZD4gaW5zcGVjdE1ldGhvZChmaW5hbCBJTWV0aG9kIG1ldGhvZCwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0obWV0aG9kLCAibWV0aG9kIik7IC8vJE5PTi1OTFMtMSQNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShhbm5vdGF0aW9uUU5hbWUsICJhbm5vdGF0aW9uUU5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYoIShtZXRob2QgaW5zdGFuY2VvZiBJTWV0aG9kKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRob2QgYXJndW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgVHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoYW5ub3RhdGlvblFOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIGFyZ3VtZW50IGlzIG5vdCB3aXRoIHByb3BwZXIgdmFsdWUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBnZXRTcGVjaWZpY0Fubm90YXRpb25Gcm9tTWVtYmVyKG1ldGhvZCwgbWV0aG9kLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCksIGFubm90YXRpb25RTmFtZSk7CQkNCi0JfQkNCi0NCi0JcHVibGljIENvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGluc3BlY3RNZXRob2QoSU1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKG1ldGhvZCwgIm1ldGhvZCIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCWlmKCEobWV0aG9kIGluc3RhbmNlb2YgSU1ldGhvZCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0aG9kIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IFR5cGUhIik7CS8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBnZXRGcm9tTWVtYmVyKG1ldGhvZCwgbWV0aG9kLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyBJQW5ub3RhdGlvbjxJRmllbGQ+IGluc3BlY3RGaWVsZChmaW5hbCBJRmllbGQgZmllbGQsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oZmllbGQsICJmaWVsZCIpOyAvLyROT04tTkxTLTEkDQotCQludWxsQ2hlY2tQYXJhbShhbm5vdGF0aW9uUU5hbWUsICJhbm5vdGF0aW9uUU5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaWYoIShmaWVsZCBpbnN0YW5jZW9mIElGaWVsZCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmllbGQgYXJndW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgVHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoYW5ub3RhdGlvblFOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIGFyZ3VtZW50IGlzIG5vdCB3aXRoIHByb3BwZXIgdmFsdWUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBmaWVsZC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbkZyb21NZW1iZXIoZmllbGQsIGNsYXNzTmFtZSwgYW5ub3RhdGlvblFOYW1lKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJRmllbGQ+PiBpbnNwZWN0RmllbGQoSUZpZWxkIGZpZWxkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmIChmaWVsZCA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmllbGQgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighKGZpZWxkIGluc3RhbmNlb2YgSUZpZWxkKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaWVsZCBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCBUeXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gZmllbGQuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCXJldHVybiBnZXRGcm9tTWVtYmVyKGZpZWxkLCBjbGFzc05hbWUpOw0KLQl9DQotDQotCXB1YmxpYyBJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gaW5zcGVjdFBhcmFtKGZpbmFsIElUeXBlUGFyYW1ldGVyIHBhcmFtLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHBhcmFtLCAicGFyYW0iKTsgLy8kTk9OLU5MUy0xJA0KLQkJbnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvblFOYW1lLCAiYW5ub3RhdGlvblFOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJaWYoIShwYXJhbSBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJhbSBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCBUeXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihhbm5vdGF0aW9uUU5hbWUudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbm5vdGF0aW9uUU5hbWUgYXJndW1lbnQgaXMgbm90IHdpdGggcHJvcHBlciB2YWx1ZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZUZyb21QYXJhbShwYXJhbSk7DQotCQlyZXR1cm4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uRnJvbU1lbWJlcihwYXJhbSwgY2xhc3NOYW1lLCBhbm5vdGF0aW9uUU5hbWUpOwkJDQotCX0NCi0JDQotCXB1YmxpYyBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gaW5zcGVjdFBhcmFtKElUeXBlUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmIChwYXJhbSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW0gc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighKHBhcmFtIGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmFtIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IFR5cGUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBnZXRGcm9tTWVtYmVyKHBhcmFtLCBnZXRDbGFzc05hbWVGcm9tUGFyYW0ocGFyYW0pKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUFubm90YXRpb248SVR5cGU+IGluc3BlY3RUeXBlKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvblFOYW1lLCAiYW5ub3RhdGlvblFOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJaWYgKGFubm90YXRpb25RTmFtZS50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFubm90YXRpb25RTmFtZSBhcmd1bWVudCBpcyBub3Qgd2l0aCBwcm9wcGVyIHZhbHVlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCXJldHVybiBnZXRTcGVjaWZpY0Fubm90YXRpb25Gcm9tTWVtYmVyKGlUeXBlLCBpVHlwZS5nZXRFbGVtZW50TmFtZSgpLCBhbm5vdGF0aW9uUU5hbWUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGluc3BlY3RUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gZ2V0RnJvbU1lbWJlcihpVHlwZSwgaVR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7DQotCX0JDQotCQ0KLQkvLyAjIGltcGxlbWVudGF0aW9uDQotCQ0KLQlwcml2YXRlIFN0cmluZyBnZXRDbGFzc05hbWVGcm9tUGFyYW0oZmluYWwgSVR5cGVQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYocGFyYW0uZ2V0RGVjbGFyaW5nTWVtYmVyKCkgaW5zdGFuY2VvZiBJTWV0aG9kKQ0KLQkJew0KLQkJCXJldHVybiBwYXJhbS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHBhcmFtLmdldERlY2xhcmluZ01lbWJlcigpLmdldEVsZW1lbnROYW1lKCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGdldEZyb21NZW1iZXIoVCB0eXBlLCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmICghaXNTdXBwb3J0ZWRKYXZhRWxlbWVudCh0eXBlKSkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhc3NlZCBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCB0eXBlLiIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCUlDb21waWxhdGlvblVuaXQgY1VuaXQgPSBudWxsOw0KLQkJaWYodHlwZSBpbnN0YW5jZW9mIElNZW1iZXIpIHsNCi0JCQljVW5pdCA9ICgoSU1lbWJlcil0eXBlKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWNVbml0ID0gKChJVHlwZVBhcmFtZXRlcil0eXBlKS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGNVbml0ID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCQl9DQotDQotCQlmaW5hbCBDb21waWxhdGlvblVuaXQgdW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJZmluYWwgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCB1bml0KTsNCi0JCQ0KLQkJc3dpdGNoKHR5cGUuZ2V0RWxlbWVudFR5cGUoKSkNCi0JCXsNCi0JCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6DQotCQkJcmV0dXJuIGdldEFubm90YXRpb25zKHR5cGUsIHR5cGVEZWNsYXJhdGlvbik7DQotCQkJDQotCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRDoNCi0JCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldEZpZWxkRGVjbGFyYXRpb24oKElGaWVsZCkgdHlwZSwgKFR5cGVEZWNsYXJhdGlvbil0eXBlRGVjbGFyYXRpb24pOw0KLQkJCXJldHVybiBnZXRBbm5vdGF0aW9ucyh0eXBlLCBmaWVsZERlY2xhcmF0aW9uKTsNCi0JCQkNCi0JCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoNCi0JCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24oKElNZXRob2QpIHR5cGUsIChUeXBlRGVjbGFyYXRpb24pdHlwZURlY2xhcmF0aW9uKTsNCi0JCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbnModHlwZSwgbWV0aG9kRGVjbGFyYXRpb24pOw0KLQkJCQ0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRV9QQVJBTUVURVI6DQotCQkJbWV0aG9kRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKChJTWV0aG9kKSgoSVR5cGVQYXJhbWV0ZXIpIHR5cGUpLmdldFBhcmVudCgpLCAoVHlwZURlY2xhcmF0aW9uKXR5cGVEZWNsYXJhdGlvbik7DQotCQkJcmV0dXJuIGdldFBhcmFtQW5ub3RhdGlvbnModHlwZSwgbWV0aG9kRGVjbGFyYXRpb24pOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG5ldyBIYXNoU2V0PElBbm5vdGF0aW9uPFQ+PigpOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGdldEFubm90YXRpb25zKFQgaU1lbWJlciwgQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoYm9keURlY2xhcmF0aW9uICE9IG51bGwpDQotCQl7DQotCQkJTGlzdCBsaXN0ID0gYm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpOw0KLQkJCXJldHVybiBleHRyYWN0QW5ub3RhdGlvbnMoaU1lbWJlciwgbGlzdCk7DQotCQl9DQotCQlyZXR1cm4gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGdldFBhcmFtQW5ub3RhdGlvbnMoVCBpTWVtYmVyLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAobWV0aG9kRGVjbGFyYXRpb24gIT0gbnVsbCkNCi0JCXsNCi0JCQlmb3IgKE9iamVjdCBwYXJhbSA6IG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKSkNCi0JCQl7DQotCQkJCWlmIChwYXJhbSBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gJiYNCi0JCQkJCQkoKElUeXBlUGFyYW1ldGVyKWlNZW1iZXIpLmdldEVsZW1lbnROYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKXBhcmFtKS5nZXROYW1lKCkudG9TdHJpbmcoKSkpDQotCQkJCXsNCi0JCQkJCUxpc3QgbGlzdCA9ICgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgcGFyYW0pLm1vZGlmaWVycygpOw0KLQkJCQkNCi0JCQkJCXJldHVybiBleHRyYWN0QW5ub3RhdGlvbnMoaU1lbWJlciwgbGlzdCk7DQotCQkJCX0NCi0JCQl9CQkJDQotCQl9DQotCQlyZXR1cm4gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCX0NCi0JDQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGV4dHJhY3RBbm5vdGF0aW9ucyhUIGlNZW1iZXIsIExpc3QgbGlzdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOw0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlFeHRlbmRlZE1vZGlmaWVyIGVsZW1lbnQgPSAoSUV4dGVuZGVkTW9kaWZpZXIpIGl0ZXIubmV4dCgpOw0KLQkJCWlmIChlbGVtZW50LmlzQW5ub3RhdGlvbigpKQ0KLQkJCXsNCi0JCQkJdmFsdWVzLmFkZChjb252ZXJ0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgZWxlbWVudCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCVNldDxJQW5ub3RhdGlvbjxUPj4gZXhwcmVzc2lvbnMgPSBuZXcgSGFzaFNldDxJQW5ub3RhdGlvbjxUPj4oKTsNCi0JCWZvciAoSVZhbHVlIHZhbHVlIDogdmFsdWVzKSANCi0JCXsNCi0JCQlBbm5vdGF0aW9uSW1wbDxUPiBhbm4gPSAoQW5ub3RhdGlvbkltcGw8VD4pdmFsdWU7DQotCQkJYW5uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoaU1lbWJlcik7DQotCQkJZXhwcmVzc2lvbnMuYWRkKGFubik7DQotCQl9DQotCQlyZXR1cm4gZXhwcmVzc2lvbnM7CQkNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IElBbm5vdGF0aW9uPFQ+IGV4dHJhY3RTcGVjaWZpY0Fubm90YXRpb24oVCBpTWVtYmVyLCBMaXN0IGxpc3QsIElUeXBlIHR5cGUsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsNCi0JCVNldDxJVmFsdWU+IHZhbHVlcyA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJRXh0ZW5kZWRNb2RpZmllciBlbGVtZW50ID0gKElFeHRlbmRlZE1vZGlmaWVyKSBpdGVyLm5leHQoKTsNCi0JCQlpZiAoZWxlbWVudC5pc0Fubm90YXRpb24oKSkNCi0JCQl7CQkJCQ0KLQkJCQlmaW5hbCBOYW1lIHR5cGVOYW1lID0gKChBbm5vdGF0aW9uKWVsZW1lbnQpLmdldFR5cGVOYW1lKCk7DQotCQkJCWlmIChhbm5vdGF0aW9uUU5hbWUuZW5kc1dpdGgodHlwZU5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKSB7DQotCQkJCQl2YWx1ZXMuYWRkKGNvbnZlcnRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBlbGVtZW50KSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlmb3IgKElWYWx1ZSB2YWx1ZSA6IHZhbHVlcykgDQotCQl7DQotCQkJQW5ub3RhdGlvbkltcGw8VD4gdG1wQW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uSW1wbDxUPil2YWx1ZTsNCi0JCQlpZihjaGVja1NwZWNpZmljQW5ub3RhdHRpb24odG1wQW5ub3RhdGlvbiwgdHlwZSwgYW5ub3RhdGlvblFOYW1lKSkNCi0JCQl7DQotCQkJCUFubm90YXRpb25JbXBsPFQ+IHJlc3VsdCA9IG5ldyBBbm5vdGF0aW9uSW1wbDxUPihhbm5vdGF0aW9uUU5hbWUsIHRtcEFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkpOw0KLQkJCQlyZXN1bHQuc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShpTWVtYmVyKTsNCi0JCQkJcmVzdWx0LnNldExvY2F0b3IodG1wQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCkpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOwkJDQotCX0JDQotDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGJvb2xlYW4gY2hlY2tTcGVjaWZpY0Fubm90YXR0aW9uKGZpbmFsIEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb24sIGZpbmFsIElUeXBlIHR5cGUsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uUU5hbWUpIHx8IA0KLQkJCQkodHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpICsgIi4iICsgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKS5lcXVhbHMoYW5ub3RhdGlvblFOYW1lKSkgLy8kTk9OLU5MUy0xJA0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlJQ29tcGlsYXRpb25Vbml0IGNVbml0ID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCUlJbXBvcnREZWNsYXJhdGlvbltdIGltcG9ydHMgPSBjVW5pdC5nZXRJbXBvcnRzKCk7DQotCQlmb3IgKElJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnREZWNsYXJhdGlvbiA6IGltcG9ydHMpDQotCQl7DQotCQkJaWYoYW5ub3RhdGlvblFOYW1lLmVuZHNXaXRoKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkgJiYgaW1wb3J0RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvblFOYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJZm9yIChJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gOiBpbXBvcnRzKQ0KLQkJew0KLQkJCWlmKGltcG9ydERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCkuZW5kc1dpdGgoIioiKSkgLy8kTk9OLU5MUy0xJA0KLQkJCXsNCi0JCQkJU3RyaW5nIGltcG9ydFN0ciA9IGltcG9ydERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCkuc3Vic3RyaW5nKDAsIGltcG9ydERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgLSAxKTsNCi0JCQkJaWYoYW5ub3RhdGlvblFOYW1lLmVuZHNXaXRoKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkgJiYgYW5ub3RhdGlvblFOYW1lLmluZGV4T2YoaW1wb3J0U3RyKSA9PSAwKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIElWYWx1ZSBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJc3dpdGNoIChlbGVtZW50LmdldE5vZGVUeXBlKCkpDQotCQl7DQotCQkJY2FzZSBBU1ROb2RlLk1BUktFUl9BTk5PVEFUSU9OOg0KLQkJCXsNCi0JCQkJTWFya2VyQW5ub3RhdGlvbiBtYSA9IChNYXJrZXJBbm5vdGF0aW9uKSBlbGVtZW50Ow0KLQkJCQlBbm5vdGF0aW9uSW1wbCBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsKGdldEZ1bGx5UXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUobWEpLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOw0KLQkJCQlhbm5vdGF0aW9uLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcihtYSkpOw0KLQkJCQlyZXR1cm4gYW5ub3RhdGlvbjsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTjoNCi0JCQl7DQotCQkJCWZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb24gc21hID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGVsZW1lbnQ7DQotCQkJCWZpbmFsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0NCi0JCQkJZmluYWwgSVZhbHVlIHZhbHVlID0gY29udmVydEV4cHJlc3Npb24oc21hLmdldFZhbHVlKCkpOw0KLQkJCQlpZiAodmFsdWUhPW51bGwpIHsNCi0JCQkJCXZhbHVlcy5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgidmFsdWUiLCB2YWx1ZSkpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJDQotCQkJCUFubm90YXRpb25JbXBsIGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGwoZ2V0RnVsbHlRdWFsaWZpZWRBbm5vdGF0aW9uTmFtZShzbWEpLCB2YWx1ZXMpOw0KLQkJCQlhbm5vdGF0aW9uLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcihzbWEpKTsNCi0JCQkJcmV0dXJuIGFubm90YXRpb247DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5OT1JNQUxfQU5OT1RBVElPTjoNCi0JCQl7DQotCQkJCXJldHVybiBnZXROb3JtYWxBbm5vdGF0aW9uVmFsdWUoKE5vcm1hbEFubm90YXRpb24pIGVsZW1lbnQpOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVI6DQotCQkJew0KLQkJCQlBcnJheUluaXRpYWxpemVyIGFyciA9IChBcnJheUluaXRpYWxpemVyKSBlbGVtZW50Ow0KLQkJCQlMaXN0PEV4cHJlc3Npb24+IGxpc3QgPSBhcnIuZXhwcmVzc2lvbnMoKTsNCi0JCQkJSXRlcmF0b3I8RXhwcmVzc2lvbj4gaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsNCi0JCQkJU2V0PElWYWx1ZT4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpDQotCQkJCXsNCi0JCQkJCUV4cHJlc3Npb24gZXhwciA9IChFeHByZXNzaW9uKSBpdGVyLm5leHQoKTsNCi0JCQkJCXJlc3VsdC5hZGQoY29udmVydEV4cHJlc3Npb24oZXhwcikpOw0KLQkJCQl9DQotCQkJCXJldHVybiBuZXcgQXJyYXlWYWx1ZUltcGwocmVzdWx0KTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLk5VTExfTElURVJBTDoNCi0JCQl7DQotCQkJCS8vIHJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVOdWxsVmFsdWUoKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5TSU1QTEVfTkFNRToNCi0JCQl7DQotCQkJCWJyZWFrOy8vcmV0dXJuIG5ldyBTdHJpbmdWYWx1ZUltcGwoKChTaW1wbGVOYW1lKWVsZW1lbnQpLmdldElkZW50aWZpZXIoKSk7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5UWVBFX0xJVEVSQUw6DQotCQkJew0KLQkJCQlyZXR1cm4gZ2V0VHlwZUxpdGVyYWxWYWx1ZSgoVHlwZUxpdGVyYWwpIGVsZW1lbnQpOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuUVVBTElGSUVEX05BTUU6DQotCQkJew0KLQkJCQlRdWFsaWZpZWROYW1lIHFuID0gKFF1YWxpZmllZE5hbWUpIGVsZW1lbnQ7DQotCQkJCVF1YWxpZmllZE5hbWVWYWx1ZUltcGwgcW5WYWx1ZSA9IG5ldyBRdWFsaWZpZWROYW1lVmFsdWVJbXBsKHFuLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCQkJcW5WYWx1ZS5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IocW4pKTsNCi0JCQkJcmV0dXJuIHFuVmFsdWU7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5CT09MRUFOX0xJVEVSQUw6DQotCQkJew0KLQkJCQlCb29sZWFuTGl0ZXJhbCBibCA9IChCb29sZWFuTGl0ZXJhbCkgZWxlbWVudDsNCi0JCQkJQm9vbGVhblZhbHVlSW1wbCBiVmFsdWUgPSBuZXcgQm9vbGVhblZhbHVlSW1wbChibC5ib29sZWFuVmFsdWUoKSk7DQotCQkJCWJWYWx1ZS5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IoYmwpKTsNCi0JCQkJcmV0dXJuIGJWYWx1ZTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLkNIQVJBQ1RFUl9MSVRFUkFMOg0KLQkJCXsNCi0JCQkJLy8gQ2hhcmFjdGVyTGl0ZXJhbCBjbCA9IChDaGFyYWN0ZXJMaXRlcmFsKSBlbGVtZW50Ow0KLQkJCQkvLyBUT0RPIEZpbmlzaCB3aXRoIHRoaXMgcmV0dXJuIG5ldyBDaGFyYWN0ZXJWYWx1ZShjbC5jaGFyVmFsdWUoKSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuTlVNQkVSX0xJVEVSQUw6DQotCQkJew0KLQkJCQlOdW1iZXJMaXRlcmFsIG5sID0gKE51bWJlckxpdGVyYWwpIGVsZW1lbnQ7DQotCQkJCUludGVnZXJWYWx1ZUltcGwgaW50VmFsdWUgPSBuZXcgSW50ZWdlclZhbHVlSW1wbChubC5nZXRUb2tlbigpKTsNCi0JCQkJaW50VmFsdWUuc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKG5sKSk7DQotCQkJCXJldHVybiBpbnRWYWx1ZTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLlNUUklOR19MSVRFUkFMOg0KLQkJCXsNCi0JCQkJU3RyaW5nTGl0ZXJhbCBzbCA9IChTdHJpbmdMaXRlcmFsKSBlbGVtZW50Ow0KLQkJCQlTdHJpbmdWYWx1ZUltcGwgc3RyVmFsdWUgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKHNsLmdldExpdGVyYWxWYWx1ZSgpKTsNCi0JCQkJc3RyVmFsdWUuc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKHNsKSk7DQotCQkJCXJldHVybiBzdHJWYWx1ZTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJVmFsdWUgZ2V0VHlwZUxpdGVyYWxWYWx1ZShUeXBlTGl0ZXJhbCB0bCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlUeXBlIHR5cGUgPSB0bC5nZXRUeXBlKCk7DQotCQlOYW1lIG5hbWUgPSBudWxsOw0KLQkJaWYgKHR5cGUuaXNRdWFsaWZpZWRUeXBlKCkpDQotCQl7DQotCQkJbmFtZSA9ICgoUXVhbGlmaWVkVHlwZSkgdHlwZSkuZ2V0TmFtZSgpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJaWYgKHR5cGUuaXNTaW1wbGVUeXBlKCkpDQotCQkJew0KLQkJCQluYW1lID0gKChTaW1wbGVUeXBlKSB0eXBlKS5nZXROYW1lKCk7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKG5hbWUgIT0gbnVsbCkNCi0JCXsNCi0JCQlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQodGwpOw0KLQkJCWlmIChjdSAhPSBudWxsKQ0KLQkJCXsNCi0JCQkJU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSA9IG5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotCQkJCWlmICh0eXBlLmlzU2ltcGxlVHlwZSgpKQ0KLQkJCQl7DQotCQkJCQlmdWxseVF1YWxpZmllZE5hbWUgPSByZXNvbHZlVHlwZSgoSUNvbXBpbGF0aW9uVW5pdCkgY3UuZ2V0SmF2YUVsZW1lbnQoKSwgZnVsbHlRdWFsaWZpZWROYW1lKTsNCi0JCQkJfQ0KLQ0KLQkJCQlDbGFzc1ZhbHVlSW1wbCBjVmFsdWUgPSBuZXcgQ2xhc3NWYWx1ZUltcGwoZnVsbHlRdWFsaWZpZWROYW1lKTsNCi0JCQkJY1ZhbHVlLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcih0bCkpOw0KLQkJCQlyZXR1cm4gY1ZhbHVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBJVmFsdWUgZ2V0Tm9ybWFsQW5ub3RhdGlvblZhbHVlKE5vcm1hbEFubm90YXRpb24gbmEpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGwgPSBuYS52YWx1ZXMoKTsNCi0JCUl0ZXJhdG9yPE1lbWJlclZhbHVlUGFpcj4gaXRlciA9IGwuaXRlcmF0b3IoKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlNZW1iZXJWYWx1ZVBhaXIgbXZwID0gKE1lbWJlclZhbHVlUGFpcikgaXRlci5uZXh0KCk7DQotCQkJSVZhbHVlIG12cHZhbCA9IGNvbnZlcnRFeHByZXNzaW9uKG12cC5nZXRWYWx1ZSgpKTsNCi0JCQlQYXJhbVZhbHVlUGFpckltcGwgcGFpciA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwobXZwLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCksIG12cHZhbCk7DQotCQkJcGFpci5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IobXZwKSk7DQotCQkJcmVzdWx0LmFkZChwYWlyKTsNCi0JCX0NCi0JCQ0KLQkJQW5ub3RhdGlvbkltcGwgYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbChnZXRGdWxseVF1YWxpZmllZEFubm90YXRpb25OYW1lKG5hKSwgcmVzdWx0KTsNCi0JCWFubm90YXRpb24uc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKG5hKSk7DQotCQlyZXR1cm4gYW5ub3RhdGlvbjsNCi0JfQkNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRBbm5vdGF0aW9uTmFtZShBbm5vdGF0aW9uIGFubm8pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJTmFtZSB0eXBlTmFtZSA9IGFubm8uZ2V0VHlwZU5hbWUoKTsNCi0JCVN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUgPSB0eXBlTmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0JCWlmICh0eXBlTmFtZS5pc1NpbXBsZU5hbWUoKSkNCi0JCXsNCi0JCQlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoYW5ubyk7DQotCQkJZnVsbHlRdWFsaWZpZWROYW1lID0gcmVzb2x2ZVR5cGUoKElDb21waWxhdGlvblVuaXQpIGN1LmdldEphdmFFbGVtZW50KCksIGZ1bGx5UXVhbGlmaWVkTmFtZSk7DQotCQl9DQotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWROYW1lOw0KLQl9DQotCQ0KLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoRXhwcmVzc2lvbiBlbGVtZW50KQ0KLQl7DQotCQlBU1ROb2RlIGN1ID0gZWxlbWVudDsNCi0JCXdoaWxlIChjdSAhPSBudWxsICYmICEoY3UgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpKQ0KLQkJew0KLQkJCWN1ID0gY3UuZ2V0UGFyZW50KCk7DQotCQl9DQotCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgY3U7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVUeXBlKElDb21waWxhdGlvblVuaXQgaWN1LCBTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyBsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZ1bGx5UXVhbGlmaWVkTmFtZTsNCi0JCUlUeXBlW10gYWxsVHlwZXMgPSBpY3UuZ2V0QWxsVHlwZXMoKTsNCi0JCWlmIChhbGxUeXBlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZTsNCi0JCX0NCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsVHlwZXMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJU3RyaW5nW11bXSByZXNvbHZlZFR5cGUgPSBhbGxUeXBlc1tpXS5yZXNvbHZlVHlwZShsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZSk7DQotCQkJaWYgKHJlc29sdmVkVHlwZSAhPSBudWxsICYmIHJlc29sdmVkVHlwZS5sZW5ndGggPiAwKQ0KLQkJCXsNCi0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZXNvbHZlZFR5cGVbMF0ubGVuZ3RoOyBqKyspDQotCQkJCXsNCi0JCQkJCWJ1ZiA9IGFwcGVuZERvdChqLCBidWYpOw0KLQkJCQkJYnVmLmFwcGVuZChyZXNvbHZlZFR5cGVbMF1bal0pOw0KLQkJCQl9DQotCQkJCWxvY2FsRnVsbHlRdWFsaWZpZWROYW1lID0gYnVmLnRvU3RyaW5nKCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYXBwZW5kRG90KGludCBpbmRleCwgU3RyaW5nQnVmZmVyIGJ1ZmYpDQotCXsNCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBidWZmOw0KLQkJaWYgKGluZGV4ICE9IDApDQotCQl7DQotCQkJcmVzdWx0LmFwcGVuZCgnLicpOw0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBJQW5ub3RhdGlvbjxUPiBnZXRTcGVjaWZpY0Fubm90YXRpb25Gcm9tTWVtYmVyKGZpbmFsIFQgdHlwZSwgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoIWlzU3VwcG9ydGVkSmF2YUVsZW1lbnQodHlwZSkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFzc2VkIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUuIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCA9IG51bGw7DQotCQlpZiAodHlwZSBpbnN0YW5jZW9mIElNZW1iZXIpIHsNCi0JCQljVW5pdCA9ICgoSU1lbWJlcil0eXBlKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWNVbml0ID0gKChJVHlwZVBhcmFtZXRlcil0eXBlKS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGNVbml0ID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCWZpbmFsIENvbXBpbGF0aW9uVW5pdCB1bml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlmaW5hbCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIHVuaXQpOw0KLQkJDQotCQlzd2l0Y2godHlwZS5nZXRFbGVtZW50VHlwZSgpKQ0KLQkJew0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToNCi0JCQlyZXR1cm4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uKHR5cGUsIHR5cGVEZWNsYXJhdGlvbiwgKElUeXBlKXR5cGUsIGFubm90YXRpb25RTmFtZSk7DQotCQkNCi0JCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEOg0KLQkJCUlGaWVsZCBmaWVsZCA9IChJRmllbGQpIHR5cGU7DQotCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRGaWVsZERlY2xhcmF0aW9uKGZpZWxkLCAoVHlwZURlY2xhcmF0aW9uKXR5cGVEZWNsYXJhdGlvbik7DQotCQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbih0eXBlLCBmaWVsZERlY2xhcmF0aW9uLCBmaWVsZC5nZXREZWNsYXJpbmdUeXBlKCksIGFubm90YXRpb25RTmFtZSk7DQotDQotCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6DQotCQkJSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgdHlwZTsNCi0JCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCAoVHlwZURlY2xhcmF0aW9uKXR5cGVEZWNsYXJhdGlvbik7DQotCQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbih0eXBlLCBtZXRob2REZWNsYXJhdGlvbiwgbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSwgYW5ub3RhdGlvblFOYW1lKTsNCi0NCi0JCWNhc2UgSUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSOg0KLQkJCW1ldGhvZCA9IChJTWV0aG9kKSgoSVR5cGVQYXJhbWV0ZXIpIHR5cGUpLmdldFBhcmVudCgpOw0KLQkJCW1ldGhvZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbihtZXRob2QsIChUeXBlRGVjbGFyYXRpb24pdHlwZURlY2xhcmF0aW9uKTsNCi0JCQlyZXR1cm4gZ2V0U3BlY2lmaWNQYXJhbUFubm90YXRpb24odHlwZSwgbWV0aG9kRGVjbGFyYXRpb24sIG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCksIGFubm90YXRpb25RTmFtZSk7DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi0JDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IElBbm5vdGF0aW9uPFQ+IGdldFNwZWNpZmljQW5ub3RhdGlvbihmaW5hbCBUIGlNZW1iZXIsIGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24sIGZpbmFsIElUeXBlIHR5cGUsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKGJvZHlEZWNsYXJhdGlvbiAhPSBudWxsKQ0KLQkJew0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQkJCWZpbmFsIExpc3QgbGlzdCA9IGJvZHlEZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsNCi0JCQlyZXR1cm4gZXh0cmFjdFNwZWNpZmljQW5ub3RhdGlvbihpTWVtYmVyLCBsaXN0LCB0eXBlLCBhbm5vdGF0aW9uUU5hbWUpOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IElBbm5vdGF0aW9uPFQ+IGdldFNwZWNpZmljUGFyYW1Bbm5vdGF0aW9uKFQgaU1lbWJlciwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIGZpbmFsIElUeXBlIHR5cGUsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uICE9IG51bGwpDQotCQl7DQotCQkJZm9yIChPYmplY3QgcGFyYW0gOiBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCkpDQotCQkJew0KLQkJCQlpZiAocGFyYW0gaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uICYmDQotCQkJCQkJKChJVHlwZVBhcmFtZXRlcilpTWVtYmVyKS5nZXRFbGVtZW50TmFtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbilwYXJhbSkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKQ0KLQkJCQl7DQotCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JCQkJCWZpbmFsIExpc3QgbGlzdCA9ICgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgcGFyYW0pLm1vZGlmaWVycygpOw0KLQkJCQkNCi0JCQkJCXJldHVybiBleHRyYWN0U3BlY2lmaWNBbm5vdGF0aW9uKGlNZW1iZXIsIGxpc3QsIHR5cGUsIGFubm90YXRpb25RTmFtZSk7DQotCQkJCX0NCi0JCQl9CQkJDQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi0JDQotCXByaXZhdGUgYm9vbGVhbiBpc1N1cHBvcnRlZEphdmFFbGVtZW50KGZpbmFsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgDQotCXsNCi0JCXJldHVybiAJamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKT09SUphdmFFbGVtZW50Lk1FVEhPRCB8fA0KLQkJCQlqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpPT1JSmF2YUVsZW1lbnQuVFlQRSB8fA0KLQkJCQlqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpPT1JSmF2YUVsZW1lbnQuRklFTEQgfHwNCi0JCQkJamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKT09SUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSOw0KLQl9DQotCQ0KLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSANCi0Jew0KLQkJaWYgKGNVbml0PT1udWxsKSB7DQotCQkJY1VuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbnVsbCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjVW5pdDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9jYXRvciBjcmVhdGVMb2NhdG9yKGZpbmFsIEFTVE5vZGUgbm9kZSkNCi0Jew0KLQkJZmluYWwgaW50IGxpbmVOdW1iZXIgPSBnZXRDb21waWxhdGlvblVuaXQoKS5nZXRMaW5lTnVtYmVyKG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCXJldHVybiBuZXcgTG9jYXRvckltcGwobGluZU51bWJlciwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCksIG5vZGUuZ2V0TGVuZ3RoKCkpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2MxN2JmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25Qcm9wZXJ0eTsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblByb3BlcnR5IGltcGxlbWVudHMgSUFubm90YXRpb25Qcm9wZXJ0eQ0KLXsNCi0JcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbk5hbWU7DQotCXByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOw0KLQlwcml2YXRlIEF0dHJpYnV0ZVR5cGVFbnVtIGF0dHJpYnV0ZVR5cGU7DQotCQ0KLQkvKioNCi0JICogUHVibGljIGNvbnN0cnVjdG9yIGZvciBBbm5vdGF0aW9uUHJvcGVydHkgb2JqZWN0cw0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lIC0gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBOYW1lIGZvciB0aGUgQW5ub3RhdGlvbi4NCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIE5hbWUgZm9yIHRoZSBBdHRyaWJ1dGUuDQotCSAqIEBwYXJhbSB2YWx1ZSAtIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVmFsdWUgZm9yIHRoZSBBdHRyaWJ1dGUuDQotCSAqLw0KLQlwdWJsaWMgQW5ub3RhdGlvblByb3BlcnR5KGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSwgZmluYWwgQXR0cmlidXRlVHlwZUVudW0gYXR0cmlidXRlVHlwZSkNCi0Jew0KLQkJdGhpcy5hbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb25OYW1lOw0KLQkJdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JCXRoaXMuYXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7DQotCX0NCi0JCQ0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbk5hbWU7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTmFtZTsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpDQotCXsNCi0JCXJldHVybiB0aGlzLnZhbHVlOw0KLQl9DQotCQ0KLQlwdWJsaWMgQXR0cmlidXRlVHlwZUVudW0gZ2V0QXR0cmlidXRlVHlwZSgpDQotCXsNCi0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZVR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YjAxOGNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyDQotew0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PiB0eXBlQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSANCi0JCW5ldyBIYXNoTWFwPFN0cmluZywgU2V0PElQYXJhbVZhbHVlUGFpcj4+KCk7DQotCXByaXZhdGUgTWFwPFN0cmluZywgU2V0PElQYXJhbVZhbHVlUGFpcj4+IG1ldGhvZEFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gDQotCQluZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PigpOw0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PiBwYXJhbWV0ZXJBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IA0KLQkJbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPj4oKTsNCi0JDQotCS8qKg0KLQkgKiBBZGQgQW5ub3RhdGlvbiBQcm9wZXJ0eSB0byB0aGUgY29udGFpbmVyLiANCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4gb3IgPGNvZGU+YW5ub3RhdGlvblByb3BlcnR5PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZEFubm90YXRpb25Qcm9wZXJ0eShmaW5hbCBBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5LCBmaW5hbCBFbGVtZW50VHlwZSB0YXJnZXQpDQotCXsNCi0JCWlmKGFubm90YXRpb25Qcm9wZXJ0eSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYW5ub3RhdGlvblByb3BlcnR5IGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZih0YXJnZXQgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRhcmdldCBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJaWYoISh0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlRZUEUpKSAmJiAhKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuTUVUSE9EKSkgJiYgISh0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlBBUkFNRVRFUikpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRhcmdldCBwYXJhbWV0ZXIgaXMgbm90IG9mIGNvcnJlY3QgdHlwZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlNYXA8U3RyaW5nLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPj4gYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSBudWxsOw0KLQkJDQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlRZUEUpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gdHlwZUFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwOw0KLQkJfQ0KLQkJaWYodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5NRVRIT0QpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gbWV0aG9kQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXA7DQotCQl9DQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlBBUkFNRVRFUikpDQotCQl7DQotCQkJYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSBwYXJhbWV0ZXJBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcDsNCi0JCX0NCi0JCQ0KLQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlc1NldCA9IGFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwLmdldChhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlpZihwYXJhbVZhbHVlc1NldCA9PSBudWxsKQ0KLQkJew0KLQkJCXBhcmFtVmFsdWVzU2V0ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwLnB1dChhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QW5ub3RhdGlvbk5hbWUoKSwgcGFyYW1WYWx1ZXNTZXQpOw0KLQkJfQ0KLQ0KLQkJSVZhbHVlIHZhbHVlID0gbnVsbDsgDQotCQlpZihhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QXR0cmlidXRlVHlwZSgpID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlpZihhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QXR0cmlidXRlVHlwZSgpLmVxdWFscyhBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKSkNCi0JCXsNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZShuZXcgQm9vbGVhbihhbm5vdGF0aW9uUHJvcGVydHkuZ2V0VmFsdWUoKSkpOw0KLQkJfQ0KLQkJaWYoYW5ub3RhdGlvblByb3BlcnR5LmdldEF0dHJpYnV0ZVR5cGUoKS5lcXVhbHMoQXR0cmlidXRlVHlwZUVudW0uQ0xBU1MpKQ0KLQkJew0KLQkJCS8vVE9ETyBjaGFuZ2UgdGhpcyEhISEhIQ0KLQkJCS8vdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVDbGFzc1ZhbHVlKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSgpKTsNCi0JCX0NCi0JCWlmKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRBdHRyaWJ1dGVUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpKQ0KLQkJew0KLQkJCXZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlSW50ZWdlclZhbHVlKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSgpKTsNCi0JCX0NCi0JCWlmKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRBdHRyaWJ1dGVUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKSkNCi0JCXsNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShhbm5vdGF0aW9uUHJvcGVydHkuZ2V0VmFsdWUoKSk7DQotCQl9DQotCQlpZih2YWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoYW5ub3RhdGlvblByb3BlcnR5LmdldFZhbHVlKCkpOw0KLQkJfQ0KLQ0KLQkJSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QXR0cmlidXRlTmFtZSgpLCB2YWx1ZSk7DQotCQkNCi0JCXBhcmFtVmFsdWVzU2V0LmFkZChwYXJhbVZhbHVlUGFpcik7DQotCX0NCi0JLyoqDQotCSAqIEBwYXJhbSBJVHlwZVBhcmFtZXRlciANCi0JICogQHJldHVybiBTZXQgd2l0aCBhbGwgQW5ub3RhdGlvbiBmcm9tIHRoZSBjb250YWluZXIsIHdoaWNoIGFyZSBJVHlwZVBhcmFtZXRlciByZWxldmFudC4NCi0JICovDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBnZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyhJVHlwZVBhcmFtZXRlciB0UGFyYW0pDQotCXsNCi0JCXJldHVybiBnZXRBbm5vdGF0aW9ucyhFbGVtZW50VHlwZS5QQVJBTUVURVIsIHRQYXJhbSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gU2V0IHdpdGggYWxsIEFubm90YXRpb24gZnJvbSB0aGUgY29udGFpbmVyLCB3aGljaCBhcmUgSVR5cGUgcmVsZXZhbnQuDQotCSAqLw0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uPElUeXBlPj4gZ2V0VHlwZUFubm90YXRpb25zKElUeXBlIHR5cGUpDQotCXsNCi0JCXJldHVybiBnZXRBbm5vdGF0aW9ucyhFbGVtZW50VHlwZS5UWVBFLCB0eXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiBTZXQgd2l0aCBhbGwgQW5ub3RhdGlvbiBmcm9tIHRoZSBjb250YWluZXIsIHdoaWNoIGFyZSBJTWV0aG9kIHJlbGV2YW50Lg0KLQkgKi8NCi0JcHVibGljIFNldDxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gZ2V0TWV0aG9kQW5ub3RhdGlvbnMoSU1ldGhvZCBtZXRob2QpDQotCXsNCi0JCXJldHVybiBnZXRBbm5vdGF0aW9ucyhFbGVtZW50VHlwZS5NRVRIT0QgLCBtZXRob2QpOw0KLQl9DQotCQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGdldEFubm90YXRpb25zKGZpbmFsIEVsZW1lbnRUeXBlIHRhcmdldCwgZmluYWwgVCBpVGFyZ2V0KQ0KLQl7DQotCQlpZighKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuVFlQRSkpICYmICEodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5NRVRIT0QpKSAmJiAhKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuUEFSQU1FVEVSKSkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGFyZ2V0IHBhcmFtZXRlciBpcyBub3Qgb2YgY29ycmVjdCB0eXBlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCU1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PiBhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IG51bGw7DQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlRZUEUpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gdHlwZUFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwOw0KLQkJfQ0KLQkJaWYodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5NRVRIT0QpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gbWV0aG9kQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXA7DQotCQl9DQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlBBUkFNRVRFUikpDQotCQl7DQotCQkJYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSBwYXJhbWV0ZXJBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcDsNCi0JCX0NCi0JCVNldDxJQW5ub3RhdGlvbjxUPj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCQlTZXQ8U3RyaW5nPiBrZXlzID0gYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAua2V5U2V0KCk7DQotCQlmb3IgKFN0cmluZyBrZXkgOiBrZXlzKQ0KLQkJew0KLQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlyc1NldCA9IGFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwLmdldChrZXkpOw0KLQkJCUlBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKGtleSwgcGFyYW1WYWx1ZVBhaXJzU2V0LCBpVGFyZ2V0KTsNCi0JCQlyZXN1bHQuYWRkKGFubm90YXRpb24pOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4NTVhMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6ei5BU1RVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQuSmF4V3NVdGlsTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRWRpdFJlc291cmNlc01hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLklGaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsNCi0NCi0vKioNCi0gKiBDb250YWlucyB1dGlsaXRpZXMgZm9yIGdldHRpbmcgQVNUIG9iamVjdHMgbmVlZGVkIGluIGFubm90YXRpb24gcHJvY2Vzc2luZw0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVXRpbHMNCi17DQotCXByaXZhdGUgc3RhdGljIEFubm90YXRpb25VdGlscyB1dGlscyA9IG51bGw7DQotCXByaXZhdGUgZmluYWwgSUZpbGVVdGlscyBmaWxlVXRpbHMgPSBGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmYWN0b3J5IG1ldGhvZC4NCi0JICogDQotCSAqIEByZXR1cm4gYSBBbm5vdGF0aW9uVXRpbHMgaW5zdGFuY2UuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25VdGlscyBnZXRJbnN0YW5jZSgpDQotCXsNCi0JCWlmICh1dGlscyA9PSBudWxsKQ0KLQkJew0KLQkJCXV0aWxzID0gbmV3IEFubm90YXRpb25VdGlscygpOw0KLQkJfQ0KLQkJcmV0dXJuIHV0aWxzOw0KLQl9DQotCQ0KLQkvKioNCi0JICogR2V0cyBJRG9jdW1lbnQsIHdoaWNoIGNvcmVzcG9uZHMgdG8gb25lIENvbXBpbGF0aW9uVW5pdC4NCi0JICogDQotCSAqIEBwYXJhbSB1bml0IC0NCi0JICogICAgICAgICAgICBDb21waWxhdGlvbiBVbml0LCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgc3RhcnRpbmcgcG9pbnQgdG8gZ2V0IHRoZSBJRG9jdW1lbnQuDQotCSAqIA0KLQkgKiBAcmV0dXJuIElEb2N1bWVudCB3aGljaCBpcyBmb3VuZC4NCi0JICogDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudChJQ29tcGlsYXRpb25Vbml0IHVuaXQpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyBzb3VyY2UgPSB1bml0LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCk7IA0KLQkJcmV0dXJuIG5ldyBEb2N1bWVudChzb3VyY2UpOyANCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgQW5ub3RhdGlvbnMgb2Ygc3BlY2lmaWVkIElKYXZhRWxlbWVudC4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudCAtIElKYXZhRWxlbWVudCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgc3RhcnRpbmcgcG9pbiBmb3IgcmVtb3ZpbmcgdGhlIGFubm90YXRpb25zLg0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbnMgLSBTZXQgd2hpY2ggY29udGFpbnMgU3RyaW5nIHZhbHVlcyBmb3IgdGhlIGFubm90YXRpb25zIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZC4gSWYgdGhpcyBTZXQgaXMgZW1wdHkgYWxsIEFubm90YXRpb25zIHdpbGwgYmUgcmVtb3ZlZC4NCi0JICogQHBhcmFtIGRlZXBSZW1vdmUgLSBCb29sZWFuIHZhbHVlLCByZXByZXNlbnRpbmcgd2hldGhlciBBbm5vdGF0aW9ucyBmcm9tIGphdmFFbGVtZXQgY2hpbGRzIHdpbGwgYmUgcmVtb3ZlZC4gDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiANCi0JICogDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB0aG93biBpZiBBU1QgVHlwZURlY2xhcmF0aW9uIGNhbm5vdCBiZSBmb3VuZCBmb3IgPGNvZGU+dHlwZTwvY29kZT4gYW5kIGFsc28gaXMgdXNlZCBhcyB3cmFwcGVyIGluIGNhc2Uge0BsaW5rIENvcmVFeGNlcHRpb259IG9yDQotCSAqICAgICAgICAgICAgIHtAbGluayBCYWRMb2NhdGlvbkV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoaWxlIHByb2Nlc3NpbmcuDQotCSAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb25zKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMsIGJvb2xlYW4gZGVlcFJlbW92ZSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24NCi0Jew0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkNCi0JCXsNCi0JCQlJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50Ow0KLQkJCUlDb21waWxhdGlvblVuaXQgY1VuaXQgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjVW5pdCwgbnVsbCk7DQotDQotCQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCB1bml0KTsNCi0JCQlpZiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpDQotCQkJew0KLQkJCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbigidHlwZURlY2xhcmF0aW9uIHNob3VsZCBub3QgYmUgbnVsbCIsLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKYXhXc1V0aWxNZXNzYWdlcy5Bbm5vdGF0aW9uVXRpbHNfUGFyYW1TaG91bGROb3RCZU51bGxNc2csICJ0eXBlRGVjbGFyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQkJDQotCQkJcmVtb3ZlVHlwZUFubm90YXRpb25zKHR5cGUsIHR5cGVEZWNsYXJhdGlvbiwgdW5pdCwgY1VuaXQsIGFubm90YXRpb25zKTsNCi0NCi0JCQlpZighZGVlcFJlbW92ZSkNCi0JCQl7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJSUZpZWxkW10gdG1wRmllbGRzID0gdHlwZS5nZXRGaWVsZHMoKTsNCi0JCQlpZiAodG1wRmllbGRzICE9IG51bGwgJiYgdG1wRmllbGRzLmxlbmd0aCA+IDApDQotCQkJew0KLQkJCQlmb3IgKElGaWVsZCB0bXBGaWVsZCA6IHRtcEZpZWxkcykNCi0JCQkJew0KLQkJCQkJcmVtb3ZlRmllbGRBbm5vdGF0aW9ucyh0bXBGaWVsZCwgdHlwZSwgY1VuaXQsIGFubm90YXRpb25zKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlJTWV0aG9kW10gdG1wTWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOw0KLQkJCWlmICh0bXBNZXRob2RzICE9IG51bGwgJiYgdG1wTWV0aG9kcy5sZW5ndGggPiAwKQ0KLQkJCXsNCi0JCQkJZm9yIChJTWV0aG9kIHRtcE1ldGhvZCA6IHRtcE1ldGhvZHMpDQotCQkJCXsNCi0JCQkJCXJlbW92ZU1ldGhvZEFubm90YXRpb25zKHRtcE1ldGhvZCwgdHlwZSwgY1VuaXQsIGFubm90YXRpb25zKTsNCi0NCi0JCQkJCS8vUmVtb3ZlIHBhcmFtcyBhbm5vdGF0aW9ucw0KLQkJCQkJZm9yIChTdHJpbmcgcGFyYW1OYW1lIDogdG1wTWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCkpDQotCQkJCQl7DQotCQkJCQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IHRtcE1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHBhcmFtTmFtZSk7DQotCQkJCQkJcmVtb3ZlUGFyYW1Bbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLCB0eXBlLCBjVW5pdCwgYW5ub3RhdGlvbnMsIHBhcmFtTmFtZSk7CQkJDQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKQ0KLQkJew0KLQkJCUlGaWVsZCBmaWVsZCA9IChJRmllbGQpamF2YUVsZW1lbnQ7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IGZpZWxkLmdldERlY2xhcmluZ1R5cGUoKTsNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCA9IGRlY2xhcmluZ1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJDQotCQkJcmVtb3ZlRmllbGRBbm5vdGF0aW9ucyhmaWVsZCwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9ucyk7DQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkNCi0JCXsNCi0JCQlJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKWphdmFFbGVtZW50Ow0KLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQkJCUlDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0ID0gZGVjbGFyaW5nVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkNCi0JCQlyZW1vdmVNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QsIGRlY2xhcmluZ1R5cGUsIGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgYW5ub3RhdGlvbnMpOw0KLQkJCWlmKCFkZWVwUmVtb3ZlKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0NCi0JCQkvL1JlbW92ZSBwYXJhbXMgYW5ub3RhdGlvbnMNCi0JCQlmb3IgKFN0cmluZyBwYXJhbU5hbWU6IG1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpKQ0KLQkJCXsNCi0JCQkgIElUeXBlUGFyYW1ldGVyIHBhcmFtID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIocGFyYW1OYW1lKTsNCi0JCQkgIHJlbW92ZVBhcmFtQW5ub3RhdGlvbnMocGFyYW0sIGRlY2xhcmluZ1R5cGUsIGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgYW5ub3RhdGlvbnMsIHBhcmFtTmFtZSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKQ0KLQkJew0KLQkJCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSAoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQ7DQotCQkJSU1ldGhvZCB0bXBNZXRob2QgPSAoSU1ldGhvZCkgdHlwZVBhcmFtZXRlci5nZXREZWNsYXJpbmdNZW1iZXIoKTsNCi0JCQkvL1RPRE8gY2hlY2sgdGhpcw0KLQkJCS8vcGFyYW0uZ2V0UGFyZW50KCk7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IHRtcE1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQgPSBkZWNsYXJpbmdUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCS8vVE9ETyBGSVggVEhJUw0KLQkJCXJlbW92ZVBhcmFtQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlciwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9ucywgbnVsbCk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZW1vdmVUeXBlQW5ub3RhdGlvbnMoSVR5cGUgdHlwZSwgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBDb21waWxhdGlvblVuaXQgdW5pdCwgSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnNTZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJaWYgKHJlbW92ZUFubm90YXRpb25zKHR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMoKSwgYW5ub3RhdGlvbnNTZXQpKQ0KLQkJew0KLQkJCUlEb2N1bWVudCBkb2MgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXREb2N1bWVudChjVW5pdCk7DQotCQkJVGV4dEVkaXQgZWRpdCA9IHVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQlzYXZlQ29udGVudChjVW5pdCwgZG9jKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRmllbGRBbm5vdGF0aW9ucyhJRmllbGQgZmllbGQsIElUeXBlIGRlY2xhcmluZ1R5cGUsIElDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9uc1NldCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSUNvbXBpbGF0aW9uVW5pdCBmY1VuaXQgPSBmaWVsZC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQlDb21waWxhdGlvblVuaXQgZlVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmY1VuaXQsIG51bGwpOw0KLQ0KLQkJQm9keURlY2xhcmF0aW9uIGZCb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIGZVbml0KTsNCi0JCWZCb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldEZpZWxkRGVjbGFyYXRpb24oZmllbGQsIChUeXBlRGVjbGFyYXRpb24pIGZCb2R5RGVjbGFyYXRpb24pOw0KLQ0KLQkJZlVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJaWYgKHJlbW92ZUFubm90YXRpb25zKGZCb2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCksIGFubm90YXRpb25zU2V0KSkNCi0JCXsNCi0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0KTsNCi0JCQlUZXh0RWRpdCBlZGl0ID0gZlVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQlzYXZlQ29udGVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGRvYyk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1ldGhvZEFubm90YXRpb25zKElNZXRob2QgbWV0aG9kLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnNTZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlDb21waWxhdGlvblVuaXQgbWNVbml0ID0gbWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCBtVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG1jVW5pdCwgbnVsbCk7DQotDQotCQlCb2R5RGVjbGFyYXRpb24gbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgbVVuaXQpOw0KLQkJbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCAoVHlwZURlY2xhcmF0aW9uKSBtQm9keURlY2xhcmF0aW9uKTsNCi0JCW1Vbml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCWlmIChyZW1vdmVBbm5vdGF0aW9ucyhtQm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uc1NldCkpDQotCQl7DQotCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCk7DQotCQkJVGV4dEVkaXQgZWRpdCA9IG1Vbml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQkJc2F2ZUNvbnRlbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBkb2MpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVQYXJhbUFubm90YXRpb25zKElUeXBlUGFyYW1ldGVyIHBhcmFtLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnNTZXQsIFN0cmluZyBwYXJhbU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlNZXRob2QgdG1wTWV0aG9kID0gKElNZXRob2QpcGFyYW0uZ2V0RGVjbGFyaW5nTWVtYmVyKCk7DQotCQkvL1RPRE8gY2hlY2sgdGhpcw0KLQkJLy9wYXJhbS5nZXRQYXJlbnQoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQlJQ29tcGlsYXRpb25Vbml0IG1jVW5pdCA9IHRtcE1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCBtVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG1jVW5pdCwgbnVsbCk7DQotDQotCQlCb2R5RGVjbGFyYXRpb24gbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgbVVuaXQpOw0KLQkJbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24odG1wTWV0aG9kLCAoVHlwZURlY2xhcmF0aW9uKSBtQm9keURlY2xhcmF0aW9uKTsNCi0JCW1Vbml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0NCi0JCWZvciAoT2JqZWN0IG9iamVjdCA6ICgoTWV0aG9kRGVjbGFyYXRpb24pIG1Cb2R5RGVjbGFyYXRpb24pLnBhcmFtZXRlcnMoKSkNCi0JCXsNCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikNCi0JCQl7DQotCQkJICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHN2ZCA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBvYmplY3Q7DQotCQkJCWlmICgocGFyYW1OYW1lID09IG51bGwgfHwgc3ZkLmdldE5hbWUoKS50b1N0cmluZygpLmVxdWFscyhwYXJhbU5hbWUpKSAmJg0KLQkJCQkgICAgICAgIHJlbW92ZUFubm90YXRpb25zKHN2ZC5tb2RpZmllcnMoKSwgYW5ub3RhdGlvbnNTZXQpKQ0KLQkJCQl7DQotCQkJCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0KTsNCi0JCQkJCVRleHRFZGl0IGVkaXQgPSBtVW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQkJCQllZGl0LmFwcGx5KGRvYyk7DQotCQkJCQkNCi0JCQkJCXNhdmVDb250ZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgZG9jKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHNhdmVDb250ZW50KElDb21waWxhdGlvblVuaXQgY1VuaXQsIElEb2N1bWVudCBkb2MpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJU3RhdHVzIHN0YXR1cyA9IChuZXcgRWRpdFJlc291cmNlc01hbmFnZXIoKSkuc2V0RmlsZUVkaXRhYmxlKChJRmlsZSkgY1VuaXQuZ2V0UmVzb3VyY2UoKSk7DQotCQlpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LICkNCi0JCXsNCi0JCQlmaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoY1VuaXQsIGRvYy5nZXQoKSwgdHJ1ZSwgbnVsbCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oIkFubm90YXR0aW9uIGNvdWxkIG5vdCBiZSBzdG9yZWQsIHRoZSBmaWxlIGlzIG5vdCB3cml0YWJsZSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCUpheFdzVXRpbE1lc3NhZ2VzLkFubm90YXRpb25DYW5ub3RCZVN0b3JlZE1zZyk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIHNwZWNpZmljIEFubm90YXRpb24gb2Ygc3BlY2lmaWVkIElKYXZhRWxlbWVudC4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudCAtIElKYXZhRWxlbWVudCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgc3RhcnRpbmcgcG9pbiBmb3IgcmVtb3ZpbmcgdGhlIEFubm90YXRpb24uDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZSAtIFN0cmluZyB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24gTmFtZSBvZiB0aGUgQW5ub3RhdGlvbiwgd2hpY2ggd2lsbCBiZSByZW1vdmVkLg0KLQkgKiANCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgdGhvd24gaWYgQVNUIFR5cGVEZWNsYXJhdGlvbiBjYW5ub3QgYmUgZm91bmQgZm9yIDxjb2RlPnR5cGU8L2NvZGU+IGFuZCBhbHNvIGlzIHVzZWQgYXMgd3JhcHBlciBpbiBjYXNlIHtAbGluayBDb3JlRXhjZXB0aW9ufSBvcg0KLQkgKiAgICAgICAgICAgICB7QGxpbmsgQmFkTG9jYXRpb25FeGNlcHRpb259IGlzIHRocm93biB3aGlsZSBwcm9jZXNzaW5nLg0KLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbg0KLQl7DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKQ0KLQkJew0KLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQ7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGNVbml0LCBudWxsKTsNCi0NCi0JCQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIHVuaXQpOw0KLQkJCWlmICh0eXBlRGVjbGFyYXRpb24gPT0gbnVsbCkNCi0JCQl7DQotCQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKCJ0eXBlRGVjbGFyYXRpb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzVXRpbE1lc3NhZ2VzLkFubm90YXRpb25VdGlsc19QYXJhbVNob3VsZE5vdEJlTnVsbE1zZywgInR5cGVEZWNsYXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQkNCi0JCQlyZW1vdmVUeXBlQW5ub3RhdGlvbih0eXBlLCB0eXBlRGVjbGFyYXRpb24sIHVuaXQsIGNVbml0LCBhbm5vdGF0aW9uTmFtZSk7DQotDQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKQ0KLQkJew0KLQkJCUlGaWVsZCBmaWVsZCA9IChJRmllbGQpamF2YUVsZW1lbnQ7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IGZpZWxkLmdldERlY2xhcmluZ1R5cGUoKTsNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCA9IGRlY2xhcmluZ1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJDQotCQkJcmVtb3ZlRmllbGRBbm5vdGF0aW9uKGZpZWxkLCBkZWNsYXJpbmdUeXBlLCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGFubm90YXRpb25OYW1lKTsNCi0JCX0NCi0JCQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKQ0KLQkJew0KLQkJCUlNZXRob2QgbWV0aG9kID0gKElNZXRob2QpamF2YUVsZW1lbnQ7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQgPSBkZWNsYXJpbmdUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCQ0KLQkJCXJlbW92ZU1ldGhvZEFubm90YXRpb24obWV0aG9kLCBkZWNsYXJpbmdUeXBlLCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGFubm90YXRpb25OYW1lKTsNCi0JCX0NCi0JCQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikNCi0JCXsNCi0JCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50Ow0KLQkJCUlNZXRob2QgdG1wTWV0aG9kID0gKElNZXRob2QpIHR5cGVQYXJhbWV0ZXIuZ2V0RGVjbGFyaW5nTWVtYmVyKCk7DQotCQkJLy9UT0RPIGNoZWNrIHRoaXMNCi0JCQkvL3BhcmFtLmdldFBhcmVudCgpOw0KLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSB0bXBNZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQkJCUlDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0ID0gZGVjbGFyaW5nVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0NCi0JCQlyZW1vdmVQYXJhbUFubm90YXRpb24odHlwZVBhcmFtZXRlciwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9uTmFtZSk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZW1vdmVUeXBlQW5ub3RhdGlvbihJVHlwZSB0eXBlLCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIENvbXBpbGF0aW9uVW5pdCB1bml0LCBJQ29tcGlsYXRpb25Vbml0IGNVbml0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJaWYgKHJlbW92ZUFubm90YXRpb24odHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uTmFtZSkpDQotCQl7DQotCQkJSURvY3VtZW50IGRvYyA9IEFubm90YXRpb25VdGlscy5nZXRJbnN0YW5jZSgpLmdldERvY3VtZW50KGNVbml0KTsNCi0JCQlUZXh0RWRpdCBlZGl0ID0gdW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJCXNhdmVDb250ZW50KGNVbml0LCBkb2MpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVGaWVsZEFubm90YXRpb24oSUZpZWxkIGZpZWxkLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJQ29tcGlsYXRpb25Vbml0IGZjVW5pdCA9IGZpZWxkLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCBmVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGZjVW5pdCwgbnVsbCk7DQotDQotCQlCb2R5RGVjbGFyYXRpb24gZkJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgZlVuaXQpOw0KLQkJZkJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RmllbGREZWNsYXJhdGlvbihmaWVsZCwgKFR5cGVEZWNsYXJhdGlvbikgZkJvZHlEZWNsYXJhdGlvbik7DQotDQotCQlmVW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlpZiAocmVtb3ZlQW5ub3RhdGlvbihmQm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uTmFtZSkpDQotCQl7DQotCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCk7DQotCQkJVGV4dEVkaXQgZWRpdCA9IGZVbml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQkJc2F2ZUNvbnRlbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBkb2MpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVNZXRob2RBbm5vdGF0aW9uKElNZXRob2QgbWV0aG9kLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJQ29tcGlsYXRpb25Vbml0IG1jVW5pdCA9IG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQlDb21waWxhdGlvblVuaXQgbVVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChtY1VuaXQsIG51bGwpOw0KLQ0KLQkJQm9keURlY2xhcmF0aW9uIG1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIG1Vbml0KTsNCi0JCW1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCwgKFR5cGVEZWNsYXJhdGlvbikgbUJvZHlEZWNsYXJhdGlvbik7DQotCQltVW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlpZihyZW1vdmVBbm5vdGF0aW9uKG1Cb2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCksIGFubm90YXRpb25OYW1lKSkNCi0JCXsNCi0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0KTsNCi0JCQlUZXh0RWRpdCBlZGl0ID0gbVVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQlzYXZlQ29udGVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGRvYyk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVBhcmFtQW5ub3RhdGlvbihJVHlwZVBhcmFtZXRlciBwYXJhbSwgSVR5cGUgZGVjbGFyaW5nVHlwZSwgSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSU1ldGhvZCB0bXBNZXRob2QgPSAoSU1ldGhvZClwYXJhbS5nZXREZWNsYXJpbmdNZW1iZXIoKTsNCi0JCS8vVE9ETyBjaGVjayB0aGlzDQotCQkvL3BhcmFtLmdldFBhcmVudCgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUlDb21waWxhdGlvblVuaXQgbWNVbml0ID0gdG1wTWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJY2xhc3NOYW1lID0gdG1wTWV0aG9kLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7DQotCQlDb21waWxhdGlvblVuaXQgbVVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChtY1VuaXQsIG51bGwpOw0KLQ0KLQkJQm9keURlY2xhcmF0aW9uIG1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIG1Vbml0KTsNCi0JCW1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKHRtcE1ldGhvZCwgKFR5cGVEZWNsYXJhdGlvbikgbUJvZHlEZWNsYXJhdGlvbik7DQotDQotCQltVW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlmb3IgKE9iamVjdCBvYmplY3QgOiAoKE1ldGhvZERlY2xhcmF0aW9uKSBtQm9keURlY2xhcmF0aW9uKS5wYXJhbWV0ZXJzKCkpDQotCQl7DQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pDQotCQkJew0KLQkJCQlpZiAocmVtb3ZlQW5ub3RhdGlvbigoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIG9iamVjdCkubW9kaWZpZXJzKCksIGFubm90YXRpb25OYW1lKSkNCi0JCQkJew0KLQkJCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCk7DQotCQkJCQlUZXh0RWRpdCBlZGl0ID0gbVVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJCQkJc2F2ZUNvbnRlbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBkb2MpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZW1vdmVzIHNwZWNpZmljIGFubm90YXRpb24gZnJvbSB0aGUgbGlzdCBvZiBtb2RpZmllcnMuDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9kaWZpZXJzDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZQ0KLQkgKiANCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlLCB3aGljaCByZXByZXNlbnRzIHdoZXRlciB0aGUgYW5ub3RhdGlvbiBpcyByZW1vdmVkIG9yIG5vdC4NCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbihMaXN0IG1vZGlmaWVycywgU3RyaW5nIGFubm90YXRpb25OYW1lKQ0KLQl7DQotCQlBbm5vdGF0aW9uW10gbUFubm90YXRpb25zID0gZXh0cmFjdEFubm90YXRpb25zKG1vZGlmaWVycyk7DQotCQlmb3IgKEFubm90YXRpb24gbUFubm90YXRpb24gOiBtQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJaWYodmFsaWRhdGVBbm5vdGF0YXRpb24obUFubm90YXRpb24sIGFubm90YXRpb25OYW1lKSkNCi0JCQl7DQotCQkJCW1vZGlmaWVycy5yZW1vdmUobUFubm90YXRpb24pOw0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBib29sZWFuIHJlbW92ZUFubm90YXRpb25zKExpc3QgbW9kaWZpZXJzLCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9uc1NldCkNCi0Jew0KLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7DQotCQlBbm5vdGF0aW9uW10gbUFubm90YXRpb25zID0gZXh0cmFjdEFubm90YXRpb25zKG1vZGlmaWVycyk7DQotCQlmb3IgKGludCBtYWkgPSAwOyBtYWkgPCBtQW5ub3RhdGlvbnMubGVuZ3RoOyBtYWkrKykNCi0JCXsNCi0JCQlpZiAoYW5ub3RhdGlvbnNTZXQgIT0gbnVsbCkNCi0JCQl7DQotCQkJCWlmIChhbm5vdGF0aW9uc1NldC5jb250YWlucyhtQW5ub3RhdGlvbnNbbWFpXS5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJbW9kaWZpZXJzLnJlbW92ZShtQW5ub3RhdGlvbnNbbWFpXSk7DQotCQkJCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCQkJfQ0KLQkJCX0gZWxzZQ0KLQkJCXsNCi0JCQkJbW9kaWZpZXJzLnJlbW92ZShtQW5ub3RhdGlvbnNbbWFpXSk7DQotCQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBjaGFuZ2VkOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIEFubm90YXRpb25bXSBleHRyYWN0QW5ub3RhdGlvbnMoTGlzdCBtb2RpZmllcnMpDQotCXsNCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kaWZpZXJzLml0ZXJhdG9yKCk7DQotCQlTZXQ8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnNTZXQgPSBuZXcgSGFzaFNldDxBbm5vdGF0aW9uPigpOw0KLQ0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJRXh0ZW5kZWRNb2RpZmllciBtb2RpZiA9IChJRXh0ZW5kZWRNb2RpZmllcikgaXRlcmF0b3IubmV4dCgpOw0KLQkJCWlmIChtb2RpZi5pc0Fubm90YXRpb24oKSkNCi0JCQl7DQotCQkJCWFubm90YXRpb25zU2V0LmFkZCgoQW5ub3RhdGlvbikgbW9kaWYpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBhbm5vdGF0aW9uc1NldC50b0FycmF5KG5ldyBBbm5vdGF0aW9uW2Fubm90YXRpb25zU2V0LnNpemUoKV0pOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUFubm90YXRhdGlvbihBbm5vdGF0aW9uIG1Bbm5vdGF0aW9uLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpDQotCXsNCi0JCVN0cmluZyBtQW5ub3RhdGlvblN0cmluZyA9IG1Bbm5vdGF0aW9uLnRvU3RyaW5nKCk7DQotCQlpbnQgaW5kZXggPSBtQW5ub3RhdGlvblN0cmluZy5pbmRleE9mKCIoIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmKGluZGV4ID09IC0xKQ0KLQkJew0KLQkJCW1Bbm5vdGF0aW9uU3RyaW5nID0gbUFubm90YXRpb25TdHJpbmcudHJpbSgpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCW1Bbm5vdGF0aW9uU3RyaW5nID0gbUFubm90YXRpb25TdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KS50cmltKCk7DQotCQl9DQotCQkNCi0JCWlmKG1Bbm5vdGF0aW9uU3RyaW5nLmVuZHNXaXRoKGFubm90YXRpb25OYW1lKSkNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCSANCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQXJyYXlWYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9BcnJheVZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMzE4NjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9BcnJheVZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBJQXJyYXlWYWx1ZX0NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQXJyYXlWYWx1ZUltcGwgZXh0ZW5kcyBWYWx1ZUltcGwNCi17DQotCXByaXZhdGUgU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0aW9uDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWVzDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaW4gY2FzZSA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKi8NCi0JcHVibGljIEFycmF5VmFsdWVJbXBsKFNldDxJVmFsdWU+IHZhbHVlcykNCi0Jew0KLQkJaWYgKHZhbHVlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFsdWVzIHNob3VsZCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQl0aGlzLnZhbHVlcyA9IHZhbHVlczsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotCXsNCi0JCVN0cmluZyByZXN1bHQgPSAiWyI7IC8vJE5PTi1OTFMtMSQNCi0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOw0KLQkJZm9yIChJVmFsdWUgdmFsdWUgOiB2YWx1ZXMpDQotCQl7DQotCQkJaWYoZmlyc3QpDQotCQkJew0KLQkJCQlyZXN1bHQgPSByZXN1bHQgKyB2YWx1ZS50b1N0cmluZygpOw0KLQkJCQlmaXJzdCA9IGZhbHNlOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQlyZXN1bHQgPSByZXN1bHQgKyAiLCAiICsgdmFsdWUudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JCXJlc3VsdCA9IHJlc3VsdCArICJdIjsgLy8kTk9OLU5MUy0xJA0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLQl7DQotCQkvL1RPRE8gY2hlY2sgdGhpcyBtZXRob2QNCi0JCUFycmF5SW5pdGlhbGl6ZXIgYXJyID0gYXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsNCi0JCWZvciAoSVZhbHVlIHZhbHVlIDogdmFsdWVzKQ0KLQkJew0KLQkJCWFyci5leHByZXNzaW9ucygpLmFkZCgoKFZhbHVlSW1wbCkgdmFsdWUpLmdldEV4cHJlc3Npb24odW5pdCwgYXN0KSk7DQotCQl9DQotDQotCQlyZXR1cm4gYXJyOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIEFycmF5cy5oYXNoQ29kZSh2YWx1ZXMudG9BcnJheShuZXcgSVZhbHVlW3ZhbHVlcy5zaXplKCldKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgQXJyYXlWYWx1ZUltcGwgb3RoZXIgPSAoQXJyYXlWYWx1ZUltcGwpIG9iajsNCi0JCXJldHVybiBBcnJheXMuZXF1YWxzKHZhbHVlcy50b0FycmF5KG5ldyBJVmFsdWVbdmFsdWVzLnNpemUoKV0pLCBvdGhlci52YWx1ZXMudG9BcnJheShuZXcgSVZhbHVlW3ZhbHVlcy5zaXplKCldKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0F0dHJpYnV0ZVR5cGVFbnVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQXR0cmlidXRlVHlwZUVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTBiYTYwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQXR0cmlidXRlVHlwZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotcHVibGljIGVudW0gQXR0cmlidXRlVHlwZUVudW0gDQotew0KLQlCT09MRUFOKCJCb29sZWFuIiksIC8vJE5PTi1OTFMtMSQNCi0JQ0xBU1MoIkNsYXNzIiksIC8vJE5PTi1OTFMtMSQNCi0JSU5URUdFUigiSW50ZWdlciIpLCAvLyROT04tTkxTLTEkDQotCVFVQUxJRklFRF9OQU1FKCJRdWFsaWZpZWQgTmFtZSIpLCAvLyROT04tTkxTLTEkDQotCVNUUklORygiU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQNCi0JDQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOw0KLSAgICANCi0gICAgQXR0cmlidXRlVHlwZUVudW0oZmluYWwgU3RyaW5nIHZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgZmluYWwgU3RyaW5nIGdldFZhbHVlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Jvb2xlYW5WYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Cb29sZWFuVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1ZmUxZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Jvb2xlYW5WYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgSUJvb2xlYW5WYWx1ZX0NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQm9vbGVhblZhbHVlSW1wbCBleHRlbmRzIFZhbHVlSW1wbA0KLXsgLy8kSkwtRVFVQUxTJA0KLQlwcml2YXRlIGJvb2xlYW4gdmFsdWU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgQm9vbGVhblZhbHVlSW1wbChib29sZWFuIHZhbHVlKQ0KLQl7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QpDQotCXsNCi0JCXJldHVybiBhc3QubmV3Qm9vbGVhbkxpdGVyYWwodmFsdWUpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotCXsNCi0JCXJldHVybiBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgQm9vbGVhblZhbHVlSW1wbCBvdGhlciA9IChCb29sZWFuVmFsdWVJbXBsKSBvYmo7DQotCQlyZXR1cm4gdmFsdWUgPT0gb3RoZXIudmFsdWU7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0NsYXNzVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQ2xhc3NWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRjZWE1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQ2xhc3NWYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsNCi0NCi1wdWJsaWMgY2xhc3MgQ2xhc3NWYWx1ZUltcGwgZXh0ZW5kcyBWYWx1ZUltcGwgDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc1FOYW1lOw0KLQ0KLSAgICBwdWJsaWMgQ2xhc3NWYWx1ZUltcGwoU3RyaW5nIGNsYXNzUU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY2xhc3NRTmFtZSA9IGNsYXNzUU5hbWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGNsc05hbWUgPSB0aGlzLmNsYXNzUU5hbWU7DQotICAgICAgICBpZiAoYWRkSW1wb3J0cyhhc3QsIHVuaXQsIGNsc05hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNsc05hbWUgPSBnZXRTaW1wbGVOYW1lKGNsc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgTmFtZSBuYW1lID0gYXN0Lm5ld05hbWUoY2xzTmFtZSk7DQotICAgICAgICBTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSBhc3QubmV3U2ltcGxlVHlwZShuYW1lKTsNCi0gICAgICAgIFR5cGVMaXRlcmFsIGxpdGVyYWwgPSBhc3QubmV3VHlwZUxpdGVyYWwoKTsNCi0gICAgICAgIGxpdGVyYWwuc2V0VHlwZShzaW1wbGVUeXBlKTsNCi0gICAgICAgIHJldHVybiBsaXRlcmFsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuY2xhc3NRTmFtZTsNCi0JfQ0KLSAgICANCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5jbGFzc1FOYW1lLmhhc2hDb2RlKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgQ2xhc3NWYWx1ZUltcGwgb3RoZXIgPSAoQ2xhc3NWYWx1ZUltcGwpIG9iajsNCi0JCXJldHVybiB0aGlzLmNsYXNzUU5hbWUuZXF1YWxzKG90aGVyLmNsYXNzUU5hbWUpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9JbnRlZ2VyVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvSW50ZWdlclZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYWZmZTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9JbnRlZ2VyVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7DQotDQotLyoqDQotICogSW1wbGVtZW50b3IgZm9yIElJbnRlZ2VyVmFsdWUNCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSW50ZWdlclZhbHVlSW1wbCBleHRlbmRzIFZhbHVlSW1wbA0KLXsNCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgSW50ZWdlclZhbHVlSW1wbChTdHJpbmcgdmFsdWUpDQotCXsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0Jew0KLQkJTnVtYmVyTGl0ZXJhbCBsaXRlcmFsID0gYXN0Lm5ld051bWJlckxpdGVyYWwoKTsNCi0gICAgICAgIGxpdGVyYWwuc2V0VG9rZW4obmV3IEludGVnZXIodmFsdWUpLnRvU3RyaW5nKCkpOw0KLQkJcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEludGVnZXIodmFsdWUpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIEludGVnZXJWYWx1ZUltcGwgb3RoZXIgPSAoSW50ZWdlclZhbHVlSW1wbCkgb2JqOw0KLQkJcmV0dXJuIHZhbHVlID09IG90aGVyLnZhbHVlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotCXsNCi0JCXJldHVybiB2YWx1ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvTG9jYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Mb2NhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWU4NTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Mb2NhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudG9yIG9mIHtAbGluayBJTG9jYXRvcn0gaW50ZXJmYWNlDQotICovDQotcHVibGljIGNsYXNzIExvY2F0b3JJbXBsIGltcGxlbWVudHMgSUxvY2F0b3INCi17DQotCXByaXZhdGUgaW50IGxpbmVOdW1iZXI7DQotCXByaXZhdGUgaW50IHN0YXJ0UG9zaXRpb247DQotCXByaXZhdGUgaW50IGxlbmd0aDsNCi0JDQotCXB1YmxpYyBMb2NhdG9ySW1wbChmaW5hbCBpbnQgbGluZU51bWJlciwgZmluYWwgaW50IHN0YXJ0UG9zaXRpb24sIGZpbmFsIGludCBsZW5ndGgpDQotCXsNCi0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOw0KLQkJdGhpcy5zdGFydFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbjsNCi0JCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7DQotCX0NCi0JDQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMubGVuZ3RoOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRQb3NpdGlvbigpDQotCXsNCi0JCXJldHVybiB0aGlzLnN0YXJ0UG9zaXRpb247DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgDQotCXsNCi0JCXJldHVybiBsaW5lTnVtYmVyOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9QYXJhbVZhbHVlUGFpckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9QYXJhbVZhbHVlUGFpckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWNlMzFkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvUGFyYW1WYWx1ZVBhaXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotLyoqDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotDQotcHVibGljIGNsYXNzIFBhcmFtVmFsdWVQYWlySW1wbCBpbXBsZW1lbnRzIElQYXJhbVZhbHVlUGFpcg0KLXsNCi0JDQotCXByaXZhdGUgSUxvY2F0b3IgbG9jYXRvciA9IG51bGw7DQotDQotDQotCXByaXZhdGUgU3RyaW5nIHBhcmFtOw0KLQ0KLQlwcml2YXRlIElWYWx1ZSB2YWx1ZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogQHBhcmFtIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgUGFyYW1WYWx1ZVBhaXJJbXBsKFN0cmluZyBwYXJhbSwgSVZhbHVlIHZhbHVlKQ0KLQl7DQotCQl0aGlzLnBhcmFtID0gcGFyYW07DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbSgpDQotCXsNCi0JCXJldHVybiBwYXJhbTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVZhbHVlIGdldFZhbHVlKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJaWYodmFsdWUgIT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gMzEgKiBwYXJhbS5oYXNoQ29kZSgpICsgdmFsdWUuaGFzaENvZGUoKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlyZXR1cm4gMzEgKiBwYXJhbS5oYXNoQ29kZSgpOw0KLQkJfQ0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIFBhcmFtVmFsdWVQYWlySW1wbCBvdGhlciA9IChQYXJhbVZhbHVlUGFpckltcGwpIG9iajsNCi0JCWlmICghcGFyYW0uZXF1YWxzKG90aGVyLnBhcmFtKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlyZXR1cm4gdmFsdWUuZXF1YWxzKG90aGVyLnZhbHVlKTsNCi0JfQ0KLQkNCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5sb2NhdG9yOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldExvY2F0b3IoZmluYWwgSUxvY2F0b3IgbG9jYXRvcikNCi0Jew0KLQkJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1F1YWxpZmllZE5hbWVWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWJiNjZjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotDQotLyoqDQotICogSW1wbGVtZW50b3IgZm9yIHtAbGluayBJUXVhbGlmaWVkTmFtZVZhbHVlfQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBRdWFsaWZpZWROYW1lVmFsdWVJbXBsIGV4dGVuZHMgVmFsdWVJbXBsDQotew0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICovDQotCXB1YmxpYyBRdWFsaWZpZWROYW1lVmFsdWVJbXBsKFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLQl7DQotCQkvLyAiamF2YXguZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5SRVFVSVJFRCINCi0JCWludCBpID0gdmFsdWUubGFzdEluZGV4T2YoJy4nKTsNCi0JCWlmIChpICE9IC0xKQ0KLQkJew0KLQkJCVN0cmluZyBjbHNOYW1lID0gdmFsdWUuc3Vic3RyaW5nKDAsIGkpOw0KLQkJCWlmIChhZGRJbXBvcnRzKGFzdCwgdW5pdCwgY2xzTmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gYXN0Lm5ld05hbWUoZ2V0U2ltcGxlTmFtZShjbHNOYW1lKSArIHZhbHVlLnN1YnN0cmluZyhpKSk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGFzdC5uZXdOYW1lKHZhbHVlKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCBoYXNoQ29kZSgpDQotCXsNCi0JCXJldHVybiB2YWx1ZS5oYXNoQ29kZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIFF1YWxpZmllZE5hbWVWYWx1ZUltcGwgb3RoZXIgPSAoUXVhbGlmaWVkTmFtZVZhbHVlSW1wbCkgb2JqOw0KLQkJcmV0dXJuIHZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9TdHJpbmdWYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9TdHJpbmdWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNThiZDFiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvU3RyaW5nVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7DQotDQotLyoqDQotICogSW1wbGVtZW50b3IgZm9yIElTdHJpbmdWYWx1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTdHJpbmdWYWx1ZUltcGwgZXh0ZW5kcyBWYWx1ZUltcGwNCi17DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZ1ZhbHVlSW1wbChTdHJpbmcgdmFsdWUpDQotCXsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0Jew0KLQkJU3RyaW5nTGl0ZXJhbCBsaXRlcmFsID0gYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsNCi0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKHZhbHVlKTsNCi0JCXJldHVybiBsaXRlcmFsOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlLmhhc2hDb2RlKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgU3RyaW5nVmFsdWVJbXBsIG90aGVyID0gKFN0cmluZ1ZhbHVlSW1wbCkgb2JqOw0KLQkJcmV0dXJuIHZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9WYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9WYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODhjNTcxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbXBvcnREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWROYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWx1ZUltcGwgaW1wbGVtZW50cyBJVmFsdWUNCi17DQotCXByaXZhdGUgSUxvY2F0b3IgbG9jYXRvciA9IG51bGw7DQotDQotCXByb3RlY3RlZCBhYnN0cmFjdCBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QpOw0KLQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByb3RlY3RlZCBib29sZWFuIGFkZEltcG9ydHMoQVNUIGFzdCwgQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkNCi0Jew0KLQkJU3RyaW5nIHBhY2thZ2VBbm5vdGF0aW9uTmFtZSA9IGdldFBhY2thZ2VOYW1lKGFubm90YXRpb25OYW1lKTsNCi0JCWlmIChwYWNrYWdlQW5ub3RhdGlvbk5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAocGFja2FnZUFubm90YXRpb25OYW1lLmVxdWFscygiamF2YS5sYW5nIikpIC8vJE5PTi1OTFMtMSQNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmICh1bml0ICE9IG51bGwpDQotCQl7DQotCQkJSW1wb3J0RGVjbGFyYXRpb24gaW1wID0gYXN0Lm5ld0ltcG9ydERlY2xhcmF0aW9uKCk7DQotCQkJaW1wLnNldE5hbWUoYXN0Lm5ld05hbWUoYW5ub3RhdGlvbk5hbWUpKTsNCi0JCQlMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzID0gdW5pdC5pbXBvcnRzKCk7DQotCQkJU3RyaW5nIGltcDEgPSBnZXRJbXBvcnQoaW1wb3J0cywgZ2V0U2ltcGxlTmFtZShhbm5vdGF0aW9uTmFtZSkpOw0KLQkJCWlmIChpbXAxID09IG51bGwpDQotCQkJew0KLQkJCQlpZiAoZ2V0T25EZW1hbmRJbXBvcnQoaW1wb3J0cywgcGFja2FnZUFubm90YXRpb25OYW1lKSA9PSBudWxsKQ0KLQkJCQl7DQotCQkJCQlpbXBvcnRzLmFkZChpbXApOw0KLQkJCQl9DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQlpZiAoIWltcDEuZXF1YWxzKGFubm90YXRpb25OYW1lKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEltcG9ydChMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzLCBTdHJpbmcgaW1wKQ0KLQl7DQotCQlJdGVyYXRvcjxJbXBvcnREZWNsYXJhdGlvbj4gaXRlciA9IGltcG9ydHMuaXRlcmF0b3IoKTsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJbXBvcnREZWNsYXJhdGlvbiBuZXh0ID0gaXRlci5uZXh0KCk7DQotCQkJTmFtZSBmcU5hbWUgPSBuZXh0LmdldE5hbWUoKTsNCi0JCQlTaW1wbGVOYW1lIG5hbWU7DQotCQkJaWYgKGZxTmFtZS5pc1F1YWxpZmllZE5hbWUoKSkNCi0JCQl7DQotCQkJCW5hbWUgPSAoKFF1YWxpZmllZE5hbWUpIGZxTmFtZSkuZ2V0TmFtZSgpOw0KLQkJCX0gZWxzZQ0KLQkJCXsNCi0JCQkJbmFtZSA9IChTaW1wbGVOYW1lKSBmcU5hbWU7DQotCQkJfQ0KLQkJCVN0cmluZyBzaW1wbGVOYW1lID0gbmFtZS5nZXRJZGVudGlmaWVyKCk7DQotCQkJaWYgKGltcC5lcXVhbHMoc2ltcGxlTmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gZnFOYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE9uRGVtYW5kSW1wb3J0KExpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHMsIFN0cmluZyBpbXApDQotCXsNCi0JCUl0ZXJhdG9yPEltcG9ydERlY2xhcmF0aW9uPiBpdGVyID0gaW1wb3J0cy5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUltcG9ydERlY2xhcmF0aW9uIG5leHQgPSBpdGVyLm5leHQoKTsNCi0JCQlpZiAoIW5leHQuaXNPbkRlbWFuZCgpKQ0KLQkJCXsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCU5hbWUgZnFOYW1lID0gbmV4dC5nZXROYW1lKCk7DQotCQkJU3RyaW5nIG5hbWUgPSBmcU5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotCQkJaWYgKGltcC5lcXVhbHMobmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gbmFtZTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgbmFtZSkNCi0Jew0KLQkJaW50IGkgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7DQotCQlpZiAoaSA9PSAtMSkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBpKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKFN0cmluZyBuYW1lKQ0KLQl7DQotCQlpbnQgaSA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsNCi0JCWlmIChpID09IC0xKQ0KLQkJCXJldHVybiBuYW1lOw0KLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGkgKyAxKTsNCi0JfQ0KLQkNCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5sb2NhdG9yOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldExvY2F0b3IoZmluYWwgSUxvY2F0b3IgbG9jYXRvcikNCi0Jew0KLQkJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3BsdWdpbi9KYXh3c1V0aWxzUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3BsdWdpbi9KYXh3c1V0aWxzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0ZDNmYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9wbHVnaW4vSmF4d3NVdGlsc1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwucGx1Z2luOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIEpheHdzVXRpbHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gaW1wbGVtZW50cyBJU3RhcnR1cA0KLXsNCi0JLy8gVGhlIHBsdWctaW4gSUQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscyI7DQotDQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JcHJpdmF0ZSBzdGF0aWMgSmF4d3NVdGlsc1BsdWdpbiBwbHVnaW47DQotCQ0KLQkvKioNCi0JICogVGhlIGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgSmF4d3NVdGlsc1BsdWdpbigpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7DQotCQlwbHVnaW4gPSB0aGlzOw0KLQkJDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXBsdWdpbiA9IG51bGw7DQotCQlzdXBlci5zdG9wKGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICoNCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEpheHdzVXRpbHNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsNCi0JCXJldHVybiBwbHVnaW47DQotCX0NCi0NCi0JcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkNCi0Jew0KLQkJLy8gTm90aGluZyB0byBkby4gSG93ZXZlciwgdGhpcyBwdWdpbiBoYXMgdG8gc3RhcnQgYXMgZWFybHkgYXMgcG9zc2libGUgc2luY2UgaXRzIHNlcnZpY2VzIHdpbGwgYmUgdXNlZCBmb3IgY29tbW9uIGxvZ2dpbmcNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3RleHQvSmF4V3NVdGlsTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvdGV4dC9KYXhXc1V0aWxNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDRkMzY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvdGV4dC9KYXhXc1V0aWxNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgSmF4V3NVdGlsTWVzc2FnZXMgZXh0ZW5kcyBOTFMNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYW5ub3RQZXJmb3JtRWRpdE1zZzsNCi0NCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcFVuaXRNaXNzaW5nTXNnOw0KLQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkVHJlZVN0YXRlTXNnOw0KLQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uQ2Fubm90QmVTdG9yZWRNc2c7DQotDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25VdGlsc19QYXJhbVNob3VsZE5vdEJlTnVsbE1zZzsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdFJlc291cmNlc01hbmFnZXJfRklMRV9DT05URU5UU19DSEFOR0VfRkFJTEVEX01TRzsNCi0JDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RNYW5hZ2VtZW50VXRpbHNfUHJvamVjdEhhc05vTWV0YUluZkZvbGRlck1zZzsNCi0JDQotCXN0YXRpYw0KLQl7DQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKYXhXc1V0aWxNZXNzYWdlcy5jbGFzcyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC90ZXh0L0pheFdzVXRpbE1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3RleHQvSmF4V3NVdGlsTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmRjZmVjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3RleHQvSmF4V3NVdGlsTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1DYW5ub3RQZXJmb3JtRWRpdE1zZwkJCQkJCQkJCQkJCT0gRWRpdCBjYW5ub3QgYmUgcGVyZm9ybWVkDQotQ29tcFVuaXRNaXNzaW5nTXNnCQkJCQkJCQkJCQkJCT0gQ29tcGlsYXRpb24gdW5pdCBmaWxlIG1pc3NpbmcNCi1JbnZhbGlkVHJlZVN0YXRlTXNnCQkJCQkJCQkJCQkJCT0gSW52YWxpZCBwcm9qZWN0IHRyZWUgc3RhdGUNCi1Bbm5vdGF0aW9uQ2Fubm90QmVTdG9yZWRNc2cJCQkJCQkJCQkJCT0gQW5ub3RhdGlvbiBjb3VsZCBub3QgYmUgc3RvcmVkLCB0aGUgZmlsZSBpcyBub3Qgd3JpdGFibGUNCi1Bbm5vdGF0aW9uVXRpbHNfUGFyYW1TaG91bGROb3RCZU51bGxNc2cJCQkJCQkJCT0gezB9IHNob3VsZCBub3QgYmUgbnVsbA0KLQ0KLUVkaXRSZXNvdXJjZXNNYW5hZ2VyX0ZJTEVfQ09OVEVOVFNfQ0hBTkdFX0ZBSUxFRF9NU0cJCQkJPSBGaWxlIGNvbnRlbnRzIGNvdWxkIG5vdCBiZSBzZXQNCi1Qcm9qZWN0TWFuYWdlbWVudFV0aWxzX1Byb2plY3RIYXNOb01ldGFJbmZGb2xkZXJNc2cJCQkJCT0gcHJvamVjdCB7MH0gZG9lcyBub3QgaGF2ZSBhIE1FVEEtSU5GIGZvbGRlcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvbG9nZ2luZy9JTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2xvZ2dpbmcvSUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlN2Y5MmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvbG9nZ2luZy9JTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSUxvZ2dlcg0KLXsNCi0JLyoqDQotCSAqIExvZ3MgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkgZXJyb3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgbWVzc2FnZSk7DQotDQotCS8qKg0KLQkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5IGVycm9yLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGJlIGxvZ2dlZA0KLQkgKiBAcGFyYW0gY2F1c2UNCi0JICogICAgICAgICAgICBjYXVzaW5nIGV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSk7DQotDQotCS8qKg0KLQkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5IHdhcm5pbmcuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBsb2dXYXJuKGZpbmFsIFN0cmluZyBtZXNzYWdlKTsNCi0NCi0JLyoqDQotCSAqIExvZ3MgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkgd2FybmluZy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBiZSBsb2dnZWQNCi0JICogQHBhcmFtIGNhdXNlDQotCSAqICAgICAgICAgICAgY2F1c2luZyBleGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIGxvZ1dhcm4oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSk7DQotDQotCS8qKg0KLQkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5IGRlYnVnLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGJlIGxvZ2dlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgbG9nRGVidWcoZmluYWwgU3RyaW5nIG1lc3NhZ2UpOw0KLQ0KLQkvKioNCi0JICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSBkZWJ1Zy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBiZSBsb2dnZWQNCi0JICogQHBhcmFtIGNhdXNlDQotCSAqICAgICAgICAgICAgY2F1c2luZyBleGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIGxvZ0RlYnVnKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpOw0KLQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2xvZ2dpbmcvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2xvZ2dpbmcvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmYWQzMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9sb2dnaW5nL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklMb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5TdGF0dXNVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnBsdWdpbi5KYXh3c1V0aWxzUGx1Z2luOw0KLQ0KLXB1YmxpYyBjbGFzcyBMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyDQotew0KLQlwdWJsaWMgdm9pZCBsb2dEZWJ1ZyhTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLS8vCQlsb2coKS5sb2coU3RhdHVzVXRpbHMuc3RhdHVzSW5mbyhtZXNzYWdlKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbG9nRGVidWcoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkNCi0Jew0KLS8vCQlsb2coKS5sb2coU3RhdHVzVXRpbHMuc3RhdHVzSW5mbyhtZXNzYWdlLCBjYXVzZSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlsb2coKS5sb2coU3RhdHVzVXRpbHMuc3RhdHVzRXJyb3IobWVzc2FnZSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCWxvZygpLmxvZyhTdGF0dXNVdGlscy5zdGF0dXNFcnJvcihtZXNzYWdlLCBjYXVzZSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvZ1dhcm4oU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCWxvZygpLmxvZyhTdGF0dXNVdGlscy5zdGF0dXNXYXJuaW5nKG1lc3NhZ2UpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBsb2dXYXJuKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCWxvZygpLmxvZyhTdGF0dXNVdGlscy5zdGF0dXNXYXJuaW5nKG1lc3NhZ2UsIGNhdXNlKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJTG9nIGxvZygpDQotCXsNCi0JCXJldHVybiBKYXh3c1V0aWxzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlYnVnKCkNCi0Jew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0VkaXRSZXNvdXJjZXNNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9FZGl0UmVzb3VyY2VzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjM5OGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0VkaXRSZXNvdXJjZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLlN0YXR1c1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB3aGljaCBpcyBtZWFudCB0byBwcm92aWRlIGNvbW1vbiBmdW5jdGlvbmFsaXR5IHRvIHNhdmUgYW5kIG1vZGlmeSByZXNvdXJjZXMuIEl0IGlzIGEgd3JhcHBlciBvZiB0aGUgZWNsaXBzZSBBUEkgYW5kDQotICogd29ya2Fyb3VuZHMgc29tZSBEVFIgaXNzdWVzLiBVbnRpbCBEVFIgY29sbGVhZ3VlcyBmaXggdGhlaXIgY29kaW5nLCB0aGlzIG1hbmFnZXIgbXVzdCBiZSB1c2VkIG9uIGVhY2ggZmlsZSBtb2RpZmljYXRpb24gb2NjYXNpb24NCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFZGl0UmVzb3VyY2VzTWFuYWdlcg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUxvZ2dlciBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7DQotCQ0KLQkvKioNCi0JICogU2V0cyBlZGl0YWJpbGl0eSBvZiBhIGZpbGUuIEluIGNhc2UgdGhlIGZpbGUgc3BlY2lmaWVkIGlzIGFscmVhZHkgd3JpdGFibGUsIDxjb2RlPlN0YXR1cy5PS19TVEFUVVM8L2NvZGU+IGlzIHJldHVybmVkDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZQ0KLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIHRvIGJlIHNldCBlZGl0YWJsZQ0KLQkgKiBAcGFyYW0gY29udGV4dA0KLQkgKiAgICAgICAgICAgIGVpdGhlciB7QGxpbmsgSVdvcmtzcGFjZSNWQUxJREFURV9QUk9NUFR9LCBvciB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw8L2NvZGU+IHRoYXQgaXMgdG8gYmUgdXNlZCB0byBwYXJlbnQgYW55DQotCSAqICAgICAgICAgICAgZGlhbG9ncyB3aXRoIHRoZSB1c2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBVSSBjb250ZXh0IChkZWNsYXJlZCBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIGF2b2lkIGFueSBkaXJlY3QNCi0JICogICAgICAgICAgICByZWZlcmVuY2VzIG9uIHRoZSBTV1QgY29tcG9uZW50KQ0KLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgc3BlY2lmaWVkIGlzIG51bGwNCi0JICogQHNlZSBJV29ya3NwYWNlI1ZBTElEQVRFX1BST01QVA0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgc2V0RmlsZUVkaXRhYmxlKElGaWxlIGZpbGUsIE9iamVjdCBjb250ZXh0KQ0KLQl7DQotCQlpZiAoZmlsZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmlsZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighZmlsZS5pc1JlYWRPbmx5KCkpDQotCQl7DQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQl9DQotCQkNCi0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gZmlsZS5nZXRXb3Jrc3BhY2UoKTsNCi0JCXJldHVybiB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtdIHsgZmlsZSB9LCBjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyBlZGl0YWJsaWxpdHkgb2YgYSBmaWxlLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGVxdWl2YWxlbnQgdG8gaW52b2tpbmcNCi0JICogPGNvZGU+c2V0RmlsZUVkaXRhYmxlKGZpbGUsIElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUKTwvY29kZT4NCi0JICogDQotCSAqIEBwYXJhbSBmaWxlDQotCSAqICAgICAgICAgICAgVGhlIGZpbGUgdG8gYmUgc2V0IGVkaXRhYmxlDQotCSAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgaXMgbnVsbA0KLQkgKiBAc2VlIEVkaXRSZXNvdXJjZXNNYW5hZ2VyI3NldEZpbGVFZGl0YWJsZShJRmlsZSwgT2JqZWN0KQ0KLQkgKiBAc2VlIElXb3Jrc3BhY2UjVkFMSURBVEVfUFJPTVBUDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgc2V0RmlsZUVkaXRhYmxlKElGaWxlIGZpbGUpDQotCXsNCi0JCXJldHVybiBzZXRGaWxlRWRpdGFibGUoZmlsZSwgSVdvcmtzcGFjZS5WQUxJREFURV9QUk9NUFQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIGVkaXRhYmxpbGl0eSBvZiBhbiBhcnJheSBvZiBmaWxlcy4gSW4gY2FzZSBhbGwgZmlsZXMgc3BlY2lmaWVkIGFyZSBhbHJlYWR5IHdyaXRhYmxlLCA8Y29kZT5TdGF0dXMuT0tfU1RBVFVTPC9jb2RlPiBpcyByZXR1cm5lZA0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVzDQotCSAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIGZpbGVzIHRvIGJlIHNldCBlZGl0YWJsZQ0KLQkgKiBAcGFyYW0gY29udGV4dA0KLQkgKiAgICAgICAgICAgIGVpdGhlciB7QGxpbmsgSVdvcmtzcGFjZSNWQUxJREFURV9QUk9NUFR9LCBvciB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw8L2NvZGU+IHRoYXQgaXMgdG8gYmUgdXNlZCB0byBwYXJlbnQgYW55DQotCSAqICAgICAgICAgICAgZGlhbG9ncyB3aXRoIHRoZSB1c2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBVSSBjb250ZXh0IChkZWNsYXJlZCBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIGF2b2lkIGFueSBkaXJlY3QNCi0JICogICAgICAgICAgICByZWZlcmVuY2VzIG9uIHRoZSBTV1QgY29tcG9uZW50KQ0KLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBhcnJheSBpcyBlbXB0eSBvciBudWxsDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBzZXRGaWxlc0VkaXRhYmxlKElGaWxlW10gZmlsZXMsIE9iamVjdCBjb250ZXh0KQ0KLQl7DQotCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcnJheSBtdXN0IG5vdCBiZSBlbXB0eSBub3IgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlMaXN0PElGaWxlPiByb0ZpbGVzID0gbmV3IEFycmF5TGlzdDxJRmlsZT4oKTsNCi0JCWZvcihJRmlsZSBmIDogZmlsZXMpDQotCQl7DQotCQkJaWYoZi5pc1JlYWRPbmx5KCkpDQotCQkJew0KLQkJCQlyb0ZpbGVzLmFkZChmKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmKHJvRmlsZXMuc2l6ZSgpID09IDApDQotCQl7DQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQl9DQotDQotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IHJvRmlsZXMuZ2V0KDApLmdldFdvcmtzcGFjZSgpOw0KLQkJcmV0dXJuIHdvcmtzcGFjZS52YWxpZGF0ZUVkaXQocm9GaWxlcy50b0FycmF5KG5ldyBJRmlsZVtyb0ZpbGVzLnNpemUoKV0pLCBjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyBlZGl0YWJsaWxpdHkgb2YgYW4gYXJyYXkgb2YgZmlsZXMuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZXF1aXZhbGVudCB0byBpbnZva2luZw0KLQkgKiA8Y29kZT5zZXRGaWxlc0VkaXRhYmxlKGZpbGVzLCBJV29ya3NwYWNlLlZBTElEQVRFX1BST01QVCk8L2NvZGU+IA0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVzDQotCSAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIGZpbGVzIHRvIGJlIHNldCBlZGl0YWJsZQ0KLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBhcnJheSBpcyBlbXB0eSBvciBudWxsDQotCSAqIEBzZWUgRWRpdFJlc291cmNlc01hbmFnZXIjc2V0RmlsZXNFZGl0YWJsZShJRmlsZVtdLCBPYmplY3QpDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBzZXRGaWxlc0VkaXRhYmxlKElGaWxlW10gZmlsZXMpDQotCXsNCi0JCXJldHVybiBzZXRGaWxlc0VkaXRhYmxlKGZpbGVzLCBJV29ya3NwYWNlLlZBTElEQVRFX1BST01QVCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZQ0KLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHNldA0KLQkgKiBAcGFyYW0gY29udGVudA0KLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHRvIGJlIHNldA0KLQkgKiBAcGFyYW0gdXBkYXRlRmxhZ3MNCi0JICogICAgICAgICAgICB1cGRhdGUgZmxhZ3MuDQotCSAqIEBzZWUgSUZpbGUjc2V0Q29udGVudHMoamF2YS5pby5JbnB1dFN0cmVhbSwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yDQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcyByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQNCi0JICogQHJldHVybiBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+ZmlsZTwvY29kZT4gb3IgPGNvZGU+Y29udGVudDwvY29kZT4gaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgc2V0RmlsZUNvbnRlbnRzKElGaWxlIGZpbGUsIFN0cmluZyBjb250ZW50LCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKQ0KLQl7DQotCQlpZiAoZmlsZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmlsZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZiAoY29udGVudCA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY29udGVudCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlJU3RhdHVzIGVkaXRTdGF0dXMgPSBzZXRGaWxlRWRpdGFibGUoZmlsZSk7DQotCQlpZiAoZWRpdFN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0spDQotCQl7DQotCQkJLy8gc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgdmFsaWRhdGVFZGl0IG9wZXJhdGlvbg0KLQkJCXJldHVybiBlZGl0U3RhdHVzOw0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJZmlsZS5zZXRDb250ZW50cyhuZXcgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKGNvbnRlbnQpLCB1cGRhdGVGbGFncywgcHJvZ3Jlc3NNb25pdG9yKTsNCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCXJldHVybiBTdGF0dXNVdGlscy5zdGF0dXNFcnJvcihKYXhXc1V0aWxNZXNzYWdlcy5FZGl0UmVzb3VyY2VzTWFuYWdlcl9GSUxFX0NPTlRFTlRTX0NIQU5HRV9GQUlMRURfTVNHLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29udGVudCBvZiBhIGZpbGUuIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgb2YgaW52b2tpbmcNCi0JICogPGNvZGU+c2V0RmlsZUNvbnRlbnMoSUZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnQsIChrZWVwSGlzdG9yeSA/IElGaWxlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5OT05FKSB8IChmb3JjZSA/IElGaWxlLkZPUkNFIDogSVJlc291cmNlLk5PTkUpLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpPC9jb2RlPg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGUNCi0JICogICAgICAgICAgICB0aGUgZmlsZSB0byBiZSBzZXQNCi0JICogQHBhcmFtIGNvbnRlbnQNCi0JICogICAgICAgICAgICB0aGUgY29udGVudCB0byBiZSBzZXQNCi0JICogQHBhcmFtIGZvcmNlDQotCSAqICAgICAgICAgICAgYSBmbGFnIGNvbnRyb2xsaW5nIGhvdyB0byBkZWFsIHdpdGggcmVzb3VyY2VzIHRoYXQgYXJlIG5vdCBpbiBzeW5jIHdpdGggdGhlIGxvY2FsIGZpbGUgc3lzdGVtDQotCSAqIEBwYXJhbSBrZWVwSGlzdG9yeQ0KLQkgKiAgICAgICAgICAgIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHN0b3JlIHRoZSBjdXJyZW50IGNvbnRlbnRzIGluIHRoZSBsb2NhbCBoaXN0b3J5DQotCSAqIEBwYXJhbSBtb25pdG9yDQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcyByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQNCi0JICogQHJldHVybiBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+ZmlsZTwvY29kZT4gb3IgPGNvZGU+Y29udGVudDwvY29kZT4gaXMgbnVsbA0KLQkgKiBAc2VlIEVkaXRSZXNvdXJjZXNNYW5hZ2VyI3NldEZpbGVDb250ZW50cyhJRmlsZSwgU3RyaW5nLCBpbnQsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBzZXRGaWxlQ29udGVudHMoSUZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4ga2VlcEhpc3RvcnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0Jew0KLQkJcmV0dXJuIHNldEZpbGVDb250ZW50cyhmaWxlLCBjb250ZW50LCAoKGtlZXBIaXN0b3J5ID8gSUZpbGUuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLk5PTkUpIHwgKGZvcmNlID8gSUZpbGUuRk9SQ0UgOiBJUmVzb3VyY2UuTk9ORSkpLCBtb25pdG9yKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9GaWxlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0ZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZGRiM2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0ZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gZm9yIGZpbGUgdXRpbGl0aWVzIGludGVyZmFjZQ0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICogDQotICovDQotcHVibGljIGNsYXNzIEZpbGVVdGlscyBpbXBsZW1lbnRzIElGaWxlVXRpbHMgew0KLQlwcml2YXRlIHN0YXRpYyBJRmlsZVV0aWxzIHV0aWxzID0gbnVsbDsNCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4ID0gMDsNCi0NCi0JcHVibGljIEZpbGVVdGlscygpIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhlIGZhY3RvcnkgbWV0aG9kDQotCSAqIA0KLQkgKiBAcmV0dXJuIGEgRmlsZVV0aWxzIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElGaWxlVXRpbHMgZ2V0SW5zdGFuY2UoKSB7DQotCQlpZiAodXRpbHMgPT0gbnVsbCkgew0KLQkJCXV0aWxzID0gbmV3IEZpbGVVdGlscygpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHV0aWxzOw0KLQl9DQotDQotCXB1YmxpYyBmaW5hbCBMaXN0PElFZGl0b3JQYXJ0PiBnZXRFZGl0b3JzQnlGaWxlTG9jYXRpb24oDQotCQkJZmluYWwgU3RyaW5nIGZpbGVMb2NhdGlvbikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlMaXN0PElDb21waWxhdGlvblVuaXQ+IHVuaXRzID0gZ2V0Q29tcGlsYXRpb25Vbml0cyhmaWxlTG9jYXRpb24pOw0KLQkJU2V0PElFZGl0b3JQYXJ0PiBlZGl0b3JzID0gbmV3IEhhc2hTZXQ8SUVkaXRvclBhcnQ+KCk7DQotCQlmb3IgKElDb21waWxhdGlvblVuaXQgY3UgOiB1bml0cykgew0KLQkJCWZpbmFsIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2NyID0gZ2V0RWRpdG9yRGVzY3JpcHRvcihjdQ0KLQkJCQkJLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCWVkaXRvcnMuYWRkQWxsKGdldEVkaXRvcnNCeUNvbXBpbGF0aW9uVW5pdChlZGl0b3JEZXNjciwNCi0JCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFBhZ2UoKSwgY3UpKTsNCi0NCi0JCX0NCi0NCi0JCXJldHVybiBBcnJheXMuYXNMaXN0KGVkaXRvcnMudG9BcnJheShuZXcgSUVkaXRvclBhcnRbZWRpdG9ycy5zaXplKCldKSk7DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIExpc3Q8SUNvbXBpbGF0aW9uVW5pdD4gZ2V0Q29tcGlsYXRpb25Vbml0cygNCi0JCQlmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsNCi0JCWlmIChmaWxlTG9jYXRpb24gPT0gbnVsbCkgew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmlsZUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCUlGaWxlW10gZmlsZXNGb3VuZCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkNCi0JCQkJLmZpbmRGaWxlc0ZvckxvY2F0aW9uVVJJKG5ldyBGaWxlKGZpbGVMb2NhdGlvbikudG9VUkkoKSk7DQotCQlpZiAoZmlsZXNGb3VuZCA9PSBudWxsIHx8IGZpbGVzRm91bmQubGVuZ3RoID09IDApIHsNCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJGaWxlOiAiICsgZmlsZUxvY2F0aW9uICsgIiBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0NCi0JCUxpc3Q8SUNvbXBpbGF0aW9uVW5pdD4gdW5pdHMgPSBuZXcgQXJyYXlMaXN0PElDb21waWxhdGlvblVuaXQ+KCk7DQotDQotCQlmb3IgKElGaWxlIGZpbGUgOiBmaWxlc0ZvdW5kKSB7DQotCQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKGZpbGUpOw0KLQkJCWlmICghKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkpIHsNCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRmlsZTogIiArIGZpbGVMb2NhdGlvbiArICIgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQl9DQotDQotCQkJdW5pdHMuYWRkKChJQ29tcGlsYXRpb25Vbml0KSBqYXZhRWxlbWVudCk7DQotCQl9DQotDQotCQlyZXR1cm4gdW5pdHM7DQotCX0NCi0JCQkNCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3RVbml0KFN0cmluZyBmaWxlTG9jYXRpb24pDQotCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQkNCi0JCWlmIChmaWxlTG9jYXRpb24gPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZpbGVMb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVMb2NhdGlvbikpOw0KLQkJaWYgKGZpbGUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJGaWxlOiAiICsgZmlsZUxvY2F0aW9uICsgIiBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0NCi0JCXJldHVybiBmaWxlLmdldFByb2plY3QoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ZpbGVEaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKGZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pDQotCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gaXNGaWxlRGlzcGxheWVkSW5EaXJ0eUVkaXRvcihnZXRFZGl0b3JzQnlGaWxlTG9jYXRpb24oZmlsZUxvY2F0aW9uKSk7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCkgew0KLQkJcmV0dXJuIGlzRmlsZURpc3BsYXllZEluRGlydHlFZGl0b3IoZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KHVuaXQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzYXZlRWRpdG9yKFN0cmluZyBmaWxlTG9jYXRpb24pDQotCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlzYXZlRWRpdG9yKGZpbGVMb2NhdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2F2ZUVkaXRvcihmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uLA0KLQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlMaXN0PElFZGl0b3JQYXJ0PiBlZGl0b3JzID0gZ2V0RWRpdG9yc0J5RmlsZUxvY2F0aW9uKGZpbGVMb2NhdGlvbik7DQotCQlpZiAoZWRpdG9ycy5zaXplKCkgPT0gMCkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBmaWxlIGlzIG5vdCBkaXNwbGF5ZWQgYnkgYW4gZWRpdG9yIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXNhdmVFZGl0b3JzKGVkaXRvcnMsIG1vbml0b3IpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNhdmVFZGl0b3IoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSwNCi0JCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCUxpc3Q8SUVkaXRvclBhcnQ+IGVkaXRvcnMgPSBnZXRFZGl0b3JzQnlDb21waWxhdGlvblVuaXQoY3UpOw0KLQkJaWYgKGVkaXRvcnMuc2l6ZSgpID09IDApIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgZmlsZSBpcyBub3QgZGlzcGxheWVkIGJ5IGFuIGVkaXRvciIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlzYXZlRWRpdG9ycyhlZGl0b3JzLCBtb25pdG9yKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzYXZlRWRpdG9yKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCUxpc3Q8SUVkaXRvclBhcnQ+IGVkaXRvcnMgPSBnZXRFZGl0b3JzQnlDb21waWxhdGlvblVuaXQoY3UpOw0KLQkJaWYgKGVkaXRvcnMuc2l6ZSgpID09IDApIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgZmlsZSBpcyBub3QgZGlzcGxheWVkIGJ5IGFuIGVkaXRvciIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlzYXZlRWRpdG9ycyhlZGl0b3JzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgc2F2ZUVkaXRvcnMoZmluYWwgTGlzdDxJRWRpdG9yUGFydD4gZWRpdG9ycywNCi0JCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCWZvciAoSUVkaXRvclBhcnQgZSA6IGVkaXRvcnMpIHsNCi0JCQlpZiAoZS5pc0RpcnR5KCkpIHsNCi0JCQkJZS5kb1NhdmUobW9uaXRvcik7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiBnZXREaXJ0eUVkaXRvcnMoKSB7DQotCQlmaW5hbCBTZXQ8SUVkaXRvcklucHV0PiBpbnB1dHMgPSBuZXcgSGFzaFNldDxJRWRpdG9ySW5wdXQ+KCk7DQotCQlmaW5hbCBDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JQYXJ0PigpOw0KLQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOw0KLQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7DQotCQkJZmluYWwgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IHdpbmRvd3NbaV0uZ2V0UGFnZXMoKTsNCi0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhZ2VzLmxlbmd0aDsgeCsrKSB7DQotCQkJCWZpbmFsIElFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IHBhZ2VzW3hdLmdldERpcnR5RWRpdG9ycygpOw0KLQkJCQlmb3IgKGludCB6ID0gMDsgeiA8IGVkaXRvcnMubGVuZ3RoOyB6KyspIHsNCi0JCQkJCWZpbmFsIElFZGl0b3JQYXJ0IGVwID0gZWRpdG9yc1t6XTsNCi0JCQkJCWZpbmFsIElFZGl0b3JJbnB1dCBpbnB1dCA9IGVwLmdldEVkaXRvcklucHV0KCk7DQotCQkJCQlpZiAoIWlucHV0cy5jb250YWlucyhpbnB1dCkpIHsNCi0JCQkJCQlpbnB1dHMuYWRkKGlucHV0KTsNCi0JCQkJCQlyZXN1bHQuYWRkKGVwKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBJRWRpdG9yRGVzY3JpcHRvciBnZXRFZGl0b3JEZXNjcmlwdG9yKFN0cmluZyBmaWxlTmFtZSkgew0KLQkJSUVkaXRvclJlZ2lzdHJ5IGVkaXRvclJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQ0KLQkJCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsNCi0JCXJldHVybiBlZGl0b3JSZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGVOYW1lKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29udmVydHMgYSBTdHJpbmcgdG8gYSBVUkwsIGFzc3VtaW5nICdmaWxlOicgYXMgYSBkZWZhdWx0IHNjaGVtZS4NCi0JICogDQotCSAqIEBwYXJhbSBiYXNlDQotCSAqIEBwYXJhbSBwYXRoDQotCSAqIA0KLQkgKiBAcmV0dXJuDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uLA0KLQkgKiAgICAgICAgICAgICBpZiB0aGUgU3RyaW5nIGlzIG5laXRoZXIgYSB2YWxpZCBVUkwsIG5vciBhIHZhbGlkIGZpbGVuYW1lLg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBmaW5hbCBVUkwgZmlsZU9yVVJMVG9VUkwoZmluYWwgVVJMIGJhc2UsIGZpbmFsIFN0cmluZyBwYXRoKQ0KLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlpZiAocGF0aCA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXRoIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCVN0cmluZyBsb2NhbFBhdGggPSBwYXRoOw0KLQkJVVJMIGxvY2FsQmFzZSA9IGJhc2U7DQotDQotCQlpZiAobG9jYWxCYXNlID09IG51bGwpIHsNCi0JCQlsb2NhbEJhc2UgPSBuZXcgVVJMKCJmaWxlOiIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWxvY2FsUGF0aCA9IGxvY2FsUGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7DQotCQl0cnkgew0KLQkJCVN0cmluZyBwcm90b2NvbCA9IGxvY2FsQmFzZS5nZXRQcm90b2NvbCgpOw0KLQkJCWlmICghImh0dHAiLmVxdWFscyhwcm90b2NvbCkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJJiYgISJodHRwcyIuZXF1YWxzKHByb3RvY29sKSAvLyROT04tTkxTLTEkDQotCQkJCQkmJiAobG9jYWxQYXRoLmNoYXJBdCgxKSA9PSAnOicNCi0JCQkJCQkJfHwgbG9jYWxQYXRoLmNoYXJBdCgwKSA9PSAnLycgfHwgbG9jYWxQYXRoDQotCQkJCQkJCS5jaGFyQXQoMCkgPT0gJ1xcJykpIHsNCi0JCQkJbG9jYWxQYXRoID0gKG5ldyBGaWxlKGxvY2FsUGF0aCkpLnRvVVJJKCkudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLQkJCS8vICRKTC1FWEMkDQotCQl9DQotDQotCQlpZiAobG9jYWxQYXRoLnN0YXJ0c1dpdGgoImZpbGU6IikgJiYgbG9jYWxQYXRoLmxlbmd0aCgpID4gNSAvLyROT04tTkxTLTEkDQotCQkJCSYmIGxvY2FsUGF0aC5jaGFyQXQoNSkgIT0gJy8nKSB7DQotCQkJbG9jYWxQYXRoID0gImZpbGU6LyIuY29uY2F0KGxvY2FsUGF0aC5zdWJzdHJpbmcoNSkpOyAvLyROT04tTkxTLTEkDQotCQl9IGVsc2Ugew0KLQkJCWlmIChsb2NhbFBhdGguc3RhcnRzV2l0aCgiZmlsZTovLyIpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCSYmICFsb2NhbFBhdGguc3RhcnRzV2l0aCgiZmlsZTovLy8vIikgLy8kTk9OLU5MUy0xJA0KLQkJCQkJJiYgIWxvY2FsUGF0aC5zdGFydHNXaXRoKCJmaWxlOi8vbG9jYWxob3N0LyIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJbG9jYWxQYXRoID0gImZpbGU6Ly8vLyIuY29uY2F0KGxvY2FsUGF0aC5zdWJzdHJpbmcoImZpbGU6Ly8iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCQkJCS5sZW5ndGgoKSkpOw0KLQkJCX0NCi0JCX0NCi0JCVVSTCB1cmwgPSBuZXcgVVJMKGxvY2FsQmFzZSwgbG9jYWxQYXRoKTsNCi0JCXJldHVybiB1cmw7DQotCX0NCi0NCi0JcHVibGljIEZpbGUgY3JlYXRlVGVtcERpcmVjdG9yeSgpIHsNCi0JCVN0cmluZyB0ZW1wRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOyAvLyROT04tTkxTLTEkDQotCQlpbmRleCsrOw0KLQkJRmlsZSB0ZW1wMSA9IG5ldyBGaWxlKHRlbXBEaXIsIEludGVnZXIudG9TdHJpbmcodGhpcy5oYXNoQ29kZSgpKSArICJfIiAvLyROT04tTkxTLTEkDQotCQkJCSsgaW5kZXgpOw0KLQkJdGVtcDEubWtkaXIoKTsNCi0JCXJldHVybiB0ZW1wMTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoZmluYWwgRmlsZSBkaXJlY3RvcnkpIHsNCi0JCWlmIChkaXJlY3RvcnkgPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCWlmICghZGlyZWN0b3J5LmV4aXN0cygpKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJZm9yIChGaWxlIGYgOiBkaXJlY3RvcnkubGlzdEZpbGVzKCkpIHsNCi0JCQlmLmRlbGV0ZSgpOw0KLQkJfQ0KLQkJZGlyZWN0b3J5LmRlbGV0ZSgpOw0KLQl9DQotDQotCXB1YmxpYyBJRmlsZVtdIGdldEZpbGVzQnlFeHRlbnNpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGV4dGVuc2lvbikNCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZXh0ZW5zaW9uLCAiZXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQNCi0JCUFycmF5TGlzdDxJRmlsZT4gZm91bmRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7DQotDQotCQlnZXRGaWxlc0J5RXh0ZW5zaW9uKGZvdW5kRmlsZXMsIHByb2plY3QubWVtYmVycygpLCBleHRlbnNpb24pOw0KLQ0KLQkJcmV0dXJuIGZvdW5kRmlsZXMudG9BcnJheShuZXcgSUZpbGVbZm91bmRGaWxlcy5zaXplKCldKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgZ2V0RmlsZXNCeUV4dGVuc2lvbihBcnJheUxpc3Q8SUZpbGU+IGZvdW5kRmlsZXMsDQotCQkJSVJlc291cmNlW10gY3VycmVudFJlc291cmNlcywgU3RyaW5nIGV4dGVuc2lvbikNCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgY3VycmVudFJlc291cmNlcy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAoY3VycmVudFJlc291cmNlc1tpaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsNCi0JCQkJZ2V0RmlsZXNCeUV4dGVuc2lvbihmb3VuZEZpbGVzLA0KLQkJCQkJCSgoSUZvbGRlcikgY3VycmVudFJlc291cmNlc1tpaV0pLm1lbWJlcnMoKSwgZXh0ZW5zaW9uKTsNCi0JCQl9IGVsc2UgaWYgKGN1cnJlbnRSZXNvdXJjZXNbaWldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRQ0KLQkJCQkJJiYgZXh0ZW5zaW9uDQotCQkJCQkJCS5lcXVhbHMoY3VycmVudFJlc291cmNlc1tpaV0uZ2V0RmlsZUV4dGVuc2lvbigpKSkgew0KLQkJCQlmb3VuZEZpbGVzLmFkZCgoSUZpbGUpIGN1cnJlbnRSZXNvdXJjZXNbaWldKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIElGaWxlIGdldEZpbGVGb3JMb2NhdGlvbihJUGF0aCBsb2NhdGlvbikgew0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKA0KLQkJCQlsb2NhdGlvbik7DQotCX0NCi0NCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVXb3JrYmVuY2hQYWdlKCkgew0KLQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkNCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgTGlzdDxJRWRpdG9yUGFydD4gZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShjdSwgImN1Iik7IC8vJE5PTi1OTFMtMSQNCi0JCWZpbmFsIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2NyID0gZ2V0RWRpdG9yRGVzY3JpcHRvcihjdQ0KLQkJCQkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlmaW5hbCBJV29ya2JlbmNoUGFnZSB3YlBhZ2UgPSBnZXRBY3RpdmVXb3JrYmVuY2hQYWdlKCk7DQotCQlpZiAod2JQYWdlID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oMCk7DQotCQl9DQotDQotCQlyZXR1cm4gZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KGVkaXRvckRlc2NyLCB3YlBhZ2UsIGN1KTsNCi0JfQ0KLQ0KLQlwcml2YXRlIExpc3Q8SUVkaXRvclBhcnQ+IGdldEVkaXRvcnNCeUNvbXBpbGF0aW9uVW5pdCgNCi0JCQlmaW5hbCBJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3JEZXNjcmlwdG9yLA0KLQkJCWZpbmFsIElXb3JrYmVuY2hQYWdlIHBhZ2UsIGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCUxpc3Q8SUVkaXRvclBhcnQ+IGVkaXRvclBhcnRSZXR1cm5lZCA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclBhcnQ+KCk7DQotDQotCQlpZiAoZWRpdG9yRGVzY3JpcHRvciAhPSBudWxsICYmIHBhZ2UgIT0gbnVsbCkgew0KLQkJCWZvciAoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWZlcmVjZSA6IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpKSB7DQotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBlZGl0b3JSZWZlcmVjZS5nZXRFZGl0b3IodHJ1ZSk7DQotCQkJCWlmIChpc0VkaXRvckFwcGxpY2FibGVGb3JDdShlZGl0b3JQYXJ0LCBjdSkpIHsNCi0JCQkJCWVkaXRvclBhcnRSZXR1cm5lZC5hZGQoZWRpdG9yUGFydCk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZWRpdG9yUGFydFJldHVybmVkOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBpc0VkaXRvckFwcGxpY2FibGVGb3JDdShmaW5hbCBJRWRpdG9yUGFydCBlZGl0b3IsDQotCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgew0KLQkJaWYgKGVkaXRvciA9PSBudWxsKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJaWYgKCEoZWRpdG9yLmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQ0KLQkJCQl8fCAhKGN1LmdldFJlc291cmNlKCkgaW5zdGFuY2VvZiBJRmlsZSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlmaW5hbCBJRmlsZSBjdUZpbGUgPSAoSUZpbGUpIGN1LmdldFJlc291cmNlKCk7DQotCQlmaW5hbCBJRmlsZUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcg0KLQkJCQkuZ2V0RWRpdG9ySW5wdXQoKTsNCi0NCi0JCXJldHVybiBjdUZpbGUuZXF1YWxzKGVkaXRvcklucHV0LmdldEZpbGUoKSk7DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaWxlRGlzcGxheWVkSW5EaXJ0eUVkaXRvcigNCi0JCQlmaW5hbCBMaXN0PElFZGl0b3JQYXJ0PiBkaXNwbGF5aW5nRWRpdG9ycykgew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGRpc3BsYXlpbmdFZGl0b3JzLCAiZGlzcGxheWluZ0VkaXRvcnMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJZm9yIChJRWRpdG9yUGFydCBlZGl0b3IgOiBkaXNwbGF5aW5nRWRpdG9ycykgew0KLQkJCWlmIChlZGl0b3IuaXNEaXJ0eSgpKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVhZHMgZmlsZSBjb250ZW50IGFzIHRleHQgYW5kIHJldHVybnMge0BsaW5rIFN0cmluZ30NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VGaWxlDQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgZmlsZQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVDb250ZW50KGZpbmFsIEZpbGUgc291cmNlRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWZpbmFsIEZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihzb3VyY2VGaWxlKTsNCi0JCWZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQotDQotCQl0cnkgew0KLQkJCWZpbmFsIGNoYXJbXSBidWZmID0gbmV3IGNoYXJbMTAyNF07DQotCQkJZm9yIChpbnQgY250ID0gMDsgKGNudCA9IGZyLnJlYWQoYnVmZikpID4gLTE7KSB7DQotCQkJCWJ1aWxkZXIuYXBwZW5kKGJ1ZmYsIDAsIGNudCk7DQotCQkJfQ0KLQkJfSBmaW5hbGx5IHsNCi0JCQlmci5jbG9zZSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRDb21waWxhdGlvblVuaXRDb250ZW50KGZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCwNCi0JCQlmaW5hbCBTdHJpbmcgY29udGVudCwgZmluYWwgYm9vbGVhbiBmb3JjZSwNCi0JCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHVuaXQsICJ1bml0Iik7IC8vJE5PTi1OTFMtMSQNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShjb250ZW50LCAiY29udGVudCIpOyAvLyROT04tTkxTLTEkDQotDQotCQl1bml0LmJlY29tZVdvcmtpbmdDb3B5KG1vbml0b3IpOw0KLQkJdHJ5IHsNCi0JCQl1bml0LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKGNvbnRlbnQpOw0KLQkJCXVuaXQuY29tbWl0V29ya2luZ0NvcHkoZm9yY2UsIG1vbml0b3IpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQl1bml0LmRpc2NhcmRXb3JraW5nQ29weSgpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldENvbXBpbGF0aW9uVW5pdENvbnRlbnRBbmRTYXZlRGlydHlFZGl0b3JzKA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCwgZmluYWwgU3RyaW5nIGNvbnRlbnQsDQotCQkJZmluYWwgYm9vbGVhbiBmb3JjZSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudCh1bml0LCBjb250ZW50LCBmb3JjZSwgbW9uaXRvcik7DQotCQlpZiAoaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKHVuaXQpKSB7DQotCQkJc2F2ZUVkaXRvcih1bml0KTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9JRmlsZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9JRmlsZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmZGZhMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvSUZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSB0aGF0IGRlZmluZXMgY29tbW9uIHV0aWxpZXMgZm9yIGZpbGUgbWFuaXB1bGF0aW9uDQotICogDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlVXRpbHMgew0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIHRoZSBlZGl0b3JzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5aW5nIHRoZSBmaWxlIHNwZWNmaWVkLg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVMb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUNCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkNCi0JICogQHJldHVybiBDdXJyZW50IG9wZW5lZCBlZGl0b3JzIG9mIHRoZSBmaWxlIHNwZWNpZmllZCBvciBhbiBlbXB0eSBsaXN0IGlmIHN1Y2ggYXJlIG5vdCBvcGVuZWQNCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IExpc3Q8SUVkaXRvclBhcnQ+IGdldEVkaXRvcnNCeUZpbGVMb2NhdGlvbigNCi0JCQlmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmaWxlIHNwZWNpZmllZCBpcyBkaXNwbGF5ZWQgd2l0aGluIGFuIGVkaXRvciB3aGljaA0KLQkgKiBoYXMgYSBkaXJ0eSBzdGF0ZS4NCi0JICogDQotCSAqIEBwYXJhbSBmaWxlTG9jYXRpb24NCi0JICogICAgICAgICAgICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlDQotCSAqIEBzZWUgSVJlc291cmNlI2dldExvY2F0aW9uKCkudG9PU1N0cmluZygpDQotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBpcyBkaXJ0eQ0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRmlsZURpc3BsYXllZEluRGlydHlFZGl0b3IoDQotCQkJZmluYWwgU3RyaW5nIGZpbGVMb2NhdGlvbikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFNhdmVzIHRoZSBkaXJ0eSBzdGF0ZSBlZGl0b3INCi0JICogDQotCSAqIEBwYXJhbSBmaWxlTG9jYXRpb24NCi0JICogICAgICAgICAgICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlDQotCSAqIEBzZWUgSVJlc291cmNlI2dldExvY2F0aW9uKCkjdG9PU1N0cmluZygpDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3INCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVFZGl0b3IoU3RyaW5nIGZpbGVMb2NhdGlvbikNCi0JCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2F2ZXMgdGhlIGRpcnR5IHN0YXRlIGVkaXRvcg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVMb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUNCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0TG9jYXRpb24oKSN0b09TU3RyaW5nKCkNCi0JICogQHBhcmFtIG1vbml0b3INCi0JICogICAgICAgICAgICBQcm9ncmVzcyBtb25pdG9yDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3INCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVFZGl0b3IoU3RyaW5nIGZpbGVMb2NhdGlvbiwNCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGRpcnR5IGVkaXRvcnMNCi0JICogDQotCSAqIEByZXR1cm4gY29sbGVjdGlvbiBjb250YWluaW5nIGRpcnR5IGVkaXRvcnMNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiBnZXREaXJ0eUVkaXRvcnMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlIGNvbXBpbGF0aW9uIHVuaXRzIGZvciB0aGUgbG9jYXRpb24gc3BlY2lmaWVkDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZUxvY2F0aW9uDQotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUsIGUuZy4NCi0JICogICAgICAgICAgICA8Y29kZT5DOlxcZGlyMVxcZGlyMlxcZmlsZS5uYW1lPC9jb2RlPg0KLQkgKiBAc2VlIElSZXNvdXJjZSNnZXRMb2NhdGlvbigpI3RvT1NTdHJpbmcoKQ0KLQkgKiANCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSB3b3Jrc3BhY2UNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gZmlsZUxvY2F0aW9uIGlzIG51bGwNCi0JICogQHJldHVybiBUaGUgY29tcGlsYXRpb24gdW5pdHM7IGNhbm5vdCBiZSBudWxsDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdDxJQ29tcGlsYXRpb25Vbml0PiBnZXRDb21waWxhdGlvblVuaXRzKA0KLQkJCWZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247DQotCQ0KLQkvKioNCi0JICogUmV0cmlldmUgcHJvamVjdCB1bml0IGZvciB0aGUgbG9jYXRpb24gc3BlY2lmaWVkDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZUxvY2F0aW9uDQotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUsIGUuZy4NCi0JICogICAgICAgICAgICA8Y29kZT5DOlxcZGlyMVxcZGlyMlxcZmlsZS5uYW1lPC9jb2RlPg0KLQkgKiBAc2VlIElSZXNvdXJjZSNnZXRMb2NhdGlvbigpI3RvT1NTdHJpbmcoKQ0KLQkgKiANCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSB3b3Jrc3BhY2UNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIGZpbGVMb2NhdGlvbiBpcyBudWxsDQotCSAqIEByZXR1cm4gVGhlIGNvbXBpbGF0aW9uIHVuaXRzOyBjYW5ub3QgYmUgbnVsbA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IElQcm9qZWN0IGdldFByb2plY3RVbml0KA0KLQkJCWZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBDb252ZXJ0cyBhIFN0cmluZyB0byBhIFVSTCwgYXNzdW1pbmcgJ2ZpbGU6JyBhcyBhIGRlZmF1bHQgc2NoZW1lLg0KLQkgKiANCi0JICogQHBhcmFtIGJhc2UNCi0JICogQHBhcmFtIHBhdGgNCi0JICogDQotCSAqIEByZXR1cm4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24sDQotCSAqICAgICAgICAgICAgIGlmIHRoZSBTdHJpbmcgaXMgbmVpdGhlciBhIHZhbGlkIFVSTCwgbm9yIGEgdmFsaWQgZmlsZW5hbWUuDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IFVSTCBmaWxlT3JVUkxUb1VSTChmaW5hbCBVUkwgYmFzZSwgZmluYWwgU3RyaW5nIHBhdGgpDQotCQkJdGhyb3dzIElPRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkgaW4gdGhlIE9TIHRlbXAgZm9sZGVyDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBkaXJlY3RvcnkNCi0JICovDQotCXB1YmxpYyBGaWxlIGNyZWF0ZVRlbXBEaXJlY3RvcnkoKTsNCi0NCi0JLyoqDQotCSAqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudA0KLQkgKiANCi0JICogcGFyYW0gZGlyZWN0b3J5DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoZmluYWwgRmlsZSBkaXJlY3RvcnkpOw0KLQ0KLQkvKioNCi0JICogR2V0cyBhbGwgdGhlIGZpbGVzIHdpdGggdGhlIHByb3ZpZGVkIGV4dGVuc2lvbiB3aXRoaW4gYSBwcm9qZWN0Lg0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3QgLQ0KLQkgKiAgICAgICAgICAgIHRvIGJlIHNlYXJjaGVkDQotCSAqIEBwYXJhbSBleHRlbnNpb24gLQ0KLQkgKiAgICAgICAgICAgIHR5cGVzIG9mIGZpbGVzIG9mIGludGVyZXN0DQotCSAqLw0KLQlwdWJsaWMgSUZpbGVbXSBnZXRGaWxlc0J5RXh0ZW5zaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBleHRlbnNpb24pDQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGVkaXRvcnMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXlpbmcgdGhlIGNvbXBpbGF0aW9uDQotCSAqIHVuaXQgc3BlY2lmaWVkLg0KLQkgKiANCi0JICogQHBhcmFtIGN1DQotCSAqICAgICAgICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQ7IG11c3Qgbm90IGJlIG51bGwNCi0JICogQHJldHVybiBDdXJyZW50IGVkaXRvcnMgbGlzdCBvciBhbiBlbXB0eSBsaXN0IGluIGNhc2UgdGhlcmUgYXJlIG5vdA0KLQkgKiAgICAgICAgIGVkaXRvcnMgZGlzcGxheWluZyB0aGUgZmlsZSBzcGVjaWZpZWQNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgPGNvZGU+Y3U8L2NvZGU+IHBhcmFtZXRlciBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdDxJRWRpdG9yUGFydD4gZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpOw0KLQ0KLQkvKioNCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21waWxhdGlvbiB1bml0IHNwZWNpZmllZCBpcyBkaXNwbGF5ZWQgd2l0aGluIGFuDQotCSAqIGVkaXRvciB3aGljaCBoYXMgYSBkaXJ0eSBzdGF0ZS4NCi0JICogDQotCSAqIEBwYXJhbSB1bml0DQotCSAqICAgICAgICAgICAgVGhlIGNvbXBpbGF0aW9uIHVuaXQNCi0JICogDQotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyBkaXJ0eQ0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCk7DQotDQotCS8qKg0KLQkgKiBTYXZlcyBhbGwgdGhlIGRpcnR5IHN0YXRlIGVkaXRvcnMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXlpbmcgdGhlDQotCSAqIGNvbXBpbGF0aW9uIHVuaXQgc3BlY2lmaWVkDQotCSAqIA0KLQkgKiBAcGFyYW0gY3UNCi0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdA0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIFByb2dyZXNzIG1vbml0b3INCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0DQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3INCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVFZGl0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwNCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOw0KLQ0KLQkvKioNCi0JICogU2F2ZXMgYWxsIHRoZSBkaXJ0eSBzdGF0ZSBlZGl0b3JzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5aW5nIHRoZQ0KLQkgKiBjb21waWxhdGlvbiB1bml0IHNwZWNpZmllZA0KLQkgKiANCi0JICogQHBhcmFtIGN1DQotCSAqICAgICAgICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQNCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0DQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3INCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVFZGl0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSk7DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZSBhIGZpbGUgaW5zdGFuY2UgZm9yIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQuIFRoaXMgbWV0aG9kIGlzIGENCi0JICogY29udmVuaWVuY2UgbWV0aG9kIGVxdWl2YWxlbnQgdG8gaW52b2tpbmcNCi0JICogPGNvZGU+UmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obG9jYXRpb24pPC9jb2RlPg0KLQkgKiANCi0JICogQHBhcmFtIGxvY2F0aW9uDQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgbG9jYXRpb247IG11c3QgYmUgYWJzb2x1dGUNCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmaWxlIGluIHRoZSB3b3Jrc3BhY2UsIG9yIG51bGwgaWYgbm9uZQ0KLQkgKiBAc2VlIElXb3Jrc3BhY2VSb290I2dldEZpbGVGb3JMb2NhdGlvbihJUGF0aCkNCi0JICovDQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlRm9yTG9jYXRpb24oSVBhdGggbG9jYXRpb24pOw0KLQ0KLQkvKioNCi0JICogUmVhZHMgZmlsZSBjb250ZW50IGFzIHRleHQgYW5kIHJldHVybnMge0BsaW5rIFN0cmluZ30NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VGaWxlDQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgZmlsZQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVDb250ZW50KGZpbmFsIEZpbGUgc291cmNlRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29udGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBzcGVjaWZpZWQgd2l0aCB0aGUNCi0JICogPGNvZGU+Y29udGVudDwvY29kZT4gcHJvdmlkZWQuIFRoZXJlIGlzIG5vIHZhbGlkYXRpb24gb2YgdGhlIGNvbnRlbnQNCi0JICogDQotCSAqIEBwYXJhbSBjVW5pdA0KLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0LiBNdXN0IG5vdCBiZSBudWxsLiBJZiB0aGUgY29tcGlsYXRpb24NCi0JICogICAgICAgICAgICB1bml0IGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQNCi0JICogQHBhcmFtIGNvbnRlbnQNCi0JICogICAgICAgICAgICB0aGUgY29udGVudCB0byBiZSBzZXQuIE11c3Qgbm90IGJlIG51bGwNCi0JICogQHBhcmFtIGZvcmNlDQotCSAqICAgICAgICAgICAgYSBmbGFnIHRvIGhhbmRsZSB0aGUgY2FzZXMgd2hlbiB0aGUgY29udGVudHMgb2YgdGhlIG9yaWdpbmFsDQotCSAqICAgICAgICAgICAgcmVzb3VyY2UgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoaXMgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkDQotCSAqIEBwYXJhbSBtb25pdG9yDQotCSAqICAgICAgICAgICAgdGhlIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzIHRvIG9yIG51bGwgaWYgbm8gcHJvZ3Jlc3MNCi0JICogICAgICAgICAgICBtb25pdG9yaW5nIGlzIHJlcXVpcmVkDQotCSAqIA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHNldHRpbmcgY29tcGlsYXRpb24gdW5pdCBjb250ZW50DQotCSAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNiZWNvbWVXb3JraW5nQ29weShJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjY29tbWl0V29ya2luZ0NvcHkoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2Rpc2NhcmRXb3JraW5nQ29weSgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRDb21waWxhdGlvblVuaXRDb250ZW50KElDb21waWxhdGlvblVuaXQgY1VuaXQsDQotCQkJU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29udGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBzcGVjaWZpZWQgd2l0aCB0aGUNCi0JICogPGNvZGU+Y29udGVudDwvY29kZT4gcHJvdmlkZWQgYW5kIHNhdmVzIHRoZSBkaXJ0eSBlZGl0b3JzIGlmIGFueSB3aGljaA0KLQkgKiBkaXNwbGF5IHRoZSBjb21waWxhdGlvbiB1bml0LiBUaGVyZSBpcyBubyB2YWxpZGF0aW9uIG9mIHRoZSBjb250ZW50DQotCSAqIA0KLQkgKiBAcGFyYW0gY1VuaXQNCi0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdC4gTXVzdCBub3QgYmUgbnVsbC4gSWYgdGhlIGNvbXBpbGF0aW9uDQotCSAqICAgICAgICAgICAgdW5pdCBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkDQotCSAqIEBwYXJhbSBjb250ZW50DQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgdG8gYmUgc2V0LiBNdXN0IG5vdCBiZSBudWxsDQotCSAqIEBwYXJhbSBmb3JjZQ0KLQkgKiAgICAgICAgICAgIGEgZmxhZyB0byBoYW5kbGUgdGhlIGNhc2VzIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbA0KLQkgKiAgICAgICAgICAgIHJlc291cmNlIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZA0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIHRoZSBtb25pdG9yIHRvIHJlcG9ydCBwcm9ncmVzcyB0byBvciBudWxsIGlmIG5vIHByb2dyZXNzDQotCSAqICAgICAgICAgICAgbW9uaXRvcmluZyBpcyByZXF1aXJlZA0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBzZXR0aW5nIGNvbXBpbGF0aW9uIHVuaXQgY29udGVudA0KLQkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjYmVjb21lV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2NvbW1pdFdvcmtpbmdDb3B5KGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpDQotCSAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNkaXNjYXJkV29ya2luZ0NvcHkoKQ0KLQkgKiBAc2VlIElGaWxlVXRpbHMjc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChJQ29tcGlsYXRpb25Vbml0LCBTdHJpbmcsDQotCSAqICAgICAgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNlZSBJRmlsZVV0aWxzI2lzRmlsZURpc3BsYXllZEluRGlydHlFZGl0b3IoU3RyaW5nKQ0KLQkgKiBAc2VlIElGaWxlVXRpbHMjc2F2ZUVkaXRvcihJQ29tcGlsYXRpb25Vbml0LCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoDQotCQkJSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwgU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gZm9yY2UsDQotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9Qcm9qZWN0TWFuYWdlbWVudFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9Qcm9qZWN0TWFuYWdlbWVudFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmODgwYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvUHJvamVjdE1hbmFnZW1lbnRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cy5GYWNldFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzLklGYWNldFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLQ0KLS8qKg0KLSAqIFV0aWxpdHkgdGhhdCBwcm92aWRlcyB1c2VmdWwgcHJvamVjdCBtYW5hZ2VtZW50IHNlcnZpY2VzDQotICogDQotICogQGF1dGhvciBKb2VyZyBEZWhtZWwNCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0TWFuYWdlbWVudFV0aWxzDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTG9nZ2VyIGxvZ2dlciA9IG5ldyBMb2dnZXIoKTsNCi0JDQotCS8qKg0KLQkgKiBQcm92aWRlcyB0aGUgbWV0YS1pbmYgZm9sZGVyIG9mIGEgRUpCIHByb2plY3QuDQotCSAqIA0KLQkgKiBAcGFyYW0gcFByb2plY3ROYW1lDQotCSAqICAgICAgICAgICAgcHJvamVjdCBuYW1lDQotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIG9mIHRoZSBtZXRhLWluZiBmb2xkZXINCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiBwcm9qZWN0IG5hbWUgc3BlY2lmaWVkIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBlbXB0eSBzdHJpbmcsIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlLCBvciB0aGUgcHJvamVjdA0KLQkgKiAgICAgICAgICAgICBpcyBub3QgYW4gZWpiIHByb2plY3QNCi0JICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgZWl0aGVyIHRoZSBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSBvciBpdCBkb2Vzbid0IGNvbnRhaW4gYSBtZXRhLWluZiBmb2xkZXINCi0JICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBhY2Nlc3NpbmcgamF2YSBtb2RlbA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJRm9sZGVyIGZpbmRNZXRhSW5mRm9sZGVyKGZpbmFsIFN0cmluZyBwUHJvamVjdE5hbWUpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nIG1ldGFJbmZOYW1lID0gIk1FVEEtSU5GIjsgLy8kTk9OLU5MUy0xJA0KLQkJZmluYWwgU3RyaW5nIGVqYk1vZHVsZU5hbWUgPSAiZWpiTW9kdWxlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaWYgKCFpc0VqYjNQcm9qZWN0KHBQcm9qZWN0TmFtZSkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvamVjdCAiICsgcFByb2plY3ROYW1lICsgIiBpcyBub3QgYW4gRUpCIHByb2plY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotDQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEJ5TmFtZShwUHJvamVjdE5hbWUpOw0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QocHJvamVjdCk7DQotCQlJUGFja2FnZUZyYWdtZW50IGVqYk1vZHVsZVBrZ0ZyYWdtZW50ID0gbnVsbDsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3QgZnJhZ21lbnRSb290IDogamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSkNCi0JCQl7DQotCQkJCWlmIChmcmFnbWVudFJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFICYmIGZyYWdtZW50Um9vdC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhlamJNb2R1bGVOYW1lKSkNCi0JCQkJew0KLQkJCQkJZWpiTW9kdWxlUGtnRnJhZ21lbnQgPSBmcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KG1ldGFJbmZOYW1lKTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQl2ZXJpZnlNZXRhSW5mRm9sZGVyKGVqYk1vZHVsZVBrZ0ZyYWdtZW50LCBwUHJvamVjdE5hbWUpOw0KLQkJCXJldHVybiAoSUZvbGRlcikgZWpiTW9kdWxlUGtnRnJhZ21lbnQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7DQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeU1ldGFJbmZGb2xkZXIoSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uDQotCXsNCi0JCWlmIChmcmFnbWVudCA9PSBudWxsKQ0KLQkJew0KLQkJCWZpbmFsIFN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgicHJvamVjdCB7MH0gZG9lcyBub3QgaGF2ZSBhIE1FVEEtSU5GIGZvbGRlciIsIG5ldyBPYmplY3RbXSB7IHByb2plY3ROYW1lIH0pOyAvLyROT04tTkxTLTEkDQotCQkJZmluYWwgU3RyaW5nIGxvY2FsaXplZE1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzVXRpbE1lc3NhZ2VzLlByb2plY3RNYW5hZ2VtZW50VXRpbHNfUHJvamVjdEhhc05vTWV0YUluZkZvbGRlck1zZywgbmV3IE9iamVjdFtdIHsgcHJvamVjdE5hbWUgfSk7DQotCQkJdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihtc2csIGxvY2FsaXplZE1zZyk7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmcmFnbWVudC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsNCi0JCQkvLyBzaG91bGQgbm90IGhhcHBlbiENCi0JCQlpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpKQ0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlc291cmNlICIgKyByZXNvdXJjZS5nZXROYW1lKCkgKyAiIGlzIG5vdCBhIGZvbGRlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQl9DQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2sgd2hldGhlciBhIHByb2plY3QgaXMgYW4gZWpiIDMgcHJvamVjdA0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Q7IGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSBzdHJpbmcNCi0JICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgZWpiIDMgcHJvamVjdDsgZmFsc2Ugb3RoZXJ3aXNlDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIHByb2plY3QgbmFtZSBzcGVjaWZpZWQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGVtcHR5IHN0cmluZw0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlDQotCSAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGFjY2Vzc2luZyB0aGUgcHJvamVjdCBtZXRhZGF0YQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRWpiM1Byb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKQ0KLQl7DQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEJ5TmFtZShwcm9qZWN0TmFtZSk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlyZXR1cm4gZmFjZXRVdGlscygpLmhhc0ZhY2V0V2l0aFZlcnNpb24ocHJvamVjdCwgSUZhY2V0VXRpbHMuRUpCXzMwX0ZBQ0VUX1ZFUlNJT04sIElGYWNldFV0aWxzLkVKQl8zMF9GQUNFVF9JRCwgdHJ1ZSk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrIHdoZXRoZXIgYSBwcm9qZWN0IGlzIGFuIHdlYiAyLjUgcHJvamVjdA0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Q7IGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSBzdHJpbmcNCi0JICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgd2ViIDIuNSBwcm9qZWN0OyBmYWxzZSBvdGhlcndpc2UNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgcHJvamVjdCBuYW1lIHNwZWNpZmllZCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgZW1wdHkgc3RyaW5nDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIHByb2plY3QgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFjY2Vzc2libGUNCi0JICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWNjZXNzaW5nIHRoZSBwcm9qZWN0IG1ldGFkYXRhDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXZWIyNVByb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKQ0KLQl7DQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEJ5TmFtZShwcm9qZWN0TmFtZSk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlyZXR1cm4gZmFjZXRVdGlscygpLmhhc0ZhY2V0V2l0aFZlcnNpb24ocHJvamVjdCwgSUZhY2V0VXRpbHMuV0VCXzI1X0ZBQ0VUX1ZFUlNJT04sIElGYWNldFV0aWxzLldFQl8yNV9GQUNFVF9JRCwgdHJ1ZSk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlIHRoZSBwcm9qZWN0IGluc3RhbmNlIGJ5IHByb2plY3QgbmFtZQ0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgbmFtZQ0KLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGluc3RhbmNlDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIHByb2plY3QgbmFtZSBzcGVjaWZpZWQgaXMgbnVsbCBvciBlbXB0eSBzdHJpbmcNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYWNjZXNzaWJsZQ0KLQkgKiANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdEJ5TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpDQotCXsNCi0JCWlmIChwcm9qZWN0TmFtZSA9PSBudWxsIHx8IHByb2plY3ROYW1lLmxlbmd0aCgpID09IDApDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBwcm9qZWN0IG5hbWU6ICIgKyBwcm9qZWN0TmFtZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOw0KLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5pc0FjY2Vzc2libGUoKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9qZWN0IGlzIG5vdCBhY2Nlc3NpYmxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBwcm9qZWN0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXQgdGhlIGphdmEgcHJvamVjdCBpbnN0YW5jZQ0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3QNCi0JICogICAgICAgICAgICB0aGUgcHJvamVjdCBhcyBlY2xpcHNlIHJlc291cmNlDQotCSAqIEByZXR1cm4gdGhlIGphdmEgcHJvamVjdCBpbnN0YW5jZQ0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IG51bGwgb3IgdGhlIHByb2plY3QgaXMgbm90IGFjY2Vzc2libGUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpDQotCXsNCi0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvamVjdCBpcyBub3QgYWNjZXNzaWJsZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmVmcmVzaCB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkLiBSZWZyZXNoIGRlcHRoIHVzZWQgaXMgemVybw0KLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIGJlIHJlZnJlc2hlZA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEBzZWUgSVJlc291cmNlI0RFUFRIX1pFUk8NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlpZihyZXNvdXJjZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicmVzb3VyY2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZWZyZXNoZXMgdGhlIHByb2plY3QgdGhlIHJlc291cmNlIHNwZWNpZmllZCBiZWxvbmdzIHRvLiBSZWZyZXNoIGRlcHRoIHVzZWQgaXMgaW5maW5pdGUuDQotCSAqIEBwYXJhbSB0aGUgcmVzb3VyY2Ugd2hpY2ggcHJvamVjdCBpcyB0byBiZSByZWZyZXNoZWQNCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHRoZSByZXNvdXJjZSBzcGVjaWZpZWQgaXMgYSB3b3Jrc3BhY2Ugcm9vdA0KLQkgKiBAc2VlIElSZXNvdXJjZSNERVBUSF9JTkZJTklURQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQcm9qZWN0QnlSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWlmKHJlc291cmNlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJyZXNvdXJjZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgSVdvcmtzcGFjZVJvb3QpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3BlcmF0aW9uIGlzIG5vdCBkZWZpbmVkIGZvciB3b3Jrc3BhY2Ugcm9vdHMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXNvdXJjZS5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIElGYWNldFV0aWxzIGZhY2V0VXRpbHMoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEZhY2V0VXRpbHMoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1N0cmluZ0lucHV0U3RyZWFtQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGM5NjI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1N0cmluZ0lucHV0U3RyZWFtQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGNsYXNzIHRoYXQgdXNlcyBhIFN0cmluZ1JlYWRlciB0byBvcmdhbml6ZSBhbiBJbnB1dFN0cmVhbQ0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICogDQotICovDQotcHVibGljIGNsYXNzIFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlciBleHRlbmRzIElucHV0U3RyZWFtDQotew0KLQlwcml2YXRlIFN0cmluZ1JlYWRlciByZWFkZXI7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIHN0cmluZw0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RyaW5nPC9jb2RlPiBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKFN0cmluZyBzdHJpbmcpDQotCXsNCi0JCWlmIChzdHJpbmcgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHN0cmluZyk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gcmVhZGVyLnJlYWQoKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljNTlhM2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzcxODZmNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHM7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkNjkwZjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4NCi08dGl0bGU+QWJvdXQ8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFTi1VUyI+DQotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+DQotIA0KLTxwPlNlcHRlbWJlciAwNiwgMjAwOTwvcD4JDQotPGgzPkxpY2Vuc2U8L2gzPg0KLQ0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIA0KLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIA0KLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIA0KLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkNCi1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgDQotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlDQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQNCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9ib29rLmNzcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9ib29rLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDdlMmI1Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvYm9vay5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1AaW1wb3J0ICIuLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7Ci0KLXNwYW4uY29udHJvbCB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLm5hbWUgewotICBmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4uY29kZSB7Ci0gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci19Ci0KLXAubmF2X2Zvb3RlciB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXAubmF2X2Zvb3RlciBhIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhY2E0ZWE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBib29rLmNzcyxcCi0gICAgICAgICAgICAgICBjaGVhdHNoZWV0cy8sXAotICAgICAgICAgICAgICAgZ2V0dGluZ3N0YXJ0ZWQvLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGFza3MvLFwKLSAgICAgICAgICAgICAgIHRvY2dldHRpbmdzdGFydGVkLnhtbCxcCi0gICAgICAgICAgICAgICB0b2N0YXNrcy54bWwsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UvLFwKLSAgICAgICAgICAgICAgIGxlZ2FsLmh0bWwsXAotICAgICAgICAgICAgICAgdG9jcmVmZXJlbmNlLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2JvdHRvbVVwLWN4Zi1jb21wb3NpdGUueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2JvdHRvbVVwLWN4Zi1jb21wb3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYWJlMTM5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9ib3R0b21VcC1jeGYtY29tcG9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9zaXRlQ2hlYXRzaGVldCBuYW1lPSJDcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRiI+Ci0gICA8dGFza0dyb3VwIGtpbmQ9InNldCIgbmFtZT0iQ3JlYXRpbmcgYSBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIEFwYWNoZSBDWEYiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxpbnRybz4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyB0byBzZXR1cCB0aGUgQXBhY2hlIENYRiBydW50aW1lLCBjcmVhdGUgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIsICBhIER5bmFtaWMgV2ViIFByb2plY3QgZW5hYmxlZCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgIGFuZCBjcmVhdGUgYSBKQVgtV1MgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiwgZGVwbG95IGl0IHRvIEFwYWNoZSBUb21jYXQgYW5kIHRlc3QgaXQgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlci4KLSAgICAgICAgIDxici8+Ci0gICAgICAgICA8YnIvPgotVG8gYXNzaXN0IHlvdSBhbG9uZyB0aGUgd2F5LCB3aXphcmRzIGFuZCBjb21tYW5kcyB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgeW91IHRvIGxhdW5jaCBhdXRvbWF0aWNhbGx5LgotICAgICAgPC9pbnRybz4KLSAgICAgIDxvbkNvbXBsZXRpb24+Ci0gICAgICAgICBDb25ncmF0dWxhdGlvbnMhIFlvdSBqdXN0IGNvbmZpZ3VyZWQgdGhlIEFwYWNoZSBDWEYgcnVudGltZSwgY3JlYXRlZCBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciwgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGVuYWJsZWQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BlbW50IGFuZCBhIEpBWC1XUyBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIGFuZCB0aGVuIGRlcGxveWVkIHRoYXQgc2VydmljZSB0byBBcGFjaGUgVG9tY2F0IGFuZCB0ZXN0ZWQgaXQgd2l0aCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyLgotICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICA8dGFzayBraW5kPSJjaGVhdHNoZWV0IiBuYW1lPSJJbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgUnVudGltZSIgc2tpcD0idHJ1ZSI+Ci0gICAgICAgICA8aW50cm8+Ci0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBydW50aW1lIGluIHRoZSB3b3JrYmVuY2guCi08YnIvPgotPGJyLz4KLUlmIHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgaW4gdGhlIHdvcmtiZW5jaCB5b3UgbWF5IHNraXAgdGhpcyB0YXNrIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtTa2lwIHRoaXMgdGFzayZxdW90OyBidXR0b24uCi0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgIFlvdSBqdXN0IGluc3RhbGxlZCBhbmQgY29uZmlndXJlZCB0aGUgQXBhY2hlIENYRiBydW50aW1lIQotICAgICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9ImNvbmZpZ3VyZS1jeGYtcnVudGltZS54bWwiPgotICAgICAgICAgPC9wYXJhbT4KLSAgICAgIDwvdGFzaz4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9Ikluc3RhbGwgYW5kIGNyZWF0ZSBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciIgc2tpcD0idHJ1ZSI+Ci0gICAgICAgICA8aW50cm8+Ci0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGluc3RhbGwgYW5kIGNyZWF0ZSBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlci4KLTxici8+Ci08YnIvPgotSWYgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgYW5kIGNyZWF0ZWQgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIgeW91IG1heSBza2lwIHRoaXMgdGFzayBieSBjbGlja2luZyB0aGUgJnF1b3Q7U2tpcCB0aGlzIHRhc2smcXVvdDsgYnV0dG9uLgotICAgICAgICAgPC9pbnRybz4KLSAgICAgICAgIDxvbkNvbXBsZXRpb24+Ci0gICAgICAgICAgICBDb25ncmF0dWxhdGlvbnMhICBZb3UganVzdCBpbnN0YWxsZWQgYW5kIGNyZWF0ZWQgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIhCi0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY3JlYXRlLXRvbWNhdC1zZXJ2ZXIueG1sIj4KLSAgICAgICAgIDwvcGFyYW0+Ci0gICAgICA8L3Rhc2s+Ci0gICAgICA8dGFzayBraW5kPSJjaGVhdHNoZWV0IiBuYW1lPSJDcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzIiBza2lwPSJ0cnVlIj4KLSAgICAgICAgIDxpbnRybz4KLSAgICAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gY3JlYXRlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBhbmQgZW5hYmxlIGl0IGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wZW1udC4KLTxici8+Ci08YnIvPgotSWYgeW91IGFscmVhZHkgaGF2ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgIGVuYWJsZWQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IHlvdSBtYXkgc2tpcCB0aGlzIHRhc2sgYnkgY2xpY2tpbmcgdGhlICZxdW90O1NraXAgdGhpcyB0YXNrJnF1b3Q7IGJ1dHRvbi4KLSAgICAgICAgIDwvaW50cm8+Ci0gICAgICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISAgWW91IGp1c3QgY3JlYXRlZCBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZWQgaXQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IQotICAgICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9ImNyZWF0ZS1jeGYtcHJvamVjdC54bWwiPgotICAgICAgICAgPC9wYXJhbT4KLSAgICAgIDwvdGFzaz4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9IkNyZWF0ZSBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRiIgc2tpcD0iZmFsc2UiPgotICAgICAgICAgPGludHJvPgotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBjcmVhdGUgYSBKQVgtV1MgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBDWEYgcnVudGltZS4KLSAgICAgICAgIDwvaW50cm8+Ci0gICAgICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISAgWW91IGp1c3QgaWNyZWF0ZWQgYSBKQVgtV1MgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIENYRiBydW50aW1lIQotICAgICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9ImNyZWF0ZS1ib3R0b21VcC1jeGYueG1sIj4KLSAgICAgICAgIDwvcGFyYW0+Ci0gICAgICA8L3Rhc2s+Ci0gICA8L3Rhc2tHcm91cD4KLTwvY29tcG9zaXRlQ2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jb25maWd1cmUtY3hmLXJ1bnRpbWUueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NvbmZpZ3VyZS1jeGYtcnVudGltZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzMDA4NWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NvbmZpZ3VyZS1jeGYtcnVudGltZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjaGVhdHNoZWV0IHRpdGxlPSJDb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgUnVudGltZSI+DQotICAgPGludHJvDQotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBpbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBpbiB0aGUgd29ya2JlbmNoLgotICAgICAgICAgICAgPGJyLz4KLSAgICAgICAgICAgIDxici8+Ci1JZiB5b3UgbmVlZCBoZWxwIGF0IGFueSBzdGVwLCBjbGljayB0aGUgaGVscCBidXR0b24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgKD8pLg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgPC9pbnRybz4NCi0gICA8aXRlbQ0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcmVxdWlyZW1lbnRzLmh0bWwiDQotICAgICAgICAgc2tpcD0idHJ1ZSINCi0gICAgICAgICB0aXRsZT0iRG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIEFwYWNoZSBDWEYgcnVudGltZSI+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgIERvd25sb2FkIGFuZCBpbnN0YWxsIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgdmVyc2lvbiAyLjEueCBvciAyLjIueCBmcm9tIHRoZSBmb2xsb3dpbmcgc2l0ZTogaHR0cDovL2N4Zi5hcGFjaGUub3JnLy4gU2VsZWN0aW5nICB0aGUgJnF1b3Q7Q2xpY2sgdG8gcGVyZm9ybSZxdW90OyBidXR0b24gYmVsb3cgd2lsbCBvcGVuIGEgd2ViIGJyb3dzZXIgYXQgdGhhdCBsb2NhdGlvbi4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxjb21tYW5kDQotICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIg0KLSAgICAgICAgICAgIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIub3BlbkJyb3dzZXIodXJsPWh0dHA6Ly9jeGYuYXBhY2hlLm9yZy8pIi8+DQotICAgPC9pdGVtPg0KLSAgIDxpdGVtDQotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3ByZWZlcmVuY2VzLmh0bWwiDQotICAgICAgICAgc2tpcD0idHJ1ZSINCi0gICAgICAgICB0aXRsZT0iQ29uZmlndXJlIEFwYWNoZSBDWEYgaW4gdGhlIHdvcmtiZW5jaCINCi0gICAgICAgICBkaWFsb2c9InRydWUiPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICBBcGFjaGUgQ1hGIG11c3QgYmUgY29uZmlndXJlZCBpbiB0aGUgd29ya2JlbmNoIGJlZm9yZSB1c2luZyBpdCB0byBjcmVhdGUgSkFYLVdTIFdlYiBzZXJ2aWNlcy4KLTxici8+Ci08YnIvPgotU2VsZWN0IDxiPldpbmRvdy0mZ3Q7UHJlZmVyZW5jZXM8L2I+IGZyb20gdGhlIG1haW4gbWVudSwgZXhwYW5kIHRoZSA8Yj5XZWIgU2VydmljZXM8L2I+IG91dGxpbmUgdHJlZSBub2RlIHdpdGhpbiB0aGUgcmVzdWx0aW5nIGRpYWxvZywgYW5kIGNob29zZSA8Yj5DWEYgMi54IFByZWZlcmVuY2VzPC9iPi4gU2VsZWN0IHRoZSAmcXVvdDtDbGljayB0byBwZXJmb3JtJnF1b3Q7IGJ1dHRvbiB0byBkbyB0aGlzIGF1dG9tYXRpY2FsbHkuCi08YnIvPgotPGJyLz4KLUJyb3dzZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgeW91IGluc3RhbGxlZCBBcGFjaGUgIENYRiBhbmQgdGhlbiBjbGljayA8Yj5PSzwvYj4gaW4gdGhlIFByZWZlcmVuY2VzIGRpYWxvZy4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxjb21tYW5kDQotICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIg0KLSAgICAgICAgICAgIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5wcmVmZXJlbmNlcyhwcmVmZXJlbmNlUGFnZUlkPW9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkuQ1hGUnVudGltZVByZWZlcmVuY2VzUGFnZSkiLz4NCi0gICA8L2l0ZW0+DQotICAgPGl0ZW0NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2Uvc2VydmVyX3J1bnRpbWUuaHRtbCINCi0gICAgICAgICBza2lwPSJ0cnVlIg0KLSAgICAgICAgIHRpdGxlPSJTZXQgQXBhY2hlIENYRiBhcyB0aGUgZGVmYXVsdCBydW50aW1lIg0KLSAgICAgICAgIGRpYWxvZz0idHJ1ZSI+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgIFRvIHNldCBBcGFjaGUgQ1hGIGFzIHRoZSBkZWZhdWx0IFdlYiBzZXJ2aWNlIHJ1bnRpbWUgaW4gdGhlIHdvcmtiZW5jaCBzZWxlY3QgPGI+V2luZG93LSZndDtQcmVmZXJlbmNlczwvYj4gZnJvbSB0aGUgbWFpbiBtZW51LCBleHBhbmQgdGhlIDxiPldlYiBTZXJ2aWNlczwvYj4gb3V0bGluZSB0cmVlIG5vZGUgd2l0aGluIHRoZSByZXN1bHRpbmcgZGlhbG9nLCBhbmQgY2hvb3NlIDxiPlNlcnZlciBhbmQgUnVudGltZTwvYj4uIFNlbGVjdGluZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gcGVyZm9ybSZxdW90OyBidXR0b24gd2lsbCBvcGVuIHRoaXMgcHJlZmVyZW5jZSBwYWdlLgotPGJyLz4KLTxici8+Ci1JbiB0aGUgPGI+V2ViIHNlcnZpY2UgcnVudGltZTwvYj4gZHJvcCBkb3duIGxpc3Qgc2VsZWN0ICZxdW90O0FwYWNoZSBDWEYgMi54JnF1b3Q7IGFuZCBjbGljayA8Yj5PSzwvYj4uDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8Y29tbWFuZA0KLSAgICAgICAgICAgIHJlcXVpcmVkPSJmYWxzZSINCi0gICAgICAgICAgICBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS51aS53aW5kb3cucHJlZmVyZW5jZXMocHJlZmVyZW5jZVBhZ2VJZD1vcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXMuU2VydmVyUnVudGltZVByZWZlcmVuY2VQYWdlKSIvPg0KLSAgIDwvaXRlbT4KLTwvY2hlYXRzaGVldD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLWJvdHRvbVVwLWN4Zi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLWJvdHRvbVVwLWN4Zi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhYWNhNTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS1ib3R0b21VcC1jeGYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBXZWIgU2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIEFwYWNoZSBDWEYiPgotICAgPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIHVzZSB0aGUgV2ViIFNlcnZpY2VzIHdpemFyZCB0byBjcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgYW5kIHRvIGRlcGxveSB0aGF0IHNlcnZpY2UgdG8gYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIgYW5kIHRlc3QgaXQgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlci4KLSAgICAgICAgIDxici8+Ci0gICAgICAgICA8YnIvPgotSWYgeW91IG5lZWQgaGVscCBhdCBhbnkgc3RlcCwgY2xpY2sgdGhlIGhlbHAgYnV0dG9uIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyICg/KS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2ludHJvPgotICAgPGl0ZW0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qZHQuZG9jLnVzZXIvZ2V0dGluZ1N0YXJ0ZWQvcXMtOS5odG0iCi0gICAgICAgICB0aXRsZT0iQ3JlYXRlIG9yIEltcG9ydCBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBDcmVhdGUgb3IgaW1wb3J0IGEgSmF2YSBiZWFuIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBpbnRvIHRoZSBzb3VyY2UgZm9sZGVyIG9mIGEgRHluYW1pYyBXZWIgUHJvamVjdCB0aGF0IGhhcyBiZWVuIGVuYWJsZWQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBkaWFsb2c9InRydWUiCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCIKLSAgICAgICAgIHRpdGxlPSJDcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRvIGNyZWF0ZSBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iU2VsZWN0ICZxdW90O0ZpbGUgLSZndDsgTmV3IC0mZ3Q7IE90aGVyLi4uJnF1b3Q7IGZyb20gdGhlIG1haW4gbWVudSwgZXhwYW5kIHRoZSAmcXVvdDtXZWIgU2VydmljZXMmcXVvdDsgY2F0ZWdvcnkgYW5kIHNlbGVjdCAmcXVvdDtXZWIgU2VydmljZSZxdW90Oy4gQ2xpY2sgJnF1b3Q7T0smcXVvdDsgdG8gbGF1bmNoIHRoZSBXZWIgU2VydmljZXMgd2l6YXJkIG9yIHNlbGVjdCB0aGUgJnF1b3Q7Q2xpY2sgdG8gcGVyZm9ybSZxdW90OyBidXR0b24gdG8gZG8gdGhpcyBhdXRvbWF0aWNhbGx5LiI+Ci0gICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkKSIvPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJTZWxlY3QgJnF1b3Q7Qm90dG9tIHVwIEphdmEgYmVhbiBXZWIgU2VydmljZSZxdW90OyBhcyB0aGUgJnF1b3Q7V2ViIHNlcnZpY2UgdHlwZSZxdW90Oy4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJCcm93c2UgdG8gc2VsZWN0IHRoZSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uLiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IlZlcmlmeSB0aGF0ICZxdW90O0FwYWNoZSBDWEYgMi54JnF1b3Q7IGlzIHNlbGVjdGVkIGFzIHRoZSBXZWIgc2VydmljZSBydW50aW1lLiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9Ik1vdmUgdGhlIHNlcnZpY2Ugc2xpZGVyIHRvIHRoZSAmcXVvdDtUZXN0IHNlcnZpY2UmcXVvdDsgc3RhZ2UuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iQWNjZXB0IGFsbCBvdGhlciBkZWZhdWx0IHZhbHVlcyBvbiB0aGlzIHBhZ2UgYW5kIGNsaWNrICZxdW90O05leHQgJmd0OyZxdW90Oy4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJPbiB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBwYWdlIHNlbGVjdCB0aGUgJnF1b3Q7VXNlIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UmcXVvdDsgY2hlY2sgYm94IGZvbGxvd2VkIGJ5IHRoZSAmcXVvdDtDcmVhdGUgYW4gU0VJJnF1b3Q7IGJ1dHRvbi4gRW50ZXIgYSBuYW1lIGZvciB0aGUgU0VJLCAmcXVvdDtTZWxlY3QgQWxsJnF1b3Q7IHRoZSBtZXRob2RzIGFuZCBjbGljayAmcXVvdDtGaW5pc2gmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyL3Rhc2tzL3R0ZXN0d3NkbC5odG1sIgotICAgICAgICAgc2tpcD0idHJ1ZSIKLSAgICAgICAgIHRpdGxlPSJUZXN0IHRoZSBXZWIgc2VydmljZSB3aXRoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVGhlIFdlYiBTZXJ2aWNlcyBXaXphcmQgd2lsbCBsYXVuY2ggdGhlIDxiPldlYiBTZXJ2aWNlcyBFeHBsb3JlcjwvYj4gYWZ0ZXIgc3VjY2Vzc2Z1bGx5IGNyZWF0aW5nIGFuZCBkZXBsb3lpbmcgeW91ciBXZWIgc2VydmljZSB0byBBcGFjaGUgVG9tY2F0LgotPGJyLz4KLTxici8+Ci1UbyB0ZXN0IHRoZSBXZWIgc2VydmljZSBzZWxlY3QgYW4gb3BlcnRhaW9uIGluIHRoZSA8Yj5XZWIgU2VydmljZXMgRXhwbG9yZXI8L2I+LCBmaWxsIGluIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiBhbmQgY2xpY2sgPGI+R288L2I+LgotPGJyLz4KLTxici8+Ci1UaGUgcmVzdWx0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSA8Yj5TdGF0dXM8L2I+IHBhbmUuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICA8b25Db21wbGV0aW9uPgotICAgICBDb25ncmF0dWxhdGlvbnMhICBZb3UganVzdCBjcmVhdGVkIGEgSkFYLVdTIFdlYiBzZXJ2aWNlIQotICA8L29uQ29tcGxldGlvbj4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtY2xpZW50LWN4Zi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLWNsaWVudC1jeGYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOTY4YzE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtY2xpZW50LWN4Zi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoZWF0c2hlZXQKLSAgICAgIHRpdGxlPSJHZW5lcmF0ZSBhIEpBWC1XUyBDbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRiI+Ci0gICA8aW50cm8KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZ3VpZGUgeW91IHRocm91Z2ggdGhlIGluZGl2aWR1YWwgc3RlcHMgdG8gZ2VuZXJhdGUgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pbnRybz4KLSAgIDxpdGVtCi0gICAgICAgICBkaWFsb2c9InRydWUiCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfY2xpZW50Lmh0bWwiCi0gICAgICAgICB0aXRsZT0iR2VuZXJhdGUgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50Ij4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRvIGdlbmVyYXRlIGEgSkFYLVdTIGNsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHMuCi0gICAgICAgICAKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8c3ViaXRlbSBsYWJlbD0iU2VsZWN0ICZxdW90O0ZpbGUgLSZndDsgTmV3IC0mZ3Q7IE90aGVyLi4uJnF1b3Q7IGZyb20gdGhlIG1haW4gbWVudSwgZXhwYW5kIHRoZSAmcXVvdDtXZWIgU2VydmljZXMmcXVvdDsgY2F0ZWdvcnkgYW5kIGNob29zZSAmcXVvdDtXZWIgU2VydmljZSBDbGllbnQmcXVvdDsuIENsaWNrICZxdW90O09LJnF1b3Q7LiBTZWxlY3QgdGhlICZxdW90O0NsaWNrIHRvIHBlcmZvcm0mcXVvdDsgYnV0dG9uIGJlbG93IHRvIGRvIHRoaXMgYXV0b21hdGljYWxseS4iPgotICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJmYWxzZSIKLSAgICAgICAgICAgICAgIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZChuZXdXaXphcmRJZD1vcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQpIi8+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IkVudGVyIHRoZSBVUkkgdG8gdGhlIHJlbW90ZSBXU0RMIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsaWVudC4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJTZWxlY3QgJnF1b3Q7SmF2YSBQcm94eSZxdW90OyBhcyB0aGUgJnF1b3Q7Q2xpZW50IHR5cGUmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iVmVyaWZ5IHRoYXQgJnF1b3Q7QXBhY2hlIENYRiAyLngmcXVvdDsgaXMgc2VsZWN0ZWQgYXMgdGhlICZxdW90O1dlYiBzZXJ2aWNlIHJ1bnRpbWUmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iU2VsZWN0IHRoZSAmcXVvdDtDbGllbnQgcHJvamVjdCZxdW90OyBsaW5rIHRvIGNob29zZSB0aGUgcHJvamVjdCBpbiB0byB3aGljaCB0aGUgSkFYLVdTIGNsaWVudCB3aWxsIGJlIGdlbmVyYXRlZC4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJNb3ZlIHRoZSBjbGllbnQgc2xpZGVyIHBvc2l0aW9uIHRvICZxdW90O0RldmVsb3AgQ2xpZW50JnF1b3Q7IGFuZCBjbGljayAmcXVvdDtGaW5pc2gmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuamR0LmRvYy51c2VyL2dldHRpbmdTdGFydGVkL3FzLTEyLmh0bSIKLSAgICAgICAgIHRpdGxlPSJSdW4gdGhlIEpBWC1XUyBjbGllbnQiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgQmVmb3JlIHJ1bm5pbmcgdGhlIGNsaWVudCBjaGVjayB0aGUgb3BlcmF0aW9uIHBhcmFtZXRlcnMgdGhhdCBDWEYgZ2VuZXJhdGVkIGZvciB5b3UgYW5kIGVkaXQgaWYgbmVjZXNzYXJ5LgotPGJyLz4KLTxici8+Ci1UbyA8Yj5ydW48L2I+IHlvdXIgY2xpZW50LCByaWdodC1jbGljayBvbiB0aGUgY2xpZW50IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGFuZCBzZWxlY3QgPGI+UnVuIEFzICZndDsgSmF2YSBBcHBsaWNhdGlvbjwvYj4uIEEgbmV3IGNvbnNvbGUgdmlldyB3aWxsIG9wZW4gYW5kIGRpc3BsYXkgdGhlIHJlc3BvbnNlcyBvZiB0aGUgb3BlcmF0aW9uIGludm9jYXRpb25zLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtY3hmLXByb2plY3QueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS1jeGYtcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyMzA1ZjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS1jeGYtcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzIj4NCi0gICA8aW50cm8NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1jaGVhdHNoZWV0cy5odG0iPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZSBpdCBmb3IgQ1hGIEpBWC1XUyBXZWIgc2VydmljZSBkZXZlbG9wbWVudC4KLSAgICAgICAgICAgIDxici8+Ci0gICAgICAgICAgICA8YnIvPgotSWYgeW91IG5lZWQgaGVscCBhdCBhbnkgc3RlcCwgY2xpY2sgdGhlIGhlbHAgYnV0dG9uIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyICg/KS4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgIDwvaW50cm8+DQotICAgPGl0ZW0NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqcGVycy5odG1sIg0KLSAgICAgICAgIHNraXA9InRydWUiDQotICAgICAgICAgdGl0bGU9Ik9wZW4gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUiPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICBXaGVuIHdvcmtpbmcgd2l0aCBKQVgtV1MgV2ViIHNlcnZpY2VzLCB5b3Ugc2hvdWxkIHVzZSB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZS4gSWYgeW91IGFscmVhZHkgaGF2ZSB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSBhY3RpdmUsIHlvdSBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlIDxiPkNsaWNrIHRvIFNraXA8L2I+IGJ1dHRvbi4gSWYgbm90LCBzZWxlY3QgPGI+V2luZG93IC0mZ3Q7IE9wZW4gUGVyc3BlY3RpdmUgLSZndDsgT3RoZXIuLi48L2I+IGZyb20gdGhlIG1haW4gbWVudSBhbmQgIGNob29zZSA8Yj5KYXZhIEVFPC9iPiBpbiB0aGUgcmVzdWx0aW5nIDxiPk9wZW4gUGVyc3BlY3RpdmU8L2I+IGRpYWxvZyBib3guDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8Y29tbWFuZA0KLSAgICAgICAgICAgIHJlcXVpcmVkPSJmYWxzZSINCi0gICAgICAgICAgICBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMuc2hvd1BlcnNwZWN0aXZlKG9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUucGVyc3BlY3RpdmVJZD1vcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFUGVyc3BlY3RpdmUpIi8+DQotICAgPC9pdGVtPg0KLSAgIDxpdGVtDQotICAgICAgICAgZGlhbG9nPSJ0cnVlIg0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIg0KLSAgICAgICAgIHNraXA9InRydWUiDQotICAgICAgICAgdGl0bGU9IkNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QiPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICBCZWZvcmUgY3JlYXRpbmcgYSBKQVgtV1MgV2ViIFNlcnZpY2UsIHdlIG5lZWQgYSBwcm9qZWN0IHRvIHB1dCBpdCBpbi4gUGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGNyZWF0ZSBhbiBEeW5hbWljIFdlYiBQcm9qZWN0LgotPGJyLz4KLTxici8+Ci1TZWxlY3QgPGI+RmlsZSAtJmd0OyBOZXcgLSZndDsgUHJvamVjdC4uLjwvYj4gZnJvbSB0aGUgbWFpbiBtZW51LCBleHBhbmQgdGhlIDxiPldlYjwvYj4gY2F0ZWdvcnkgd2l0aGluIHRoZSByZXN1bHRpbmcgPGI+TmV3IFByb2plY3Q8L2I+IGRpYWxvZyBib3ggYW5kIGNob29zZSA8Yj5EeW5hbWljIFdlYiBQcm9qZWN0PC9iPi4KLTxici8+Ci08YnIvPgotT24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHdpemFyZCBlbnRlciBhIDxiPlByb2plY3QgbmFtZTo8L2I+LCBzZWxlY3QgQXBhY2hlIFRvbWNhdCBhcyB0aGUgPGI+VGFyZ2V0IHJ1bnRpbWU8L2I+IGFuZCBjbGljayA8Yj5GaW5pc2g8L2I+Lg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPGNvbW1hbmQNCi0gICAgICAgICAgICByZXF1aXJlZD0iZmFsc2UiDQotICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQuV2ViUHJvamVjdFdpemFyZCkiLz4NCi0gICA8L2l0ZW0+DQotICAgPGl0ZW0NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbnN0YWxsX2N4Zl9mYWNldC5odG1sIg0KLSAgICAgICAgIHNraXA9InRydWUiDQotICAgICAgICAgdGl0bGU9IkVuYWJsZSBKQVgtV1MgV2ViIHNlcnZpY2UgZGV2ZWxvcGVtZW50Ij4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgRW5hYmxlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgYnkgcmlnaHQtY2xpY2tpbmcgb24gdGhlIHByb2plY3QgYW5kIHNlbGVjdGluZyA8Yj5Qcm9wZXJ0aWVzPC9iPi4KLTxici8+Ci08YnIvPgotSW4gdGhlIDxiPlByb2plY3QgRmFjZXRzPC9iPiBwYWdlIGVuYWJsZSB0aGUgPGI+Q1hGIDIueCBXZWIgU2VydmljZXM8L2I+IGZhY2V0IGJ5IHNlbGVjdGluZyB0aGUgY2hlY2sgYm94IGFuZCBjbGljayA8Yj5PSzwvYj4uDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICA8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS10b21jYXQtc2VydmVyLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtdG9tY2F0LXNlcnZlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzZjJkZDEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS10b21jYXQtc2VydmVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNoZWF0c2hlZXQgdGl0bGU9IkNyZWF0ZSBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciI+DQotICAgPGludHJvDQotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBpbnN0YWxsIGFuZCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIEFwYWNoZSBUb21jYXQgc2VydmVyIGluIG9yZGVyIHRvIGRlcGxveSBhbmQgdGVzdCB5b3VyIEpBWC1XUyBXZWIgc2VydmljZS4KLSAgICAgICAgICAgIDxici8+Ci0gICAgICAgICAgICA8YnIvPgotSWYgeW91IG5lZWQgaGVscCBhdCBhbnkgc3RlcCwgY2xpY2sgdGhlIGhlbHAgYnV0dG9uIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyICg/KS4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgIDwvaW50cm8+DQotICAgPGl0ZW0NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5kb2MudXNlci90b3BpY3MvdG9tY2F0Lmh0bWwiDQotICAgICAgICAgc2tpcD0idHJ1ZSINCi0gICAgICAgICB0aXRsZT0iRG93bmxvYWQgYW5kIGluc3RhbGwgQXBhY2hlIFRvbWNhdCI+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgIERvd25sb2FkIGFuZCBpbnN0YWxsIEFwYWNoZSBUb21jYXQgdmVyc2lvbiA1LjUueCBvciA2LjAueCBmcm9tIHRoZSBmb2xsb3dpbmcgc2l0ZTogaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnLy4gU2VsZWN0aW5nICB0aGUgJnF1b3Q7Q2xpY2sgdG8gcGVyZm9ybSZxdW90OyBidXR0b24gYmVsb3cgd2lsbCBvcGVuIGEgd2ViIGJyb3dzZXIgYXQgdGhhdCBsb2NhdGlvbi4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxjb21tYW5kDQotICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIg0KLSAgICAgICAgICAgIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIub3BlbkJyb3dzZXIodXJsPWh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy8pIi8+DQotICAgPC9pdGVtPg0KLSAgIDxpdGVtDQotICAgICAgICAgZGlhbG9nPSJ0cnVlIg0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmRvYy51c2VyL3RvcGljcy90b21jYXQuaHRtbCINCi0gICAgICAgICBza2lwPSJmYWxzZSINCi0gICAgICAgICB0aXRsZT0iQ3JlYXRlIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyIj4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgUGVyZm9ybSB0aGUgZm9sbG93aW5nIHRoZSBzdGVwcyB0byBjcmVhdGUgYSBUb21jYXQgc2VydmVyIGluIHRoZSB3b3JrYmVuY2guDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8c3ViaXRlbQ0KLSAgICAgICAgICAgIGxhYmVsPSJTZWxlY3QgJnF1b3Q7RmlsZSAtJmd0OyBOZXcgLSZndDsgT3RoZXIuLi4mcXVvdDsgZnJvbSB0aGUgbWFpbiBtZW51LCBleHBhbmQgdGhlICZxdW90O1NlcnZlciZxdW90OyBjYXRlZ29yeSB3aXRoaW4gdGhlIHJlc3VsdGluZyAmcXVvdDtOZXcgV2l6YXJkJnF1b3Q7IGRpYWxvZyBib3ggYW5kIGNob29zZSAmcXVvdDtTZXJ2ZXImcXVvdDsuIENsaWNrICZxdW90O05leHQgJmd0OyZxdW90Oy4iDQotICAgICAgICAgICAgc2tpcD0idHJ1ZSI+DQotICAgICAgICAgPGNvbW1hbmQNCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iZmFsc2UiDQotICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkubmV3LnNlcnZlcikiLz4NCi0gICAgICA8L3N1Yml0ZW0+DQotICAgICAgPHN1Yml0ZW0NCi0gICAgICAgICAgICBsYWJlbD0iU2VsZWN0IHRoZSB2ZXJzaW9uIG9mIFRvbWNhdCB0aGF0IHlvdSBoYXZlIGluc3RhbGxlZCBvbiB0aGUgZmlyc3QgcGFnZS4gQ2xpY2sgJnF1b3Q7TmV4dCAmZ3Q7JnF1b3Q7LiINCi0gICAgICAgICAgICBza2lwPSJ0cnVlIj4NCi0gICAgICA8L3N1Yml0ZW0+DQotICAgICAgPHN1Yml0ZW0NCi0gICAgICAgICAgICBsYWJlbD0iU3BlY2lmeSB0aGUgVG9tY2F0IEluc3RhbGxhdGlvbiBkaXJlY3RvcnkgYW5kIGNsaWNrICZxdW90O0ZpbmlzaCZxdW90Oy4iDQotICAgICAgICAgICAgc2tpcD0idHJ1ZSI+DQotICAgICAgPC9zdWJpdGVtPg0KLSAgICAgIDxzdWJpdGVtDQotICAgICAgICAgICAgbGFiZWw9Ik9wZW4gdGhlIFNlcnZlcnMgdmlldyBieSBzZWxlY3RpbmcgJnF1b3Q7V2luZG93IC0mZ3Q7IFNob3cgVmlldyAtJmd0OyBPdGhlci4uJnF1b3Q7IGZyb20gdGhlIG1haW4gbWVudSwgZXhwYW5kIHRoZSAmcXVvdDtTZXJ2ZXImcXVvdDsgY2F0ZWdvcnkgd2l0aGluIHRoZSByZXN1bHRpbmcgJnF1b3Q7U2hvdyBWaWV3JnF1b3Q7IGRpYWxvZyBib3ggYW5kIGNob29zZSAmcXVvdDtTZXJ2ZXJzJnF1b3Q7LiBDbGljayAmcXVvdDtPSyZxdW90Oy4iDQotICAgICAgICAgICAgc2tpcD0idHJ1ZSI+DQotICAgICAgICAgPGNvbW1hbmQNCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iZmFsc2UiDQotICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkudmlld3Muc2hvd1ZpZXcob3JnLmVjbGlwc2UudWkudmlld3Muc2hvd1ZpZXcudmlld0lkPW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyc1ZpZXcpIi8+DQotICAgICAgPC9zdWJpdGVtPg0KLSAgICAgIDxzdWJpdGVtDQotICAgICAgICAgICAgbGFiZWw9IlN0YXJ0IHRoZSBUb21jYXQgc2VydmVyIGJ5IHNlbGVjdGluZyB0aGUgc2VydmVyIGluIHRoZSBTZXJ2ZXJzIHZpZXcgYW5kIGNsaWNraW5nIHRoZSAmcXVvdDtTdGFydCB0aGUgc2VydmVyJnF1b3Q7IGJ1dHRvbiBpbiB0aGUgU2VydmVycyB2aWV3IHRvb2xiYXIuIj4NCi0gICAgICA8L3N1Yml0ZW0+DQotICAgPC9pdGVtPgotPC9jaGVhdHNoZWV0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtdG9wRG93bi1jeGYueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS10b3BEb3duLWN4Zi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5NWY4MmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS10b3BEb3duLWN4Zi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoZWF0c2hlZXQKLSAgICAgIHRpdGxlPSJHZW5lcmF0ZSBhIEpBWC1XUyBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGIj4KLSAgIDxpbnRybwotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gdXNlIHRoZSBXZWIgU2VydmljZXMgd2l6YXJkIHRvIGdlbmVyYXRlIGEgSkFYLVdTIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEFwYWNoZSBDWEYgcnVudGltZS4KLSAgICAgICAgIDxici8+Ci0gICAgICAgICA8YnIvPgotSWYgeW91IG5lZWQgaGVscCBhdCBhbnkgc3RlcCwgY2xpY2sgdGhlIGhlbHAgYnV0dG9uIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyICg/KS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2ludHJvPgotICAgPGl0ZW0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kb2MudXNlci90YXNrcy90Y3J0d3NkbC5odG1sIgotICAgICAgICAgdGl0bGU9IkNyZWF0ZSBvciBpbXBvcnQgYSBXU0RMIGRvY3VtZW50Ij4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIENyZWF0ZSBvciBpbXBvcnQgYSBXU0RMIGZpbGUgaW50byB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIG9mIHRoZSBXZWIgcHJvamVjdC4gVGhlIFdTREwgZG9jdW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgc2VydmljZSBlbGVtZW50LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBkaWFsb2c9InRydWUiCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfdG9wZG93bi5odG1sIgotICAgICAgICAgdGl0bGU9IkdlbmVyYXRlIGEgSkFYLVdTIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gdGhlIFdTREwgZG9jdW1lbnQiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVG8gZ2VuZXJhdGUgYSBKQVgtV1MgU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iU2VsZWN0ICZxdW90O0ZpbGUgLSZndDsgTmV3IC0mZ3Q7IE90aGVyLi4uJnF1b3Q7IGZyb20gdGhlIG1haW4gbWVudSwgZXhwYW5kIHRoZSAmcXVvdDtXZWIgU2VydmljZXMmcXVvdDsgY2F0ZWdvcnkgYW5kIHNlbGVjdCAmcXVvdDtXZWIgU2VydmljZSZxdW90Oy4gQ2xpY2sgJnF1b3Q7T0smcXVvdDsgdG8gbGF1bmNoIHRoZSBXZWIgU2VydmljZXMgd2l6YXJkIG9yIHNlbGVjdCB0aGUgJnF1b3Q7Q2xpY2sgdG8gcGVyZm9ybSZxdW90OyBidXR0b24gdG8gZG8gdGhpcyBhdXRvbWF0aWNhbGx5LiI+Ci0gICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkKSIvPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJTZWxlY3QgJnF1b3Q7VG9wIGRvd24gSmF2YSBiZWFuIFdlYiBTZXJ2aWNlJnF1b3Q7IGFzIHRoZSAmcXVvdDtXZWIgc2VydmljZSB0eXBlJnF1b3Q7LiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IkJyb3dzZSB0byBzZWxlY3QgdGhlIFNlcnZpY2UgZGVmaW5pdGlvbi4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJWZXJpZnkgdGhhdCAmcXVvdDtBcGFjaGUgQ1hGIDIueCZxdW90OyBpcyBzZWxlY3RlZCBhcyB0aGUgV2ViIHNlcnZpY2UgcnVudGltZS4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJNb3ZlIHRoZSBzZXJ2aWNlIHNsaWRlciB0byB0aGUgJnF1b3Q7RGV2ZWxvcCBzZXJ2aWNlJnF1b3Q7IHN0YWdlLiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IkFjY2VwdCBhbGwgb3RoZXIgZGVmYXVsdCB2YWx1ZXMgb24gdGhpcyBwYWdlIGFuZCBjbGljayAmcXVvdDtOZXh0ICZndDsmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iT24gdGhlIEFwYWNoZSBDWEYgV1NETCB0byBKYXZhIHBhZ2UgYWNjZXB0IHRoZSBkZWZhdWx0cyBhbmQgY2xpY2sgJnF1b3Q7TmV4dCAmZ3Q7JnF1b3Q7LiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IlNlbGVjdCAmcXVvdDtHZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbiZxdW90OyBvbiB0aGUgV1NETCB0byBKYXZhIHByZWZlcmVuY2Ugb3ZlcnJpZGUgcGFnZSBhbmQgY2xpY2sgJnF1b3Q7RmluaXNoJnF1b3Q7LiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICA8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvZ2VuZXJhdGUtY3hmLXdzZGwtY2xpZW50LWNvbXBvc2l0ZS54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvZ2VuZXJhdGUtY3hmLXdzZGwtY2xpZW50LWNvbXBvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2YWJlYjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2dlbmVyYXRlLWN4Zi13c2RsLWNsaWVudC1jb21wb3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb3NpdGVDaGVhdHNoZWV0IG5hbWU9IkdlbmVyYXRpbmcgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYiPgotICAgPHRhc2tHcm91cCBraW5kPSJzZXQiIG5hbWU9IkdlbmVyYXRpbmcgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxpbnRybz4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyB0byBnZW5lcmF0ZSBhIEpBWC1XUyBjbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRi4KLSAgICAgICAgIDxici8+Ci0gICAgICAgICA8YnIvPgotVGhlIGdlbmVyYXRlZCBjbGllbnQgd2lsbCBpbmNsdWRlIGEgbWFpbigpIHRoYXQgd2hlbiBydW4gd2lsbCBjb25uZWN0IHRvIHRoZSByZW1vdGUgc2VydmljZSBhbmQgaW52b2tlIGV2ZXJ5IG9wZXJhdGlvbiBvbiB0aGF0IHJlbW90ZSBzZXJ2aWNlLgotICAgICAgICAgPGJyLz4KLSAgICAgICAgIDxici8+Ci1UbyBhc3Npc3QgeW91IGFsb25nIHRoZSB3YXksIHdpemFyZHMgYW5kIGNvbW1hbmRzIHdpbGwgYmUgYXZhaWxhYmxlIGZvciB5b3UgdG8gbGF1bmNoIGF1dG9tYXRpY2FsbHkuCi0gICAgICA8L2ludHJvPgotICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgWW91IGp1c3QganVzdCBnZW5lcmF0ZWQgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IQotICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICA8dGFzayBraW5kPSJjaGVhdHNoZWV0IiBuYW1lPSJJbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgUnVudGltZSIgc2tpcD0idHJ1ZSI+Ci0gICAgICAgICA8aW50cm8+Ci0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBydW50aW1lIGluIHRoZSB3b3JrYmVuY2guCi08YnIvPgotPGJyLz4KLUlmIHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgaW4gdGhlIHdvcmtiZW5jaCB5b3UgbWF5IHNraXAgdGhpcyB0YXNrIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtTa2lwIHRoaXMgdGFzayZxdW90OyBidXR0b24uCi0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgIFlvdSBqdXN0IGluc3RhbGxlZCBhbmQgY29uZmlndXJlZCB0aGUgQXBhY2hlIENYRiBydW50aW1lIQotICAgICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9ImNvbmZpZ3VyZS1jeGYtcnVudGltZS54bWwiPgotICAgICAgICAgPC9wYXJhbT4KLSAgICAgIDwvdGFzaz4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9IkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXMiIHNraXA9InRydWUiPgotICAgICAgICAgPGludHJvPgotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBjcmVhdGUgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBlbmFibGUgaXQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BlbW50LgotPGJyLz4KLTxici8+Ci1JZiB5b3UgYWxyZWFkeSBoYXZlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBlbmFibGVkIGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB5b3UgbWF5IHNraXAgdGhpcyB0YXNrIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtTa2lwIHRoaXMgdGFzayZxdW90OyBidXR0b24uCi0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgIFlvdSBqdXN0IGNyZWF0ZWQgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBlbmFibGVkIGl0IGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCEKLSAgICAgICAgIDwvb25Db21wbGV0aW9uPgotICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSJjcmVhdGUtY3hmLXByb2plY3QueG1sIj4KLSAgICAgICAgIDwvcGFyYW0+Ci0gICAgICA8L3Rhc2s+Ci0gICAgICA8dGFzayBraW5kPSJjaGVhdHNoZWV0IiBuYW1lPSJHZW5lcmF0ZSBhIEpBWC1XUyBjbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRiIgc2tpcD0iZmFsc2UiPgotICAgICAgICAgPGludHJvPgotICAgICAgICAgICAgPGI+SW50cm9kdWN0aW9uPC9iPgotICAgICAgICAgPC9pbnRybz4KLSAgICAgICAgIDxvbkNvbXBsZXRpb24+Ci0gICAgICAgICAgICA8Yj5Db25jbHVzaW9uPC9iPgotICAgICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9ImNyZWF0ZS1jbGllbnQtY3hmLnhtbCI+Ci0gICAgICAgICA8L3BhcmFtPgotICAgICAgPC90YXNrPgotICAgPC90YXNrR3JvdXA+Ci08L2NvbXBvc2l0ZUNoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvdG9wZG93bi1jeGYtY29tcG9zaXRlLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy90b3Bkb3duLWN4Zi1jb21wb3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjQ5ODhkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy90b3Bkb3duLWN4Zi1jb21wb3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb3NpdGVDaGVhdHNoZWV0IG5hbWU9IkdlbmVyYXRpbmcgYSBKQVgtV1MgU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRiI+Ci0gICA8dGFza0dyb3VwIGtpbmQ9InNldCIgbmFtZT0iR2VuZXJhdGluZyBhIEpBWC1XUyBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGIiBza2lwPSJmYWxzZSI+Ci0gICAgICA8aW50cm8+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZ3VpZGUgeW91IHRocm91Z2ggdGhlIGluZGl2aWR1YWwgc3RlcHMgdG8gc2V0dXAgdGhlIEFwYWNoZSBDWEYgcnVudGltZSwgY3JlYXRlIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyLCAgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGVuYWJsZWQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50ICBhbmQgZ2VuZXJhdGUgYSBhIGZ1bGx5IGFubm90YXRlZCBKQVgtV1MgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudC4gCi0gICAgICAgICA8YnIvPgotICAgICAgICAgPGJyLz4KLVRvIGFzc2lzdCB5b3UgYWxvbmcgdGhlIHdheSwgd2l6YXJkcyBhbmQgY29tbWFuZHMgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHlvdSB0byBsYXVuY2ggYXV0b21hdGljYWxseS4KLSAgICAgIDwvaW50cm8+Ci0gICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISBZb3UganVzdCBjb25maWd1cmVkIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUsIGNyZWF0ZWQgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIsIGEgRHluYW1pYyBXZWIgUHJvamVjdCBlbmFibGVkIGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wZW1udCBhbmQgZ2VuZXJhdGVkIGEgSkFYLVdTIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQuCi0gICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9Ikluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBSdW50aW1lIiBza2lwPSJ0cnVlIj4KLSAgICAgICAgIDxpbnRybz4KLSAgICAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gaW5zdGFsbCBhbmQgY29uZmlndXJlIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgaW4gdGhlIHdvcmtiZW5jaC4KLTxici8+Ci08YnIvPgotSWYgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBpbiB0aGUgd29ya2JlbmNoIHlvdSBtYXkgc2tpcCB0aGlzIHRhc2sgYnkgY2xpY2tpbmcgdGhlICZxdW90O1NraXAgdGhpcyB0YXNrJnF1b3Q7IGJ1dHRvbi4KLSAgICAgICAgIDwvaW50cm8+Ci0gICAgICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISAgWW91IGp1c3QgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUhCi0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY29uZmlndXJlLWN4Zi1ydW50aW1lLnhtbCI+Ci0gICAgICAgICA8L3BhcmFtPgotICAgICAgPC90YXNrPgotICAgICAgPHRhc2sga2luZD0iY2hlYXRzaGVldCIgbmFtZT0iSW5zdGFsbCBhbmQgY3JlYXRlIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyIiBza2lwPSJ0cnVlIj4KLSAgICAgICAgIDxpbnRybz4KLSAgICAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gaW5zdGFsbCBhbmQgY3JlYXRlIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyLgotPGJyLz4KLTxici8+Ci1JZiB5b3UgaGF2ZSBhbHJlYWR5IGluc3RhbGxlZCBhbmQgY3JlYXRlZCBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciB5b3UgbWF5IHNraXAgdGhpcyB0YXNrIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtTa2lwIHRoaXMgdGFzayZxdW90OyBidXR0b24uCi0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgIFlvdSBqdXN0IGluc3RhbGxlZCBhbmQgY3JlYXRlZCBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciEKLSAgICAgICAgIDwvb25Db21wbGV0aW9uPgotICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSJjcmVhdGUtdG9tY2F0LXNlcnZlci54bWwiPgotICAgICAgICAgPC9wYXJhbT4KLSAgICAgIDwvdGFzaz4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9IkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXMiIHNraXA9InRydWUiPgotICAgICAgICAgPGludHJvPgotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBjcmVhdGUgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBlbmFibGUgaXQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BlbW50LgotPGJyLz4KLTxici8+Ci1JZiB5b3UgYWxyZWFkeSBoYXZlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBlbmFibGVkICBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgeW91IG1heSBza2lwIHRoaXMgdGFzayBieSBjbGlja2luZyB0aGUgJnF1b3Q7U2tpcCB0aGlzIHRhc2smcXVvdDsgYnV0dG9uLgotICAgICAgICAgPC9pbnRybz4KLSAgICAgICAgIDxvbkNvbXBsZXRpb24+Ci0gICAgICAgICAgICBDb25ncmF0dWxhdGlvbnMhICBZb3UganVzdCBjcmVhdGVkIGEgRHluYW1pYyBXZWIgUHJvamVjdCBhbmQgZW5hYmxlZCBpdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQhCi0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY3JlYXRlLWN4Zi1wcm9qZWN0LnhtbCI+Ci0gICAgICAgICA8L3BhcmFtPgotICAgICAgPC90YXNrPgotICAgICAgPHRhc2sga2luZD0iY2hlYXRzaGVldCIgbmFtZT0iR2VuZXJhdGUgYSBKQVgtV1MgU0VJIGFuZCBhIHNrZWxldG9uICBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYiIHNraXA9ImZhbHNlIj4KLSAgICAgICAgIDxpbnRybz4KLSAgICAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gZ2VuZXJhdGUgIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgYW5kIGEgc2tlbGV0b24gIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQuCi0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgWW91IGp1c3QgZ2VuZXJhdGVkIGEgSkFYLVdTIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQuCi0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY3JlYXRlLXRvcERvd24tY3hmLnhtbCI+Ci0gICAgICAgICA8L3BhcmFtPgotICAgICAgPC90YXNrPgotICAgPC90YXNrR3JvdXA+Ci08L2NvbXBvc2l0ZUNoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL3F1aWNrc3RhcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTllMGEzYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPlF1aWNrIFN0YXJ0PC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BcGFjaGUgQ1hGIFF1aWNrIFN0YXJ0PC9oMj4KLTxwPlRyeSBvdXQgdGhlIGZvbGxvd2luZyBjaGVhdCBzaGVldHMgdG8gaGVscCB5b3UgcXVpY2tseSBzdGFydCB1c2luZyBKQVgtV1MgVG9vbHMgYW5kIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgdG8gY3JlYXRlIFdlYiBzZXJ2aWNlIGFwcGxpY2F0aW9ucy48L3A+Ci08YnI+Ci08YSBjbGFzcz0iY29tbWFuZC1saW5rIiBocmVmPSdqYXZhc2NyaXB0OmV4ZWN1dGVDb21tYW5kKCJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5vcGVuQ2hlYXRTaGVldChjaGVhdFNoZWV0SWQ9b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmN4Zi5ib3R0b211cCkiKSc+Ci0gICAgCQk8aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIGJvdHRvbXVwIGNoZWF0IHNoZWV0Ij48c3Ryb25nPkNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGPC9zdHJvbmc+PC9hPgotPGJyPgotPGJyPgotPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMub3BlbkNoZWF0U2hlZXQoY2hlYXRTaGVldElkPW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jeGYudG9wZG93bikiKSc+Ci0gICAgCQk8aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRvcGRvd24gY2hlYXQgc2hlZXQiPjxzdHJvbmc+R2VuZXJhdGluZyBhIEpBWC1XUyBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGPC9zdHJvbmc+PC9hPgotPGJyPgotPGJyPgotPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMub3BlbkNoZWF0U2hlZXQoY2hlYXRTaGVldElkPW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jeGYudG9wZG93bi5jbGllbnQpIiknPgotICAgIAkJPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiBjbGllbnQgY2hlYXQgc2hlZXQiPjxzdHJvbmc+R2VuZXJhdGluZyBhIEpBWC1XUyBjbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvc3Ryb25nPjwvYT4KLTxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvaW1hZ2VzL25ncmVsYy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvaW1hZ2VzL25ncmVsYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2MWUzYWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2ltYWdlcy9uZ3JlbGMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHIucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzI2ZjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9pbWFnZXMvbmdyZWxyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9pbWFnZXMvbmdyZWx0LnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9pbWFnZXMvbmdyZWx0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzRiZWUyYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvaW1hZ2VzL25ncmVsdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvbGVnYWwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9sZWdhbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMDUxNzk4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9sZWdhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+TGVnYWw8L3RpdGxlPgotCTxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvbGl2ZWhlbHAuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+TGVnYWw8L2gyPgotPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA5LCBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9wPgotPHA+VGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQ6PC9wPgotPHA+PGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPjwvY29kZT48L3A+Ci08cD48YSBocmVmPSJhYm91dC5odG1sIj5UZXJtcyBhbmQgY29uZGl0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiB0aGlzIGd1aWRlLjwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZGQwNmU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9Q1hGIFdlYiBzZXJ2aWNlcyBVc2VyIEd1aWRlCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1jaGVhdHNoZWV0LmN4Zi5ib3R0b211cC5jb21wb3NpdGU9Q3JlYXRpbmcgYSBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBiZWFuIHVzaW5nIEFwYWNoZSBDWEYKLWNoZWF0c2hlZXQuY3hmLnRvcGRvd24uY29tcG9zaXRlPUdlbmVyYXRpbmcgYW4gU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRgotY2hlYXRzaGVldC5jeGYudG9wZG93bi5jbGllbnQuY29tcG9zaXRlPUdlbmVyYXRpbmcgYSBKQVgtV1MgV2ViIFNlcnZpY2UgQ2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmNDk1ZjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgPHRvYyBmaWxlPSJ0b2NnZXR0aW5nc3RhcnRlZC54bWwiLz4KLSAgICAgIDx0b2MgZmlsZT0idG9jdGFza3MueG1sIi8+Ci0gICAgICA8dG9jIGZpbGU9InRvY3JlZmVyZW5jZS54bWwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCI+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cyIKLSAgICAgICAgICAgIGNvbXBvc2l0ZT0idHJ1ZSIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2JvdHRvbVVwLWN4Zi1jb21wb3NpdGUueG1sIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jeGYuYm90dG9tdXAiCi0gICAgICAgICAgICBuYW1lPSIlY2hlYXRzaGVldC5jeGYuYm90dG9tdXAuY29tcG9zaXRlIj4KLSAgICAgIDwvY2hlYXRzaGVldD4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzIgotICAgICAgICAgICAgY29tcG9zaXRlPSJ0cnVlIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvdG9wZG93bi1jeGYtY29tcG9zaXRlLnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY3hmLnRvcGRvd24iCi0gICAgICAgICAgICBuYW1lPSIlY2hlYXRzaGVldC5jeGYudG9wZG93bi5jb21wb3NpdGUiPgotICAgICAgPC9jaGVhdHNoZWV0PgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MiCi0gICAgICAgICAgICBjb21wb3NpdGU9InRydWUiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9nZW5lcmF0ZS1jeGYtd3NkbC1jbGllbnQtY29tcG9zaXRlLnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY3hmLnRvcGRvd24uY2xpZW50IgotICAgICAgICAgICAgbmFtZT0iJWNoZWF0c2hlZXQuY3hmLnRvcGRvd24uY2xpZW50LmNvbXBvc2l0ZSI+Ci0gICAgICA8L2NoZWF0c2hlZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2N4Zl9mYWNldC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjAxNDc2OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2N4Zl9mYWNldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkNYRiBQcm9qZWN0IEZhY2V0PC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5DWEYgUHJvamVjdCBGYWNldDwvaDI+Ci08cD5GYWNldHMgY2FuIGJlIHRob3VnaHQgb2YgYXMgdW5pdHMgb2YgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIGZhY2V0IGJhc2VkIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UuPC9wPgotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZmFjZXRzIHNlZSB0aGUgPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jZmFjZXRzLmh0bWwiPldUUCBQcm9qZWN0IEZhY2V0cyBkb2N1bWVudGF0aW9uPC9hPi48L3A+Ci08cD5KQVgtV1MgVG9vbHMgcHJvdmlkZXMgdGhlIENYRiBGYWNldCB0aGF0IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgd2hlbiBpbnN0YWxsZWQgb24gYSBEeW5hbWljIFdlYiBQcm9qZWN0OjwvcD4KLTx1bD4KLSAgPGxpPkNvbmZpZ3VyZXMgdGhlIHByb2plY3Qgd2l0aCB0aGUgQ1hGIENsYXNzcGF0aCBDb250YWluZXIuPC9saT4KLSAgPGxpPkNvbmZpZ3VyZXMgdGhlIHByb2plY3Qgd2l0aCB0aGUgQ1hGIEpBWC1XUyBlbmRwb2ludCBjb25maWd1cmF0aW9uIG9wdGlvbiB0aGF0IGlzIHNlbGVjdGVkIGluIHRoZSA8YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvZW5kcG9pbnRfY29uZmlnX3RhYi5odG1sIj5FbmRwb2ludCBDb25maWc8L2E+IHByZWZlcmVuY2VzLjwvbGk+Ci0gIDxsaT5FbmFibGVzIEpBWC1XUyBBbm5vdGF0aW9uIHByb2Nlc3NpbmcgaWYgdGhlIG9wdGlvbiBpcyBzZWxlY3RlZCBpbiB0aGUgPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2pheHdzX3RhYi5odG1sIj5KQVgtV1M8L2E+IHByZWZlcmVuY2VzLjwvbGk+Ci08L3VsPgotPHA+VGhlIENYRiBGYWNldCBoYXMgdGhlIGZvbGxvd2luZyBmYWNldCBwcmVyZXF1aXNpdGVzOjwvcD4KLTx1bD4KLSAgPGxpPkR5bmFtaWMgV2ViIE1vZHVsZSB2ZXJzaW9uIDIuNTwvbGk+Ci0gIDxsaT5KYXZhIHZlcnNpb24gNS4wIG9yIGdyZWF0ZXI8L2xpPgotPC91bD4KLTxwPlRoZSBDWEYgRmFjZXQgYW5kIGl0J3MgcHJlcmVxdWlzaXRlcyBhcmUgZ3JvdXBlZCBpbnRvIGEgcHJvamVjdCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlIHNlbGVjdGVkIHdoZW4gY3JlYXRpbmcgYSBEeW5hbWljIFdlYiBQcm9qZWN0LjwvcD4KLQotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIj5DcmVhdGluZyBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXM8L2E+PGJyPgotPGEgaHJlZj0iLi4vdGFza3MvaW5zdGFsbF9jeGZfZmFjZXQuaHRtbCI+SW5zdGFsbCB0aGUgQ1hGIFByb2plY3QgRmFjZXQ8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvZW5kcG9pbnRfY29uZmlnX3RhYi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9lbmRwb2ludF9jb25maWdfdGFiLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlZTllNjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9lbmRwb2ludF9jb25maWdfdGFiLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+SkFYLVdTIEVuZHBvaW50IENvbmZpZ3VyYXRpb24gUHJlZmVyZW5jZXM8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVuZHBvaW50IENvbmZpZyBQcmVmZXJlbmNlczwvaDI+Ci08cD5UaGUgPHN0cm9uZz5FbmRwb2ludCBDb25maWc8L3N0cm9uZz4gdGFiIHByb3ZpZGVzIHNldHRpbmcgdGhhdCBjb250cm9sIHRoZSB0eXBlIG9mIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gdGhhdCB3ZWIgcHJvamVjdHMgYXJlIGNvbmZpZ3VyZWQgd2l0aCB3aGVuIHRoZSBDWEYgRmFjZXQgaXMgaW5zdGFsbGVkLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9zcHJpbmdfY29uZmlnLnBuZyIgYWx0PSJTcHJpbmcgQ29uZmlnIHRhYiIgPiA8L3A+Ci08cD48L3A+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBzdW1tYXJ5PSJKYXZhIHNlYXJjaCBhY3Rpb25zIj4KLSAgICAgIDx0aGVhZD4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5PcHRpb248L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+RGVzY3JpcHRpb248L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlZmF1bHQ8L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RoZWFkPgotCi0gICAgICA8dGJvZHk+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+VXNlIENYRiBTZXJ2bGV0PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+Q3JlYXRlcyBhIGN4Zi1zZXJ2bGV0LnhtbCBmaWxlIGluIHRoZSBXZWIgUHJvamVjdHMgV0VCLUlORiBkaXJlY3RvcnkuIFRoaXMgaXMgdGhlIHNsb3dlciBvcHRpb24gb2YgdGhlIHR3byBhcyBpdCBsb2FkcyBhbGwgcG9zc2libGUgQ1hGIG1vZHVsZXMgZm9yIGFuIGVuZHBvaW50PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5DcmVhdGVzIGEgYmVhbnMueG1sIGZpbGUgaW4gdGhlIFdlYiBQcm9qZWN0cyBXRUItSU5GIGRpcmVjdG9yeS4gVGhpcyBpcyB0aGUgZmFzdGVzdCBvcHRpb24gYXMgaXQgYWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIHdoaWNoIENYRiBtb2R1bGVzIHRvIGxvYWQgZm9yIGFuIGVuZHBvaW50PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+dHJ1ZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90Ym9keT4KLSAgICA8L3RhYmxlPgotICAgIAotPHA+RHVyaW5nIGJvdHRvbS11cCBhbmQgdG9wLWRvd24gd2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IHRoZSBlbmRwb2ludCBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIHdlYiBwcm9qZWN0IGlzIHVwZGF0ZWQgd2l0aCBhIGpheHdzOmVuZHBvaW50IGVsZW1lbnQgZm9yIHRoZSBnZW5lcmF0ZWQgd2ViIHNlcnZpY2UuPC9wPgotCi08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbCI+Q1hGIFByb2plY3QgRmFjZXQ8L2E+PGJyPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIj5DcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzPC9hPjxicj4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9ib3R0b211cC5odG1sIj5DcmVhdGUgYSBXZWIgU2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX3RvcGRvd24uaHRtbCI+R2VuZXJhdGUgYW4gU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYXB0X3Byb2Nlc3NpbmcucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYXB0X3Byb2Nlc3NpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTJiZWM2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2FwdF9wcm9jZXNzaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2N4ZjJ4X3ByZWZlcmVuY2VzLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2N4ZjJ4X3ByZWZlcmVuY2VzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmZmMzdiOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9jeGYyeF9wcmVmZXJlbmNlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9jeGZfcnVudGltZV90YWIucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvY3hmX3J1bnRpbWVfdGFiLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzRiNmU3Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9jeGZfcnVudGltZV90YWIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvamF2YTJ3c190YWIucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvamF2YTJ3c190YWIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyODkwNjhhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2phdmEyd3NfdGFiLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2pheHdzX2Fubm90YXRpb25zLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2pheHdzX2Fubm90YXRpb25zLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDIxNjkwYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9qYXh3c19hbm5vdGF0aW9ucy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9zZXJ2ZXJfcnVudGltZS5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9zZXJ2ZXJfcnVudGltZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRmMDMwZjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvc2VydmVyX3J1bnRpbWUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvc3ByaW5nX2NvbmZpZy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9zcHJpbmdfY29uZmlnLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTU2NjQxNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9zcHJpbmdfY29uZmlnLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3dzZGwyamF2YS5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy93c2RsMmphdmEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MDJkNjRjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3dzZGwyamF2YS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy94amMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMveGpjLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmE3NzAyMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy94amMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9qYXZhMndzX3RhYi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9qYXZhMndzX3RhYi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMGE4MzNjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvamF2YTJ3c190YWIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+SmF2YTJXUyBQcmVmZXJlbmNlczwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+SmF2YTJXUyBQcmVmZXJlbmNlczwvaDI+Ci08cD5UaGUgPHN0cm9uZz5KYXZhMldTPC9zdHJvbmc+IHRhYiBwcm92aWRlcyBzZXR0aW5ncyB0aGF0IGNvbnRyb2wgdGhlIENYRiBqYXZhMndzIHRvb2wgKGZvciBDWEYgMi4xLnggcnVudGltZXMgYW5kIGFib3ZlKS4gV2hlbiBhIENYRiAyLjAueCBydW50aW1lIGlzIHNlbGVjdGVkIHRoaXMgcGFnZSBkaXNwbGF5cyBhIHN1YnNldCBvZiB0aGUgYXZhaWxhYmxlIHNldHRpbmcgdGhhdCBwcm92aWRlcyBjb250cm9sIG9mIHRoZSBDWEYgamF2YTJ3c2RsIHRvb2wuPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2phdmEyd3NfdGFiLnBuZyIgYWx0PSJKYXZhMldTIHRhYiIgPiA8L3A+Ci08cD48L3A+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBzdW1tYXJ5PSJKYXZhIHNlYXJjaCBhY3Rpb25zIj4KLSAgICAgIDx0aGVhZD4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5PcHRpb248L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+RGVzY3JpcHRpb248L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlZmF1bHQ8L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RoZWFkPgotCi0gICAgICA8dGJvZHk+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+RGVmYXVsdCBGcm9udGVuZDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNwZWNpZmllcyB0aGUgZnJvbnQgZW5kIHRvIHVzZS4gQ3VycmVudGx5IG9ubHkgdGhlIGpheHdzIGZyb250IGVuZCBpcyBzdXBwb3J0ZWQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+amF4d3M8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkRlZmF1bHQgRGF0YWJpbmRpbmc8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TcGVjaWZpZXMgdGhlIGRhdGEgYmluZGluZyB0byB1c2UuIEN1cnJlbnRseSBvbmx5IHRoZSBqYXhiIGRhdGEgYmluZGluZyBpcyBzdXBwb3J0ZWQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5qYXhiPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBDbGllbnQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgYSBjbGllbnQgbWFpbmxpbmUgdXNpbmcgSkFYLVdTIEFQSXM8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkdlbmVyYXRlIFNlcnZlcjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBnZW5lcmF0ZSBhIHNlcnZlciBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJczwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIAotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBXcmFwcGVyIGFuZCBGYXVsdCBCZWFuczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBnZW5lcmF0ZSB3cmFwcGVyIGFuZCBmYXVsdCBiZWFuczwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIAotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+ICAgICAgICAKLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkdlbmVyYXRlIFdTREw8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgYSBXU0RMIGRvY3VtZW50PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPnRydWU8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkRlZmF1bHQgU09BUCBCaW5kaW5nPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U3BlY2lmeSB0aGUgU09BUCBiaW5kaW5nIHRvIGluY2x1ZGUgaW4gdGhlIGdlbmVyYXRlZCBXU0RMIGRvY3VtZW50LiBTT0FQIDEuMSBhbmQgU09BUCAxLjIgc3VwcG9ydGVkPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U09BUCAxLjE8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkdlbmVyYXRlIHNlcGFyYXRlIFhTRCBmb3IgdGhlIHR5cGVzPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIG91dHB1dCBzY2hlbWFzIHRvIHNlcGFyYXRlIGZpbGVzIHdoZW4gZ2VuZXJhdGluZyBhIFdTREwgZG9jdW1lbnQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgIDwvdGJvZHk+Ci0gICAgPC90YWJsZT4KLTxwPlRoZSBvcHRpb25zIG9uIHRoaXMgdGFiIGFyZSBwcmVzZW50ZWQgaW4gdGhlIHdlYiBzZXJ2aWNlcyB3aXphcmQgd2hlbiBjcmVhdGluZyBhIGJvdHRvbS11cCB3ZWIgc2VydmljZSB3aXRoIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUuPC9wPgotPHA+VGhlIG9wdGlvbnMgdGhlcmUgY2FuIGJlIGNoYW5nZWQgZnJvbSB0aGVpciBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHdlYiBzZXJ2aWNlIGJlaW5nIGNyZWF0ZWQuPC9wPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9ib3R0b211cC5odG1sIj5DcmVhdGUgYSBXZWIgU2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvamF4d3NfdGFiLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2pheHdzX3RhYi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjEzYzhiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvamF4d3NfdGFiLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+SkFYLVdTIFByZWZlcmVuY2VzPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5KQVgtV1MgUHJlZmVyZW5jZXM8L2gyPgotPHA+VGhlIDxzdHJvbmc+SkFYLVdTPC9zdHJvbmc+IHRhYiBwcm92aWRlcyBzZXR0aW5ncyB0aGF0IGNvbnRyb2wgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIEpBWC1XUyBhbm5vdGF0aW9ucyBhbmQgdGhlIGVuYWJsZW1lbnQgb2YgSkFYLVdTIGFubm90YXRpb24gdmFsaWRhdGlvbiBwcm9jZXNzaW5nLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9qYXh3c19hbm5vdGF0aW9ucy5wbmciIGFsdD0iSkFYV1MgQW5ub3RhdGlvbnMiID4gPC9wPgotPHA+U2VsZWN0IHRoZSBKQVgtV1MgYW5ub3RhdGlvbnMgdGhhdCBhcmUgYWRkZWQgYnkgZGVmYXVsdCB0byB0aGUgaW1wbGVtZW50YXRpb24gYmVhbiBvciBTRUkgYmVmb3JlIGlucHV0IHRvIHRoZSBDWEYgamF2YTJ3cyB0b29sLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9hcHRfcHJvY2Vzc2luZy5wbmciIGFsdD0iQVBUIFByb2Nlc3NpbmciPiA8L3A+Ci08cD5TZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIGFubm90YXRpb24gdmFsaWRhdGlvbiBwcm9jZXNzaW5nIGluIHdlYiBwcm9qZWN0cyB3aGVuIGNvbmZpZ3VyZWQgd2l0aCB0aGUgQ1hGIEZhY2V0LjwvcD4KLTxwPlRoZSBKRFQgQVBUIHByb2Nlc3NvcnMgcmVwb3J0IGVycm9ycywgd2FybmluZ3MgYW5kIGluZm9ybWF0aW9uIG1lc3NhZ2VzIGluIHRoZSBKYXZhIEVkaXRvciBhbmQgUHJvYmxlbXMgVmlldyB3aGVuIEpBWC1XUyBydWxlcyBhcmUgYnJva2VuLjwvcD4KLTxwPkFubm90YXRpb24gcHJvY2Vzc2luZyBjYW4gYmUgZW5hYmxlZCBhbmQgZGlzYWJsZWQgb24gYW55IEphdmEgYmFzZWQgcHJvamVjdCB1c2luZyB0aGUgQW5ub3RhdGlvbiBQcm9jZXNzaW5nIHByb3BlcnRpZXMgcGFnZSBvbiB0aGUgcHJvamVjdHMgY29udGV4dCBtZW51LjwvcD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9jb25maWd1cmluZ19qYXh3c19hbm5vdGF0aW9uX3Byb2Nlc3NpbmcuaHRtbCI+RW5hYmxlIEpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3Npbmc8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvcHJlZmVyZW5jZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvcHJlZmVyZW5jZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzkwMDc1YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3ByZWZlcmVuY2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+QXBhY2hlIENYRiAyLnggUHJlZmVyZW5jZXM8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvbGl2ZWhlbHAuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QXBhY2hlIENYRiAyLnggUHJlZmVyZW5jZXM8L2gyPgotPHA+SkFYLVdTIFRvb2xzIHByb3ZpZGVzIGEgcHJlZmVyZW5jZSBwYWdlIGZvciBzZXR0aW5nIHVwIGFuZCBjb25maWd1cmluZyB0aGUgQXBhY2hlIENYRiBydW50aW1lLjwvcD4KLTxwPlRoZSBDWEYgMi54IHByZWZlcmVuY2VzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgCi08YSBjbGFzcz0iY29tbWFuZC1saW5rIiBocmVmPSdqYXZhc2NyaXB0OmV4ZWN1dGVDb21tYW5kKCJvcmcuZWNsaXBzZS51aS53aW5kb3cucHJlZmVyZW5jZXMocHJlZmVyZW5jZVBhZ2VJZD1vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UpIiknPgotPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgQ1hGIDIueCBwcmVmZXJlbmNlIHBhZ2UiPgotPHN0cm9uZz5XaW5kb3cgJmd0OyBQcmVmZXJlbmNlcy4uLiAmZ3Q7IFdlYiBTZXJ2aWNlcyAmZ3Q7IENYRiAyLnggUHJlZmVyZW5jZXM8L3N0cm9uZz48L2E+IGZyb20gdGhlIHRvcCBsZXZlbCBtZW51LiA8L3A+Ci08cD48aW1nIHNyYz0iLi9pbWFnZXMvY3hmMnhfcHJlZmVyZW5jZXMucG5nIiBhbHQ9IkNYRiAyLnggUHJlZmVyZW5jZXMiID4gPC9wPgotPHA+VGhlIENYRiBSdW50aW1lIHRhYiBpcyB1c2VkIHRvIHBvaW50IHRvIHRoZSBpbnN0YWxsIGxvY2F0aW9uIG9mIGEgQ1hGIDIueCBydW50aW1lLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9jeGZfcnVudGltZV90YWIucG5nIiBhbHQ9IkNYRiAyLnggUHJlZmVyZW5jZXMiID4gPC9wPgotPHA+VGhlIDxzdHJvbmc+RXhwb3J0IHJ1bnRpbWUgbGlicmFyaWVzLi4uPC9zdHJvbmc+IG9wdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIGNvbnRyb2xzIHdoZXRoZXIgdGhlIENYRiBsaWJyYXJ5IGphciBmaWxlcyBhcmUgcmVzb2x2ZWQgaW50byB0aGUgV0VCLUlORi9saWIgZm9sZGVyIG9mIHRoZSB3ZWIgbW9kdWxlIGF0IGRlcGxveW1lbnQgdGltZS48L3A+Ci08cD5UaGlzIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBvbiBleGlzdGluZyBwcm9qZWN0cyB0aGF0IGFyZSBjb25maWd1cmVkIHdpdGggdGhlIENYRiBGYWNldCB1c2luZyB0aGUgSmF2YSBFRSBNb2R1bGUgRGVwZW5kZW5jaWVzIHByb3BlcnRpZXMgcGFnZS48L3A+Ci08cD5Gb3IgZGV0YWlscyBvbiB0aGUgb3RoZXIgQ1hGIDIueCBwcmVmZXJlbmNlcyB0YWJzLCByZWZlciB0byB0aGUgZm9sbG93aW5nIGRvY3VtZW50czo8L3A+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJqYXZhMndzX3RhYi5odG1sIj5KYXZhMldTPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJ3c2RsMmphdmFfdGFiLmh0bWwiPldTREwySmF2YTwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iamF4d3NfdGFiLmh0bWwiPkpBWC1XUzwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iZW5kcG9pbnRfY29uZmlnX3RhYi5odG1sIj5FbmRwb2ludCBDb25maWc8L2E+PC9saT4KLTwvdWw+Ci1Gb3IgaW5mb3JtYXRpb24gb24gc2V0dGluZyBBcGFjaGUgQ1hGIGFzIHRoZSBkZWZhdWx0IFdlYiBzZXJ2aWNlcyBydW50aW1lLCByZWZlciB0byB0aGlzIGRvY3VtZW50LgotPHVsPgotICA8bGk+PGEgaHJlZj0ic2VydmVyX3J1bnRpbWUuaHRtbCI+U2VydmVyIGFuZCBSdW50aW1lPC9hPjwvbGk+Ci08L3VsPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi9yZWZlcmVuY2UvY3hmX2ZhY2V0Lmh0bWwiPkNYRiBQcm9qZWN0IEZhY2V0PC9hPjxicj4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9tYW5hZ2VfY3hmX2xpYl9leHBvcnQuaHRtbCI+TWFuYWdlIHRoZSBleHBvcnRpbmcgb2YgQ1hGIGxpYnJhcmllcyBhdCBkZXBsb3ltZW50IHRpbWU8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2Uvc2VydmVyX3J1bnRpbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2Uvc2VydmVyX3J1bnRpbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGUxNzY5ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3NlcnZlcl9ydW50aW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+U2VydmVyIGFuZCBSdW50aW1lPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5TZXJ2ZXIgYW5kIFJ1bnRpbWU8L2gyPgotQXBhY2hlIENYRiBjYW4gYmUgc2V0IGFzIHRoZSBkZWZhdWx0IFdlYiBzZXJ2aWNlcyBydW50aW1lIHNlbGVjdGlvbiBpbiB0aGUgV2ViIHNlcnZpY2VzIHdpemFyZHMgdXNpbmcgdGhlIFNlcnZlciBhbmQgUnVudGltZSBwcmVmZXJlbmNlIHBhZ2UuCi08cD5UaGUgU2VydmVyIGFuZCBSdW50aW1lIHByZWZlcmVuY2UgcGFnZSBjYW4gYmUgYWNjZXNzZWQgdmlhIAotPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkud2luZG93LnByZWZlcmVuY2VzKHByZWZlcmVuY2VQYWdlSWQ9b3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLlNlcnZlclJ1bnRpbWVQcmVmZXJlbmNlUGFnZSkiKSc+Ci08aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBDWEYgMi54IHByZWZlcmVuY2UgcGFnZSI+Ci08c3Ryb25nPldpbmRvdyAmZ3Q7IFByZWZlcmVuY2VzLi4uICZndDsgV2ViIFNlcnZpY2VzICZndDsgU2VydmVyIGFuZCBSdW50aW1lPC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudS4gPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3NlcnZlcl9ydW50aW1lLnBuZyIgYWx0PSJTZXJ2ZXIgYW5kIFJ1bnRpbWUiID4gPC9wPgotPHA+U2VsZWN0IDxiPkFwYWNoZSBDWEYgMi54PC9iPiBpbiB0aGUgPGI+V2ViIHNlcnZpY2UgcnVudGltZTwvYj4gZHJvcCBkb3duIGxpc3QgYW5kIGNsaWNrIDxiPk9LPC9iPi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3dzZGwyamF2YV90YWIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2Uvd3NkbDJqYXZhX3RhYi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDIzY2VhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2Uvd3NkbDJqYXZhX3RhYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5XU0RMMkphdmEgUHJlZmVyZW5jZXM8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPldTREwySmF2YSBQcmVmZXJlbmNlczwvaDI+Ci08cD5UaGUgPHN0cm9uZz5XU0RMMkphdmE8L3N0cm9uZz4gdGFiIHByb3ZpZGVzIHNldHRpbmdzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIHRoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgQ1hGIHdzZGwyamF2YSB0b29sLgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3dzZGwyamF2YS5wbmciIGFsdD0iSmF2YTJXUyB0YWIiID4gPC9wPgotPHA+PC9wPgotICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgc3VtbWFyeT0iSmF2YSBzZWFyY2ggYWN0aW9ucyI+Ci0gICAgICA8dGhlYWQ+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+T3B0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlc2NyaXB0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlZmF1bHQ8L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RoZWFkPgotCi0gICAgICA8dGJvZHk+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+R2VuZXJhdGUgU2VydmVyPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGEgc2VydmVyIG1haW5saW5lPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGFuIGltcGxlbWVudGF0aW9uIGJlYW48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGdlbmVyYXRlZCBhcnRpZmFjdHM8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGEgZ2VuZXJhdGVkIGNsaWVudCBhbmQgaW1wbGVtZW50YXRpb248L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5FbmFibGUgcHJvY2Vzc2luZyBvZiBpbXBsaWNpdCBTT0FQIGhlYWRlcnM8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZW5hYmxlIHRoZSBwcm9jZXNzaW5nIG9mIG9mIFNPQVAgaGVhZGVycyBkZWZpbmVkIGluIHRoZSB3c2RsOmJpbmRpbmc8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5FbmFibGUgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmc8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZW5hYmxlIHRoZSBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IG5hbWVwc2FjZSBwYWNrYWdlIG5hbWUgbWFwcGluZzwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPnRydWU8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4gICAgICAgIAotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+RW5hYmxlIHRoZSB1c2Ugb2YgdGhlIGRlZmF1bHQgZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmc8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZW5hYmxlIHRoZSBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+dHJ1ZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+RW5hYmxlIEF1dG8gTmFtZSBSZXNvbHV0aW9uPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSBuYW1pbmcgY29uZmxpY3RzIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSB1c2Ugb2YgYmluZGluZyBjdXN0b21pemF0aW9uczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5Vc2UgdGhlIEFwYWNoZSBDWEYgcHJvcHJpZXRhcnkgV1MtQWRkcmVzc2luZyB0eXBlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIHRoZSBvbGRlciBDWEYgcHJvcHJpZXRhcnkgV1MtQWRkcmVzc2luZyB0eXBlcyBpbnN0ZWFkIG9mIHRoZSBKQVgtV1MgMi4xIGNvbXBsaWFudCBXUy1BZGRyZXNzaW5nIHR5cGVzLiBVc2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggQ1hGIDIuMDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSBYSkMgcHJvY2Vzc29yLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy94amMucG5nIiBhbHQ9IkphdmEyV1MgdGFiIiA+IDwvcD4KLTxwPjwvcD4KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIHN1bW1hcnk9IkphdmEgc2VhcmNoIGFjdGlvbnMiPgotICAgICAgPHRoZWFkPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPk9wdGlvbjwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5EZXNjcmlwdGlvbjwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5EZWZhdWx0PC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90aGVhZD4KLQotICAgICAgPHRib2R5PgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPi1YZHY8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gaW5pdGlhbGl6ZSBmaWVsZHMgbWFwcGVkIGZyb20gZWxlbWVudHMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD4tWHRzPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGFjdGl2YXRlIHBsdWdpbiB0byBhZGQgYSB0b1N0cmluZygpIG1ldGhvZCB0byBnZW5lcmF0ZWQgY2xhc3NlczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+ICAgICAgICAgCi0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD4tWHRzOnN0eWxlOm11bHRpbGluZTwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBoYXZlIHRvU3RyaW5nIHByb2R1Y2UgbXVsdGkgbGluZSBvdXRwdXQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+LVh0czpzdHlsZTpzaW1wbGU8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gaGF2ZSB0b1N0cmluZyBwcm9kdWNlIHNpbmdsZSBsaW5lIHRlcnNlIG91dHB1dDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIAotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPi1YbG9jYXRvcjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBlbmFibGUgc291cmNlIGxvY2F0aW9uIHN1cHBvcnQgZm9yIGdlbmVyYXRlZCBjb2RlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4gICAgICAgIAotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+LVhzeW5jLW1ldGhvZHM8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgYWNjZXNzb3IgbWV0aG9kcyB3aXRoIHRoZSAnc3luY2hyb25pemVkJyBrZXl3b3JkPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPi1tYXJrLWdlbmVyYXRlZDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBhZGQgQEdlbmVyYXRlZCBhbm5vdGF0aW9ucyB0byB0aGUgZ2VuZXJhdGVkIGNvZGU8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci0KLTxwPlRoZSBvcHRpb25zIG9uIHRoaXMgdGFiIGFyZSBwcmVzZW50ZWQgaW4gdGhlIHdlYiBzZXJ2aWNlcyB3aXphcmQgd2hlbiBjcmVhdGluZyBhIHRvcC1kb3duIHdlYiBzZXJ2aWNlIHdpdGggdGhlIEFwYWNoZSBDWEYgcnVudGltZS48L3A+Ci08cD5UaGUgb3B0aW9ucyB0aGVyZSBjYW4gYmUgY2hhbmdlZCBmcm9tIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgd2ViIHNlcnZpY2UgYmVpbmcgY3JlYXRlZC48L3A+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX3RvcGRvd24uaHRtbCI+R2VuZXJhdGUgYW4gU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NvbmZpZ3VyaW5nX2pheHdzX2Fubm90YXRpb25fcHJvY2Vzc2luZy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NvbmZpZ3VyaW5nX2pheHdzX2Fubm90YXRpb25fcHJvY2Vzc2luZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOWVhNjNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jb25maWd1cmluZ19qYXh3c19hbm5vdGF0aW9uX3Byb2Nlc3NpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkNvbmZpZ3VyaW5nIEpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3Npbmc8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVuYWJsZSBKQVgtV1MgQW5ub3RhdGlvbiBQcm9jZXNzaW5nPC9oMj4KLTxwPklmIHRoZSA8c3Ryb25nPkVuYWJsZSBhbm5vdGF0aW9uIHZhbGlkYXRpb24gcHJvY2Vzc2luZzwvc3Ryb25nPiBzZXR0aW5nIG9uIHRoZSA8YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvamF4d3NfdGFiLmh0bWwiPkpBWC1XUzwvYT4gdGFiIGluCi10aGUgQXBhY2hlIENYRiAyLnggcHJlZmVyZW5jZXMgaXMgc2VsZWN0ZWQsIGFubm90YXRpb24gcHJvY2Vzc2luZyB3aWxsIGJlIGVuYWJsZWQgb24gcHJvamVjdHMgb24gYXMgcGFydCBvZiB0aGUgQ1hGIEZhY2V0IGluc3RhbGwuPC9wPgotCi08aDM+RW5hYmxpbmcgRXhpc3RpbmcgUHJvamVjdHM8L2gzPgotVG8gdHVybiBhbm5vdGF0aW9uIHByb2Nlc3Npbmcgb24gb3Igb2ZmIG9uIGFuIGV4aXN0aW5nIHByb2plY3QgcmlnaHQtY2xpY2sgb24gdGhlIHByb2plY3QgYW5kIGNob29zZSA8Yj5Qcm9wZXJ0aWVzPC9iPiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuIAotIE9uIHRoZSA8c3Ryb25nPkphdmEgQ29tcGlsZXIgPiBBbm5vdGF0aW9uIFByb2Nlc3Npbmc8L3N0cm9uZz4gcHJvcGVydGllcyBwYWdlIHNlbGVjdCBvciBkZXNlbGVjdCB0aGUgPHN0cm9uZz5FbmFibGUgQW5ub3RhdGlvbiBQcm9jZXNzaW5nPC9zdHJvbmc+IGNoZWNrIGJveCBhbmQgdGhlbiBjbGljayA8Yj5PSzwvYj4uCi08cD48aW1nIHNyYz0iLi9pbWFnZXMvYW5ub3RhdGlvbl9wcm9jZXNzaW5nLnBuZyIgYWx0PSJBbm5vdGF0aW9uIFByb2Nlc3NpbmciID4gPC9wPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvY3hmX2ZhY2V0Lmh0bWwiPkNYRiBQcm9qZWN0IEZhY2V0PC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2JvdHRvbXVwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2JvdHRvbXVwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzZTVkMzQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9ib3R0b211cC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5DcmVhdGUgYSBXZWIgU2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIEFwYWNoZSBDWEY8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvbGl2ZWhlbHAuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+Q3JlYXRlIGEgV2ViIFNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGPC9oMj4KLTxoMz5QcmVyZXF1aXNpdGVzOjwvaDM+Ci08b2w+Ci08bGk+SW5zdGFsbCBhbmQgY29uZmlndXJlIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgZW52aXJvbm1lbnQuIFNlZSB0aGUgPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9yZXF1aXJlbWVudHMuaHRtbCI+UmVxdWlyZW1lbnRzIGFuZCBJbnN0YWxsYXRpb248L2E+IHBhZ2UgZm9yIG1vcmUgZGV0YWlscy48L2xpPgotPGxpPkNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZSBpdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgYXMgZGVzY3JpYmVkIGhlcmU6IDxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIj5DcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzPC9hPi48L2xpPgotPGxpPkNyZWF0ZSBvciBpbXBvcnQgYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gaW50byB0aGUgc291cmNlIGZvbGRlciBvZiB0aGUgRHluYW1pYyBXZWIgUHJvamVjdC48L2xpPgotPC9vbD4KLVRvIGNyZWF0ZSBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBlbnZpcm9ubWVudDoKLTxvbD4KLTxsaT5TZWxlY3QgPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZShvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMuc2hvd1BlcnNwZWN0aXZlLnBlcnNwZWN0aXZlSWQ9b3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlKSIpJz4KLQk8aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlIj48c3Ryb25nPldpbmRvdyAmZ3Q7IE9wZW4gUGVyc3BlY3RpdmUgJmd0OyBKYXZhIEVFPC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudSB0byBzd2l0Y2ggdG8gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUuPC9saT4KLTxsaT5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHNlbGVjdCB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHRoYXQgeW91IGNyZWF0ZWQgb3IgaW1wb3J0ZWQgaW50byB0aGUgRHluYW1pYyBXZWIgUHJvamVjdHMgc291cmNlIGZvbGRlci48L2xpPgotPGxpPk9wZW4gdGhlIFdlYiBTZXJ2aWNlIHdpemFyZCBieSBzZWxlY3RpbmcgPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkKSIpJz4KLTxpbWcgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9jb21tYW5kX2xpbmsucG5nIiBhbHQ9Ik9wZW4gdGhlIG5ldyB3ZWIgc2VydmljZSB3aXphcmQiPjxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyLi4uICZndDsgV2ViIFNlcnZpY2VzICZndDsgV2ViIFNlcnZpY2U8L3N0cm9uZz48L2E+IGZyb20gdGhlIHRvcCBsZXZlbCBtZW51LjwvbGk+Ci08bGk+V2ViIFNlcnZpY2VzIHBhZ2U6IHNlbGVjdCA8Yj5Cb3R0b20gdXAgSmF2YSBiZWFuIFdlYiBTZXJ2aWNlPC9iPiBhcyB0aGUgV2ViIHNlcnZpY2UgdHlwZSBhbmQgYnJvd3NlIHRvIHNlbGVjdCB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gd2hpY2ggdG8gY3JlYXRlIHRoZSBXZWIgc2VydmljZTo8cD48aW1nIHNyYz0iLi9pbWFnZXMvYm90dG9tX3VwX3dpemFyZC5wbmciIGFsdD0iQm90dG9tIFVwIFdlYiBTZXJ2aWNlcyBXaXphcmQiID48L3A+Ci08b2wgdHlwZT0iYSI+Ci08bGk+TW92ZSB0aGUgc2VydmljZSBzbGlkZXIgdG8gdGhlIHN0YWdlIG9mIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB0aGF0IHlvdSB3aXNoIHRvIGNvbXBsZXRlLjwvbGk+Ci08dWw+Ci08bGk+RGV2ZWxvcDogSW52b2tlcyB0aGUgQXBhY2hlIENYRiBqYXZhMndzIHRvb2wgdXNpbmcgdGhlIHByZWZlcmVuY2UgZGVmYXVsdHMgYW5kIHRoZSBpbmZvcm1hdGlvbiBnYXRoZXJlZCBpbiB0aGUgd2l6YXJkIHRvIGNyZWF0ZSBhIHNlcnZpY2UuIFRoZSB3aXphcmQgYWxzbyBnZW5lcmF0ZXMgYSBKQVgtV1MgZW5kcG9pbnQgY29uZmlndXJhdGlvbiBmaWxlLjwvbGk+Ci08bGk+QXNzZW1ibGU6IElmIHJlcXVpcmVkIGJ5IHRoZSB0YXJnZXQgc2VydmVyIHRoaXMgcGhhc2UgYXNzZW1ibGVzIGFuZCBjb25maWd1cmVzIHRoZSBwcm9qZWN0IHRoYXQgaG9zdHMgdGhlIFdlYiBzZXJ2aWNlIGludG8gYW4gRUFSLjwvbGk+Ci08bGk+RGVwbG95OiBHZW5lcmF0ZXMgdGhlIGRlcGxveW1lbnQgYXJ0aWZhY3RzIGZvciB0aGUgV2ViIHNlcnZpY2UuPC9saT4KLTxsaT5JbnN0YWxsOiBJbnN0YWxscyBhbmQgY29uZmlndXJlcyB0aGUgV2ViIE1vZHVsZSBhbmQgRUFScyBvbiB0aGUgdGFyZ2V0IHNlcnZlci48L2xpPgotPGxpPlN0YXJ0OiBTdGFydHMgdGhlIHRhcmdldCBzZXJ2ZXIgb25jZSB0aGUgV2ViIHNlcnZpY2UgaGFzIGJlZW4gaW5zdGFsbGVkIG9uIGl0LjwvbGk+Ci08bGk+VGVzdDogVXNlIHRoZSBXZWIgU2VydmljZSBFeHBsb3JlciB0byB0ZXN0IHRoZSBnZW5lcmF0ZWQgV2ViIHNlcnZpY2UuPC9saT4KLTwvdWw+Ci08bGk+U2VydmVyOiBTZWxlY3QgYSBzZXJ2ZXIgdG8gZGVwbG95IHlvdXIgV2ViIHNlcnZpY2UgdG8uPC9saT4KLTxsaT5XZWIgc2VydmljZSBydW50aW1lOiBTZWxlY3QgQXBhY2hlIENYRiAyLng8L2xpPgotPGxpPlNlcnZpY2UgcHJvamVjdDogU2VsZWN0IHRoZSBwcm9qZWN0IGluIHlvdXIgd29ya3NwYWNlIGludG8gd2hpY2ggQXBhY2hlIENYRiB3aWxsIGdlbmVyYXRlIHRoZSBjb2RlLjwvbGk+Ci08bGk+SWYgeW91IHdpc2ggdG8gZ2VuZXJhdGUgYSBjbGllbnQgZm9yIHlvdXIgV2ViIHNlcnZpY2UsIHNlbGVjdCA8Yj5KYXZhIFByb3h5PC9iPiBhcyB0aGUgQ2xpZW50IHR5cGU6Ci08dWw+Ci08bGk+TW92ZSB0aGUgY2xpZW50IHNsaWRlciB0byB0aGUgPGI+RGV2ZWxvcCBjbGllbnQ8L2I+IHN0YWdlLjwvbGk+Ci08bGk+Q2xpZW50IHByb2plY3Q6IFNlbGVjdCBhIGRpZmZlcmVudCBwcm9qZWN0IGludG8gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIGNsaWVudCBjb2RlLiBUaGUgd2l6YXJkIHdpbGwgY3JlYXRlIHRoZSBwcm9qZWN0IGZvciB5b3UgaWYgaXQgZG9lc24ndCBleGlzdCBhbmQgY29uZmlndXJlIGl0IHdpdGggdGhlIENYRiBGYWNldC48L2xpPgotPC91bD48L2xpPgotPGxpPlB1Ymxpc2ggdGhlIFdlYiBzZXJ2aWNlOiBMYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciB0byBwdWJsaXNoIHlvdXIgV2ViIHNlcnZpY2UgdG8gYSBVRERJIHJlZ2lzdHJ5LjwvbGk+Ci08bGk+TW9uaXRvciB0aGUgV2ViIHNlcnZpY2U6IE1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlJ3MgU09BUCB0cmFmZmljIHVzaW5nIHRoZSBUQ1AvSVAgTW9uaXRvci48L2xpPgotPC9vbD48L2xpPgotPGxpPkNsaWNrIDxiPk5leHQgJmd0OzwvYj4gdG8gbW92ZSB0byB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBwYWdlOgotPG9sPgotPGxpPlVzZSBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlOiBTZWxlY3Qgb3IgY3JlYXRlIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgKFNFSSkgdGhhdCBkZWZpbmVzIHRoZSBtZXRob2RzIHlvdSB3aXNoIHRvIGV4cG9zZSBpbiB0aGUgc2VydmljZS4gVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2guIAotPHVsPgotPGxpPlNlbGVjdCBhbiBTRUk6IEJyb3dzZSB0byBzZWxlY3QgYW4gZXhpc3RpbmcgU0VJLjwvbGk+Ci08bGk+Q3JlYXRlIGFuIFNFSTogQ3JlYXRlIGFuIEludGVyZmFjZSBmcm9tIHRoZSBJbXBsZW1lbnRhdGlvbiBieSBwcm92aWRpbmcgYSBuYW1lIGFuZCB0aGUgbWV0aG9kcyB0byBkZWNsYXJlIGluIHRoZSBleHRyYWN0ZWQgaW50ZXJmYWNlLjwvbGk+Ci08L3VsPgotQm90aCBvcHRpb25zIGNyZWF0ZSBvciB1cGRhdGUgdGhlIDxpPkBXZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlPC9pPiBlbGVtZW50IG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWFuLiAKLTwvb2w+Ci08L2xpPgotPGxpPkNsaWNrIDxiPk5leHQgJmd0OzwvYj4gdG8gbW92ZSB0byB0aGUgSkFYLVdTIGFubm90YXRpb25zIGNvbmZpZ3VyYXRpb24gcGFnZToKLTxwPlRoaXMgcGFnZSBhbGxvd3MgeW91IGFkZCB0byBKQVgtV1MgYW5ub3RhdGlvbnMgdG8gdGhlIFNFSSBvciBJbXBsZW1lbnRhdGlvbiAoaWYgbm90IHVzaW5nIGFuIGV4cGxpY2l0IFNFSSkuPC9wPgotPHA+VGhlIEpBWC1XUyBhbm5vdGF0aW9ucyBlbGVtZW50IHZhbHVlcyBkZWZhdWx0IHRvIHRob3NlIG91dGxpbmVkIGluIHRoZSBKQVgtV1Mgc3BlY2lmaWNhdGlvbnMuPC9wPgotPHA+SWYgdGhlIEltcGxlbWVudGF0aW9uIGJlYW4gLyBTRUkgY29udGFpbnMgb3ZlcmxvYWRlZCBtZXRob2RzIHRoZSBKQVgtV1MgYW5ub3RhdGlvbnMgYWRkZWQgb24gdGhpcyBwYWdlIGFkanVzdCB0byByZXNvbHZlIHRob3NlIGNvbmZsaWN0cy48L3A+PC9saT4KLTxsaT5DbGljayA8Yj5OZXh0ICZndDs8L2I+IHRvIG1vdmUgdG8gdGhlIEFwYWNoZSBDWEYgamF2YTJ3cyBjb25maWd1cmF0aW9uIHBhZ2Ugd2hpY2ggYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCA8YSBocmVmPSIuLi9yZWZlcmVuY2UvamF2YTJ3c190YWIuaHRtbCI+amF2YTJ3czwvYT4gcHJlZmVyZW5jZXM6Ci08L2xpPgotCTxsaT5UZXN0IFdlYiBTZXJ2aWNlIHBhZ2UuIFRoaXMgcGFnZSB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgc2VydmljZSBzbGlkZXIgb24gdGhlIGZpcnN0IHBhZ2Ugd2FzIHNldCB0byBUZXN0IHNlcnZpY2UuCi0JPHA+U2VsZWN0IHRoZSBsYXVuY2ggYnV0dG9uIHRvIHRlc3QgdGhlIFdlYiBTZXJ2aWNlIHdpdGggdGhlIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuZG9jLnVzZXIvdGFza3MvdHRlc3R3c2RsLmh0bWwiPldlYiBTZXJ2aWNlcyBFeHBsb3JlcjwvYT4uPC9wPgotCTwvbGk+Ci0JPGxpPkFwYWNoZSBDWEYgSkFYLVdTIGNsaWVudCBjb25maWd1cmF0aW9uIHBhZ2U6IFRoaXMgcGFnZSB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgY2xpZW50IHNsaWRlciBvbiB0aGUgV2ViIHNlcnZpY2VzIHBhZ2Ugd2FzIHNldCB0byA8Yj5EZXZlbG9wIGNsaWVudDwvYj4uCi0JPHA+UmVmZXIgdG8gdGhlIDxhIGhyZWY9Ii4vY3JlYXRlX2NsaWVudC5odG1sIj5HZW5lcmF0ZSBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQ8L2E+IHBhZ2UgZm9yIGluZm9ybWF0aW9uIG9uIHRoZSBvcHRpb25zIGRpc3BsYXllZCBvbiB0aGlzIHBhZ2UuPC9wPgotCTwvbGk+Ci0JPGxpPldlYiBTZXJ2aWNlIFB1YmxpY2F0aW9uIFBhZ2U6IFNlbGVjdCB3aGV0aGVyIG9yIG5vdCB5b3Ugd2FudCB0byBwdWJsaXNoIHRoaXMgV2ViIHNlcnZpY2UgdG8gYSBVRERJIHJlZ2lzdHJ5LiBDbGljayA8Yj5GaW5pc2g8L2I+PC9saT4KLTwvb2w+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX3RvcGRvd24uaHRtbCI+R2VuZXJhdGUgYW4gU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfY2xpZW50Lmh0bWwiPkdlbmVyYXRlIGEgSkFYLVdTIFdlYiBTZXJ2aWNlIENsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2NsaWVudC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jbGllbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTJlMTc0MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2NsaWVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5HZW5lcmF0ZSBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9saXZlaGVscC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5HZW5lcmF0ZSBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvaDI+Ci08aDM+UHJlcmVxdWlzaXRlczo8L2gzPgotPG9sPgotICAgIDxsaT5JbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBlbnZpcm9ubWVudC4gU2VlIHRoZSA8YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL3JlcXVpcmVtZW50cy5odG1sIj5SZXF1aXJlbWVudHMgYW5kIEluc3RhbGxhdGlvbjwvYT4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLjwvbGk+Ci0gICAgPGxpPkNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZSBpdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgYXMgZGVzY3JpYmVkIGhlcmU6IDxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIj5DcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzPC9hPi48L2xpPgotPC9vbD4KLVRvIGdlbmVyYXRlIGEgSkFYLVdTIGNsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudDoKLTxvbD4KLQk8bGk+U2VsZWN0IDxhIGNsYXNzPSJjb21tYW5kLWxpbmsiCi0JCWhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUob3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZS5wZXJzcGVjdGl2ZUlkPW9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSkiKSc+Ci0JPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSI+PHN0cm9uZz5XaW5kb3cgJmd0OyBPcGVuIFBlcnNwZWN0aXZlICZndDsgSmF2YSBFRTwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUgdG8gc3dpdGNoIHRvIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLjwvbGk+Ci0JPGxpPk9wZW4gdGhlIFdlYiBTZXJ2aWNlIENsaWVudCBieSBzZWxlY3RpbmcgPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCkiKSc+Ci0JPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgbmV3IHdlYiBzZXJ2aWNlIGNsaWVudCB3aXphcmQiPjxzdHJvbmc+RmlsZQotCSZndDsgTmV3ICZndDsgT3RoZXIuLi4gJmd0OyBXZWIgU2VydmljZXMgJmd0OyBXZWIgU2VydmljZSBDbGllbnQ8L3N0cm9uZz48L2E+IGZyb20gdGhlIHRvcCBsZXZlbCBtZW51LjwvbGk+Ci0JPGxpPldlYiBTZXJ2aWNlcyBwYWdlOgotCTxwPjxpbWcgc3JjPSIuL2ltYWdlcy93c19jbGllbnRfd2l6YXJkLnBuZyIgYWx0PSJXZWIgU2VydmljZXMgQ2xpZW50IFdpemFyZCI+PC9wPgotCTxvbCB0eXBlPSJhIj4KLQkgICAgPExpPkVudGVyIHRoZSBVUkkgdG8gdGhlIHJlbW90ZSBXU0RMIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsaWVudC48L0xpPgotCQk8bGk+U2VsZWN0IDxiPkphdmEgUHJveHk8L2I+IGFzIHRoZSBDbGllbnQgdHlwZS48L2xpPgotCQk8bGk+TW92ZSB0aGUgY2xpZW50IHNsaWRlciB0byB0aGUgPGI+RGV2ZWxvcCBjbGllbnQ8L2I+IHN0YWdlLjwvbGk+Ci0JCTxsaT5XZWIgc2VydmljZSBydW50aW1lOiBTZWxlY3QgQXBhY2hlIENYRiAyLng8L2xpPgotCQk8bGk+U2VydmljZSBwcm9qZWN0OiBTZWxlY3QgdGhlIHByb2plY3QgaW4geW91ciB3b3Jrc3BhY2UgaW50byB3aGljaCBBcGFjaGUgQ1hGIHdpbGwgZ2VuZXJhdGUgdGhlIGNvZGUuPC9saT4KLQk8L29sPgotCTwvbGk+Ci0JPGxpPkNsaWNrIDxiPk5leHQgJmd0OzwvYj4gdG8gbW92ZSB0byB0aGUgZmlyc3QgQXBhY2hlIENYRiB3c2RsMmphdmEgQ29uZmlndXJhdGlvbiBwYWdlOgotCTxvbD4KLQkJPGxpPk91dHB1dCBEaXJlY3Rvcnk6IFNwZWNpZnkgdGhlIHNvdXJjZSBmb2xkZXIgaW4gdGhlIHNlcnZpY2UgcHJvamVjdCBpbnRvIHdoaWNoIHRoZSBjb2RlIGlzIGdlbmVyYXRlZC48L2xpPgotCQk8bGk+UGFja2FnZSBOYW1lOiBUeXBlIHRoZSBKYXZhIHBhY2thZ2UgbmFtZSB0byB1c2UgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZS48L2xpPgotCQk8bGk+U3BlY2lmeSBXU0RMIE5hbWVzcGFjZSB0byBQYWNrYWdlIE5hbWUgTWFwcGluZ3M6IE9wdGlvbmFsbHkgc3BlY2lmeSBXU0RMIG5hbWVzcGFjZSBtYXBwaW5ncyB0byBKYXZhIHBhY2thZ2UgbmFtZXMuPC9saT4KLQkJPGxpPlNlcnZpY2UgTmFtZTogU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgV1NETCBzZXJ2aWNlIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgY29kZS4gVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgZXZlcnkgc2VydmljZSBpbiB0aGUgV1NETCBkb2N1bWVudC48L2xpPgotCQk8bGk+QmluZGluZyBGaWxlczogU3BlY2lmeSBvbmUgb3IgbW9yZSBKQVgtV1Mgb3IgSkFYQiBiaW5kaW5nIGZpbGVzLjwvbGk+Ci0JPC9vbD4KLQk8L2xpPgotCTxsaT5DbGljayA8Yj5OZXh0ICZndDs8L2I+IHRvIG1vdmUgdG8gdGhlIHNlY29uZCBBcGFjaGUgQ1hGIHdzZGwyamF2YSBjb25maWd1cmF0aW9uIHBhZ2Ugd2hpY2ggYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL3dzZGwyamF2YV90YWIuaHRtbCI+d3NkbDJqYXZhPC9hPiBkZWZhdWx0IHByZWZlcmVuY2VzOgotCTwvbGk+Ci0JPGxpPkNsaWNrIDxiPkZpbmlzaDwvYj4gdG8gZ2VuZXJhdGUgdGhlIGNsaWVudC48L2xpPgotPC9vbD4KLTxwPlRoZSBnZW5lcmF0ZWQgY2xpZW50IHdpbGwgaW5jbHVkZSBhIG1haW4oKSB0aGF0IHdoZW4gcnVuIHdpbGwgY29ubmVjdCB0byB0aGUgcmVtb3RlIHNlcnZpY2UgYW5kIGludm9rZSBldmVyeSBvcGVyYXRpb24gb24gdGhhdCByZW1vdGUgc2VydmljZS48L3A+Ci08cD5CZWZvcmUgcnVubmluZyB0aGUgY2xpZW50IG9wZW4gdGhlIGNsaWVudCBpbiB0aGUgSmF2YSBFZGl0b3IgYW5kIGVkaXQgdGhlIGdlbmVyYXRlZCBhcmd1bWVudHMgdXNlZCB0byBpbnZva2UgdGhlIG9wZXJhdGlvbnMgb24gdGhlIHNlcnZpY2UuPC9wPgotPHA+VG8gPGI+cnVuPC9iPiB0aGUgY2xpZW50IHJpZ2h0LWNsaWNrIG9uIHRoZSBjbGllbnQgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYW5kIHNlbGVjdCA8Yj5SdW4gQXMgPiBKYXZhIEFwcGxpY2F0aW9uPC9iPi4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCI+Q3JlYXRlIGEgV2ViIFNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwiPkdlbmVyYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWMwY2Q4Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2N4Zl9wcm9qZWN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+Q3JlYXRlIGEgcHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlczwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9saXZlaGVscC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5DcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzPC9oMj4KLTxwPlRvIGNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZSBpdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzOjxici8+Ci08b2w+Ci08bGk+Ci1TZWxlY3QgPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQuV2ViUHJvamVjdFdpemFyZCkiKSc+Ci08aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBuZXcgZHluYW1pYyB3ZWIgcHJvamVjdCB3aXphcmQiPjxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IFByb2plY3QuLi4gJmd0OyBXZWIgJmd0OyBEeW5hbWljIFdlYiBQcm9qZWN0PC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudQotZW50ZXIgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKLTxvbCB0eXBlPSJhIj4KLTxsaT5Qcm9qZWN0IG5hbWU6IEVudGVyIGEgbmFtZSBvZiB0aGUgcHJvamVjdC48L2xpPgotPGxpPlRhcmdldCBSdW50aW1lOiBTZWxlY3QgdGhlIHNlcnZlciB5b3Ugd2lzaCB0byBkZXBsb3kgeW91ciBXZWIgc2VydmljZSB0by4gSWYgaXQncyBub3QgbGlzdGVkCi1jbGljayA8Yj5OZXc8L2I+IGFuZCBicm93c2UgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIGl0IGlzIGluc3RhbGxlZC48L2xpPgotPGxpPkR5bmFtaWMgV2ViIE1vZHVsZSB2ZXJzaW9uOiBTZWxlY3QgdmVyc2lvbiAyLjU8L2xpPgotPGxpPkRlZmF1bHQgQ29uZmlndXJhdGlvbjogU2VsZWN0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgc2VydmVyIHR5cGUuPC9saT4KLTxsaT5FQVIgTWVtYmVyc2hpcDogSWYgZGVwbG95aW5nIHRvIEFwYWNoZSBUb21jYXQgZW5zdXJlIHRoYXQgdGhlIDxiPkFkZCBwcm9qZWN0IHRvIGFuIEVBUjwvYj4gY2hlY2sgYm94IGlzIG5vdCBzZWxlY3RlZC48L2xpPgotPGxpPkNsaWNrIEZpbmlzaDwvbGk+Ci08L29sPgotPC9saT4KLTxsaT48YSBocmVmPSIuLi90YXNrcy9pbnN0YWxsX2N4Zl9mYWNldC5odG1sIj5JbnN0YWxsIHRoZSBDWEYgUHJvamVjdCBGYWNldDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Ii4uL3Rhc2tzL21hbmFnZV9jeGZfbGliX2V4cG9ydC5odG1sIj5NYW5hZ2UgdGhlIGV4cG9ydGluZyBvZiBDWEYgbGlicmFyaWVzIGF0IGRlcGxveW1lbnQgdGltZTwvYT48L2xpPgotPC9vbD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2N4Zl9mYWNldC5odG1sIj5DWEYgUHJvamVjdCBGYWNldDwvYT48YnI+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2JvdHRvbXVwLmh0bWwiPkNyZWF0ZSBhIFdlYiBTZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfdG9wZG93bi5odG1sIj5HZW5lcmF0ZSBhbiBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jbGllbnQuaHRtbCI+R2VuZXJhdGUgYSBKQVgtV1MgV2ViIFNlcnZpY2UgQ2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfdG9wZG93bi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2YTY0NWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICAgPHRpdGxlPkdlbmVyYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L3RpdGxlPgotICAgIDxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvbGl2ZWhlbHAuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkdlbmVyYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L2gyPgotPGgzPlByZXJlcXVpc2l0ZXM6PC9oMz4KLTxvbD4KLSAgICA8bGk+SW5zdGFsbCBhbmQgY29uZmlndXJlIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgZW52aXJvbm1lbnQuIFNlZSB0aGUgPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9yZXF1aXJlbWVudHMuaHRtbCI+UmVxdWlyZW1lbnRzIGFuZCBJbnN0YWxsYXRpb248L2E+IHBhZ2UgZm9yIG1vcmUgZGV0YWlscy48L2xpPgotICAgIDxsaT5DcmVhdGUgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBlbmFibGUgaXQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IGFzIGRlc2NyaWJlZCBoZXJlOiA8YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbCI+Q3JlYXRlIGEgcHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlczwvYT4uPC9saT4KLQk8bGk+Q3JlYXRlIG9yIGltcG9ydCBhIFdTREwgZG9jdW1lbnQgaW50byB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIG9mIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0LjwvbGk+Ci08L29sPgotPGJyLz4KLVRvIGNyZWF0ZSBhbiBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyB0aGUgQXBhY2hlIENYRiBydW50aW1lIGVudmlyb25tZW50OgotPG9sPgotCTxsaT5TZWxlY3QgPGEgY2xhc3M9ImNvbW1hbmQtbGluayIKLQkJaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZShvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMuc2hvd1BlcnNwZWN0aXZlLnBlcnNwZWN0aXZlSWQ9b3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlKSIpJz4KLQk8aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlIj48c3Ryb25nPldpbmRvdyAmZ3Q7IE9wZW4gUGVyc3BlY3RpdmUgJmd0OyBKYXZhIEVFPC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudSB0byBzd2l0Y2ggdG8gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUuPC9saT4KLQk8bGk+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBzZWxlY3QgdGhlIFdTREwgZG9jdW1lbnQgdGhhdCB5b3UgY3JlYXRlZCBvciBpbXBvcnRlZCBpbnRvIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0cyBXZWIgQ29udGVudCBmb2xkZXIuPC9saT4KLSAgICA8bGk+T3BlbiB0aGUgV2ViIFNlcnZpY2Ugd2l6YXJkIGJ5IHNlbGVjdGluZyA8YSBjbGFzcz0iY29tbWFuZC1saW5rIiBocmVmPSdqYXZhc2NyaXB0OmV4ZWN1dGVDb21tYW5kKCJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQobmV3V2l6YXJkSWQ9b3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQpIiknPgotICAgIDxpbWcgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9jb21tYW5kX2xpbmsucG5nIiBhbHQ9Ik9wZW4gdGhlIG5ldyB3ZWIgc2VydmljZSB3aXphcmQiPjxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyLi4uICZndDsgV2ViIFNlcnZpY2VzICZndDsgV2ViIFNlcnZpY2U8L3N0cm9uZz48L2E+IGZyb20gdGhlIHRvcCBsZXZlbCBtZW51LjwvbGk+Ci0JPGxpPldlYiBTZXJ2aWNlcyBwYWdlOiBzZWxlY3QgPGI+VG9wIGRvd24gSmF2YSBiZWFuIFdlYiBTZXJ2aWNlPC9iPiBhcyB0aGUgV2ViIHNlcnZpY2UgdHlwZSBhbmQgYnJvd3NlIHRvIHNlbGVjdCB0aGUgV1NETCBkb2N1bWVudCBmcm9tIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBTRUkgYW5kIGltcGxlbWVudGF0aW9uIGJlYW46Ci0JPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3RvcF9kb3duX3dpemFyZC5wbmciIGFsdD0iVG9wIGRvd24gV2ViIFNlcnZpY2VzIFdpemFyZCI+PC9wPgotCTxvbCB0eXBlPSJhIj4KLQkJPGxpPk1vdmUgdGhlIHNlcnZpY2Ugc2xpZGVyIHRvIHRoZSBzdGFnZSBvZiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgdGhhdCB5b3Ugd2lzaCB0byBjb21wbGV0ZS48L2xpPgotCQk8dWw+Ci0JCQk8bGk+RGV2ZWxvcDogSW52b2tlcyB0aGUgQXBhY2hlIENYRiB3c2RsMmphdmEgdG9vbCB1c2luZyB0aGUgcHJlZmVyZW5jZSBkZWZhdWx0cyBhbmQgdGhlIGluZm9ybWF0aW9uIGdhdGhlcmVkIGluIHRoZSB3aXphcmQgdG8gZ2VuZXJhdGUgYW4gYW5ub3RhdGVkIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGFuZCBzdXBwb3J0aW5nIGNsYXNzZXMuIFRoZSB3aXphcmQgYWxzbyBnZW5lcmF0ZXMgYSBKQVgtV1MgZW5kcG9pbnQgY29uZmlndXJhdGlvbiBmaWxlLjwvbGk+Ci0JCQk8bGk+QXNzZW1ibGU6IElmIHJlcXVpcmVkIGJ5IHRoZSB0YXJnZXQgc2VydmVyIHRoaXMgcGhhc2UKLQkJCWFzc2VtYmxlcyBhbmQgY29uZmlndXJlcyB0aGUgcHJvamVjdCB0aGF0IGhvc3RzIHRoZSBXZWIgc2VydmljZSBpbnRvIGFuIEVBUi48L2xpPgotCQkJPGxpPkRlcGxveTogR2VuZXJhdGVzIHRoZSBkZXBsb3ltZW50IGFydGlmYWN0cyBmb3IgdGhlIFdlYiBzZXJ2aWNlLjwvbGk+Ci0JCQk8bGk+SW5zdGFsbDogSW5zdGFsbHMgYW5kIGNvbmZpZ3VyZXMgdGhlIFdlYiBNb2R1bGUgYW5kIEVBUnMgb24gdGhlIHRhcmdldCBzZXJ2ZXIuPC9saT4KLQkJCTxsaT5TdGFydDogU3RhcnRzIHRoZSB0YXJnZXQgc2VydmVyIG9uY2UgdGhlIFdlYiBzZXJ2aWNlIGhhcyBiZWVuIGluc3RhbGxlZCBvbiBpdC48L2xpPgotCQkJPGxpPlRlc3Q6IFVzZSB0aGUgV2ViIFNlcnZpY2UgRXhwbG9yZXIgdG8gdGVzdCB0aGUgZ2VuZXJhdGVkIFdlYiBzZXJ2aWNlLjwvbGk+Ci0JCTwvdWw+Ci0JCTxsaT5TZXJ2ZXI6IFNlbGVjdCBhIHNlcnZlciB0byBkZXBsb3kgeW91ciBXZWIgc2VydmljZSB0by48L2xpPgotCQk8bGk+V2ViIHNlcnZpY2UgcnVudGltZTogU2VsZWN0IEFwYWNoZSBDWEYgMi54PC9saT4KLQkJPGxpPlNlcnZpY2UgcHJvamVjdDogU2VsZWN0IHRoZSBwcm9qZWN0IGluIHlvdXIgd29ya3NwYWNlIGludG8gd2hpY2ggQXBhY2hlIENYRiB3aWxsIGdlbmVyYXRlIHRoZSBjb2RlLjwvbGk+Ci0JCTxsaT5JZiB5b3Ugd2lzaCB0byBnZW5lcmF0ZSBhIGNsaWVudCBmb3IgeW91ciBXZWIgc2VydmljZSwgc2VsZWN0IDxiPkphdmEgUHJveHk8L2I+IGFzIHRoZSBDbGllbnQgdHlwZToKLQkJPHVsPgotCQkJPGxpPk1vdmUgdGhlIGNsaWVudCBzbGlkZXIgdG8gdGhlIDxiPkRldmVsb3AgY2xpZW50PC9iPiBzdGFnZS48L2xpPgotCQkJPGxpPkNsaWVudCBwcm9qZWN0OiBTZWxlY3QgYSBkaWZmZXJlbnQgcHJvamVjdCBpbnRvIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBjbGllbnQgY29kZS4gVGhlIHdpemFyZCB3aWxsIGNyZWF0ZSB0aGUgcHJvamVjdCBmb3IgeW91IGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW5kIGNvbmZpZ3VyZSBpdCB3aXRoIHRoZSBDWEYgRmFjZXQuPC9saT4KLQkJPC91bD4KLQkJPC9saT4KLQkJPGxpPlB1Ymxpc2ggdGhlIFdlYiBzZXJ2aWNlOiBMYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciB0byBwdWJsaXNoIHlvdXIgV2ViIHNlcnZpY2UgdG8gYSBVRERJIHJlZ2lzdHJ5LjwvbGk+Ci0JCTxsaT5Nb25pdG9yIHRoZSBXZWIgc2VydmljZTogTW9uaXRvciB0aGUgV2ViIHNlcnZpY2UncyBTT0FQIHRyYWZmaWMgdXNpbmcgdGhlIFRDUC9JUCBNb25pdG9yLjwvbGk+Ci0JPC9vbD4KLQk8L2xpPgotCTxsaT5DbGljayA8Yj5OZXh0ICZndDs8L2I+IHRvIG1vdmUgdG8gdGhlIGZpcnN0IEFwYWNoZSBDWEYgd3NkbDJqYXZhIENvbmZpZ3VyYXRpb24gcGFnZToKLQk8b2w+Ci0JCTxsaT5PdXRwdXQgRGlyZWN0b3J5OiBTcGVjaWZ5IHRoZSBzb3VyY2UgZm9sZGVyIGluIHRoZSBzZXJ2aWNlIHByb2plY3QgaW50byB3aGljaCB0aGUgY29kZSBpcyBnZW5lcmF0ZWQuPC9saT4KLQkJPGxpPlBhY2thZ2UgTmFtZTogVHlwZSB0aGUgSmF2YSBwYWNrYWdlIG5hbWUgdG8gdXNlIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuPC9saT4KLQkJPGxpPlNwZWNpZnkgV1NETCBOYW1lc3BhY2UgdG8gUGFja2FnZSBOYW1lIE1hcHBpbmdzOiBPcHRpb25hbGx5IHNwZWNpZnkgV1NETCBuYW1lc3BhY2UgbWFwcGluZ3MgdG8gSmF2YSBwYWNrYWdlIG5hbWVzLjwvbGk+Ci0JCTxsaT5TZXJ2aWNlIE5hbWU6IFNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIFdTREwgc2VydmljZSBmcm9tIHdoaWNoIHRvIGdlbmVyYXRlIGNvZGUuIFRoZSBkZWZhdWx0IGlzIHRvIGdlbmVyYXRlIGNvZGUgZm9yIGV2ZXJ5IHNlcnZpY2UgaW4gdGhlIFdTREwgZG9jdW1lbnQuPC9saT4KLQkJPGxpPkJpbmRpbmcgRmlsZXM6IFNwZWNpZnkgb25lIG9yIG1vcmUgSkFYLVdTIG9yIEpBWEIgYmluZGluZyBmaWxlcy48L2xpPgotCTwvb2w+Ci0JPC9saT4KLQk8bGk+Q2xpY2sgPGI+TmV4dCAmZ3Q7PC9iPiB0byBtb3ZlIHRvIHRoZSBzZWNvbmQgQXBhY2hlIENYRiB3c2RsMmphdmEgY29uZmlndXJhdGlvbiBwYWdlIHdoaWNoIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIDxhIGhyZWY9Ii4uL3JlZmVyZW5jZS93c2RsMmphdmFfdGFiLmh0bWwiPndzZGwyamF2YTwvYT4gZGVmYXVsdCBwcmVmZXJlbmNlczoKLQk8cD5FbnN1cmUgdGhhdCB0aGUgPGI+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2I+IGNoZWNrIGJveCBpcyBzZWxlY3RlZCBhbmQgY2xpY2sgPGI+TmV4dCAmZ3Q7PC9iPgotCTwvbGk+Ci0JPGxpPlRlc3QgV2ViIFNlcnZpY2UgcGFnZS4gVGhpcyBwYWdlIHdpbGwgYmUgZGlzcGxheWVkIGlmIHRoZSBzZXJ2aWNlIHNsaWRlciBvbiB0aGUgZmlyc3QgcGFnZSB3YXMgc2V0IHRvIFRlc3Qgc2VydmljZS4KLQk8cD5TZWxlY3QgdGhlIGxhdW5jaCBidXR0b24gdG8gdGVzdCB0aGUgV2ViIFNlcnZpY2Ugd2l0aCB0aGUgPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5kb2MudXNlci90YXNrcy90dGVzdHdzZGwuaHRtbCI+V2ViIFNlcnZpY2VzIEV4cGxvcmVyPC9hPi48L3A+Ci0JPC9saT4KLQk8bGk+QXBhY2hlIENYRiBKQVgtV1MgY2xpZW50IGNvbmZpZ3VyYXRpb24gcGFnZTogVGhpcyBwYWdlIHdpbGwgYmUgZGlzcGxheWVkIGlmIHRoZSBjbGllbnQgc2xpZGVyIG9uIHRoZSBXZWIgc2VydmljZXMgcGFnZSB3YXMgc2V0IHRvIDxiPkRldmVsb3AgY2xpZW50PC9iPi4KLQk8cD5SZWZlciB0byB0aGUgPGEgaHJlZj0iLi9jcmVhdGVfY2xpZW50Lmh0bWwiPkNyZWF0ZSBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQ8L2E+IHBhZ2UgZm9yIGluZm9ybWF0aW9uIG9uIHRoZSBvcHRpb25zIGRpc3BsYXllZCBvbiB0aGlzIHBhZ2UuPC9wPgotCTwvbGk+Ci0JPGxpPldlYiBTZXJ2aWNlIFB1YmxpY2F0aW9uIFBhZ2U6IFNlbGVjdCB3aGV0aGVyIG9yIG5vdCB5b3Ugd2FudCB0byBwdWJsaXNoIHRoaXMgV2ViIHNlcnZpY2UgdG8gYSBVRERJIHJlZ2lzdHJ5LiBDbGljayA8Yj5GaW5pc2g8L2I+PC9saT4KLTwvb2w+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2JvdHRvbXVwLmh0bWwiPkNyZWF0ZSBhIFdlYiBTZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfY2xpZW50Lmh0bWwiPkdlbmVyYXRlIGEgSkFYLVdTIFdlYiBTZXJ2aWNlIENsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL2Fubm90YXRpb25fcHJvY2Vzc2luZy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL2Fubm90YXRpb25fcHJvY2Vzc2luZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiOTU0ZDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9hbm5vdGF0aW9uX3Byb2Nlc3NpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9ib3R0b21fdXBfd2l6YXJkLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvYm90dG9tX3VwX3dpemFyZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3ZGMzYjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9ib3R0b21fdXBfd2l6YXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvZmFjZXRfY29uZmlndXJhdGlvbi5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL2ZhY2V0X2NvbmZpZ3VyYXRpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzdjOTFhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvZmFjZXRfY29uZmlndXJhdGlvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL21vZHVsZV9kZXBlbmRlbmNpZXMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9tb2R1bGVfZGVwZW5kZW5jaWVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTI0YWQ5Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL21vZHVsZV9kZXBlbmRlbmNpZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9wcm9qZWN0X2ZhY2V0cy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL3Byb2plY3RfZmFjZXRzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDkxNzk5NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL3Byb2plY3RfZmFjZXRzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvdG9wX2Rvd25fd2l6YXJkLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvdG9wX2Rvd25fd2l6YXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE3MTkxYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL3RvcF9kb3duX3dpemFyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL3dzX2NsaWVudF93aXphcmQucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy93c19jbGllbnRfd2l6YXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZjYzIyYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL3dzX2NsaWVudF93aXphcmQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2luc3RhbGxfY3hmX2ZhY2V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW5zdGFsbF9jeGZfZmFjZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDYzNzZlMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW5zdGFsbF9jeGZfZmFjZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5JbnN0YWxsIHRoZSBDWEYgUHJvamVjdCBGYWNldDwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+SW5zdGFsbCB0aGUgQ1hGIFByb2plY3QgRmFjZXQ8L2gyPgotPHA+VGhlcmUgYXJlIHRocmVlIHdheXMgdG8gZW5hYmxlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudC48cD4KLTxvbD4KLTxsaT5MZXQgdGhlIFdlYiBTZXJ2aWNlcyB3aXphcmRzIGRvIGl0IGZvciB5b3UgYXV0b21hdGljYWxseSB3aGVuIGNyZWF0aW5nIGEgV2ViIHNlcnZpY2Ugd2l0aCBBcGFjaGUgQ1hGLjwvbGk+Ci08bGk+U2VsZWN0IGEgQ1hGIHByb2plY3QgY29uZmlndXJhdGlvbiBvciBtb2RpZnkgYW5vdGhlciBjb25maWd1cmF0aW9uIHdoZW4gY3JlYXRpbmcgYSBuZXcgRHluYW1pYyBXZWIgUHJvamVjdAotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2ZhY2V0X2NvbmZpZ3VyYXRpb24ucG5nIiBhbHQ9IlByb2plY3QgQ29uZmlndXJhdGlvbiIgPiA8L3A+PC9saT4KLTxsaT5SaWdodC1jbGljayBvbiBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGNob29zZSA8Yj5Qcm9wZXJ0aWVzPC9iPiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuPGJyLz4gT24gdGhlIHRoZSA8Yj5Qcm9qZWN0IEZhY2V0czwvYj4gCi0gcHJvcGVydGllcyBwYWdlIHNlbGVjdCB0aGUgPGI+Q1hGIDIueCBXZWIgU2VydmljZXM8L2I+IGZhY2V0IGluIHRoZSBsaXN0IGFuZCBjbGljayA8Yj5PSzwvYj4uCi0gPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3Byb2plY3RfZmFjZXRzLnBuZyIgYWx0PSJQcm9qZWN0IEZhY2V0cyIgPiA8L3A+PC9saT4KLTwvb2w+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbCI+Q1hGIFByb2plY3QgRmFjZXQ8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9tYW5hZ2VfY3hmX2xpYl9leHBvcnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9tYW5hZ2VfY3hmX2xpYl9leHBvcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzJhZWJkMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvbWFuYWdlX2N4Zl9saWJfZXhwb3J0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+TWFuYWdlIHRoZSBleHBvcnRpbmcgb2YgQ1hGIGxpYnJhcmllcyBhdCBkZXBsb3ltZW50IHRpbWU8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPk1hbmFnZSB0aGUgZXhwb3J0aW5nIG9mIENYRiBsaWJyYXJpZXMgYXQgZGVwbG95bWVudCB0aW1lPC9oMj4KLTxwPkJ5IGRlZmF1bHQgcHJvamVjdHMgY29uZmlndXJlZCB3aXRoIHRoZSBDWEYgZmFjZXQgYXJlIHNldHVwIHRvIHJlc29sdmUgdGhlIENYRiBsaWJyYXJpZXMgdG8gdGhlIFdFQi1JTkYvbGliIGZvbGRlciBhdCBkZXBsb3ltZW50IHRpbWUuPC9wPgotPHA+VGhpcyBob3dldmVyIGdyZWF0bHkgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBkZXBsb3llZCB3ZWIgbW9kdWxlLiBJZiB0aGUgd2ViIG9yIGFwcGxpY2F0aW9uIHNlcnZlciB5b3UgYXJlIGRlcGxveWluZyB0byBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgd2l0aCB0aGUgQXBhY2hlIENYRiBsaWJyYXJpZXMgeW91Ci1jYW4gZGlzYWJsZSB0aGlzIG9wdGlvbiBpbiB0aGUgQXBhY2hlIENYRiBwcmVmZXJlbmNlcy48L3A+Ci08cD5UbyBlbmFibGUgb3IgZGlzYWJsZSB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYSBleGlzdGluZyA8Yj5EeW5hbWljIFdlYiBQcm9qZWN0PC9iPiBhbHJlYWR5IGNvbmZpZ3VyZWQgd2l0aCB0aGUgQ1hGIEZhY2V0IHJpZ2h0LWNsaWNrIG9uIHRoZSBwcm9qZWN0IGFuZCBjaG9vc2UgPGI+UHJvcGVydGllczwvYj4uPGJyLz48L3A+Ci08cD48aW1nIHNyYz0iLi9pbWFnZXMvbW9kdWxlX2RlcGVuZGVuY2llcy5wbmciIGFsdD0iTW9kdWxlIERlcGVuZGVuY2llcyI+PC9wPgotU2VsZWN0IHRoZSA8Yj5KYXZhIEVFIE1vZHVsZSBEZXBlbmRlbmNpZXM8L2I+IHByb3BlcnRpZXMgcGFnZSBhbmQgc2VsZWN0IG9yIGRlc2VsZWN0IHRoZSB2ZXJzaW9uIG9mIHRoZSA8Yj5BcGFjaGUgQ1hGIExpYnJhcnk8L2I+IHRoYXQgaXMgY29uZmlndXJlZCBpbiB0aGUgcHJvamVjdCBhbmQgY2xpY2sgPGI+T0s8L2I+LgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvY3hmX2ZhY2V0Lmh0bWwiPkNYRiBQcm9qZWN0IEZhY2V0PC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY2dldHRpbmdzdGFydGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGM2YjY3NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iR2V0dGluZyBTdGFydGVkIiBsaW5rX3RvPSJ0b2MueG1sI2dldHRpbmdzdGFydGVkIj4gCi0gICAgPHRvcGljIGxhYmVsPSJRdWljayBTdGFydCIgaHJlZj0iZ2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2NyZWZlcmVuY2UueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0ZmQ0YzQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iUmVmZXJlbmNlIiBsaW5rX3RvPSJ0b2MueG1sI3JlZmVyZW5jZSI+IAotCTx0b3BpYyBsYWJlbD0iUHJlZmVyZW5jZXMiIGhyZWY9InJlZmVyZW5jZS9wcmVmZXJlbmNlcy5odG1sIj4KLSAgICAgICAgPHRvcGljIGxhYmVsPSJKYXZhMldTIiBocmVmPSJyZWZlcmVuY2UvamF2YTJ3c190YWIuaHRtbCIvPgotICAgICAgICA8dG9waWMgbGFiZWw9IldTREwySmF2YSIgaHJlZj0icmVmZXJlbmNlL3dzZGwyamF2YV90YWIuaHRtbCIvPgotICAgICAgICA8dG9waWMgbGFiZWw9IkpBWC1XUyIgaHJlZj0icmVmZXJlbmNlL2pheHdzX3RhYi5odG1sIi8+Ci0gICAgICAgIDx0b3BpYyBsYWJlbD0iRW5kcG9pbnQgQ29uZmlnIiBocmVmPSJyZWZlcmVuY2UvZW5kcG9pbnRfY29uZmlnX3RhYi5odG1sIi8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2Uvc2VydmVyX3J1bnRpbWUuaHRtbCIgbGFiZWw9IlNlcnZlciBhbmQgcnVudGltZSI+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgPC90b3BpYz4KLSA8dG9waWMgaHJlZj0icmVmZXJlbmNlL2N4Zl9mYWNldC5odG1sIiBsYWJlbD0iQ1hGIFByb2plY3QgRmFjZXQiPgotIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2N0YXNrcy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jdGFza3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNTgyOGYwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2N0YXNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iVGFza3MiIGxpbmtfdG89InRvYy54bWwjdGFza3MiPiAKLQk8dG9waWMgaHJlZj0idGFza3MvY3JlYXRlX2N4Zl9wcm9qZWN0Lmh0bWwiIGxhYmVsPSJDcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzIj4KLSAgICA8dG9waWMgaHJlZj0idGFza3MvaW5zdGFsbF9jeGZfZmFjZXQuaHRtbCIgbGFiZWw9Ikluc3RhbGwgdGhlIENYRiBQcm9qZWN0IEZhY2V0Ij4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJ0YXNrcy9tYW5hZ2VfY3hmX2xpYl9leHBvcnQuaHRtbCIgbGFiZWw9Ik1hbmFnZSB0aGUgZXhwb3J0aW5nIG9mIENYRiBsaWJyYXJpZXMgZHVyaW5nIGRlcGxveW1lbnQiPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9InRhc2tzL2NvbmZpZ3VyaW5nX2pheHdzX2Fubm90YXRpb25fcHJvY2Vzc2luZy5odG1sIiBsYWJlbD0iRW5hYmxlIEpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3NpbmciPgotICAgIDwvdG9waWM+Ci0gPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIFdlYiBTZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRiIgaHJlZj0idGFza3MvY3JlYXRlX2JvdHRvbXVwLmh0bWwiLz4KLSAgICA8dG9waWMgbGFiZWw9IkdlbmVyYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYiIGhyZWY9InRhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwiLz4KLSAgICA8dG9waWMgbGFiZWw9IkdlbmVyYXRlIGEgSkFYLVdTIFdlYiBTZXJ2aWNlIENsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGIiBocmVmPSJ0YXNrcy9jcmVhdGVfY2xpZW50Lmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjgwMDI2MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYWY0YTczLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2I3ZTEzZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+DQotPHRpdGxlPkFib3V0PC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRU4tVVMiPg0KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPg0KLSANCi08cD5GZWJydWFyeSAxOSwgMjAwOTwvcD4JDQotPGgzPkxpY2Vuc2U8L2gzPg0KLQ0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIA0KLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIA0KLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIA0KLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkNCi1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgDQotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlDQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQNCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2Jvb2suY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYm9vay5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3ZTJiNTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYm9vay5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1AaW1wb3J0ICIuLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7Ci0KLXNwYW4uY29udHJvbCB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLm5hbWUgewotICBmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4uY29kZSB7Ci0gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci19Ci0KLXAubmF2X2Zvb3RlciB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXAubmF2X2Zvb3RlciBhIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2JlOTY0NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgKi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBib29rLmNzcyxcCi0gICAgICAgICAgICAgICBjb25jZXB0cy8sXAotICAgICAgICAgICAgICAgZ2V0dGluZ3N0YXJ0ZWQvLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgbWFpbnBhZ2UuaHRtbCxcCi0gICAgICAgICAgICAgICBsZWdhbC5odG1sLFwKLSAgICAgICAgICAgICAgIHRpcHMvLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZS8KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2NvbmNlcHRzL2pheHdzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9jb25jZXB0cy9qYXh3cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NmRlZDlhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2NvbmNlcHRzL2pheHdzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+SmF2YSBBUEkgZm9yIFhNTC1CYXNlZCBXZWIgU2VydmljZXM8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkphdmEgQVBJIGZvciBYTUwtQmFzZWQgV2ViIFNlcnZpY2VzPC9oMj4KLTxwPkpBWC1XUyBpcyBhIEphdmEgQVBJIGZvciBjcmVhdGluZyBXZWIgc2VydmljZXMgYW5kIGNsaWVudHMgdGhhdCBjb21tdW5pY2F0ZSB1c2luZyBYTUwuIEl0IHdhcyBkZXNpZ25lZCB0byBzdXBlcnNlZGUgdGhlIEpBWC1SUEMgc3RhbmRhcmQuPC9wPgotCi08cD5BZGRpdGlvbmFsIGluZm9ybWF0aW9uOjwvcD4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTIyNCI+SlNSLTIyNCBTcGVjaWZpY2F0aW9uPC9hPjwvbGk+Ci08L3VsPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL2dldHRpbmdfc3RhcnRlZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvZ2V0dGluZ19zdGFydGVkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmMzdkZDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvZ2V0dGluZ19zdGFydGVkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+R2V0dGluZyBTdGFydGVkPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5HZXR0aW5nIFN0YXJ0ZWQ8L2gyPgotPHA+VGhpcyBzZWN0aW9uIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGdldHRpbmcgc3RhcnRpbmcgc3RhcnRlZCB3aXRoIEpBWC1XUyBUb29scy48L3A+Ci08dWw+Ci0JPGxpPgotCTxwPjxhIGhyZWY9InJlcXVpcmVtZW50cy5odG1sIj5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvYT48L3A+Ci0JPC9saT4KLQk8bGk+Ci0JPHA+PGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3ByZWZlcmVuY2VzLmh0bWwiPkNvbmZpZ3VyaW5nIEFwYWNoZSBDWEYgaW4gdGhlIHdvcmtiZW5jaDwvYT48L3A+Ci0JPC9saT4KLQk8bGk+Ci0JPHA+PGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sIj5KQVgtV1MgVG9vbHMgUXVpY2sgU3RhcnQ8L2E+PC9wPgotCTwvbGk+Ci08L3VsPgotPHA+Rm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHBsZWFzZSB2aXNpdCB0aGUgPGEgaHJlZj0iaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvSkFYV1MiPkpBWC1XUyBXaWtpPC9hPiBwYWdlLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9yZXF1aXJlbWVudHMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL3JlcXVpcmVtZW50cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYjk4NjBhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL3JlcXVpcmVtZW50cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvaDI+Ci08cD5KQVgtV1MgVG9vbHMgY3VycmVudGx5IHN1cHBvcnRzIGJvdGggRWNsaXBzZSAzLjQgYW5kIDMuNSBlbnZpcm9ubWVudHMgYW5kIGhhcyB0aGUgZm9sbG93aW5nIDxpPm1pbmltdW08L2k+IHJlcXVpcmVtZW50cy48L3A+Ci08cD48L3A+Ci08dWw+Ci0JPGxpPgotCTxwPkVjbGlwc2UgMy40LjAgKDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHM8L2E+KTwvcD4KLQk8L2xpPgotCTxsaT4KLQk8cD5FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSAzLjAuMSAoPGEgaHJlZj0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL2Rvd25sb2Fkcy8iPmh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy9kb3dubG9hZHM8L2E+KTwvcD4KLQk8L2xpPgotPC91bD4KLQotPGgzPkpESyBWZXJzaW9uczwvaDM+Ci08cD5KYXZhIDUuMCBpcyB0aGUgbWluaW11bSByZXF1aXJlZCB2ZXJzaW9uIGFuZCBKREsgNi4wIGlzIHN1cHBvcnRlZCBmcm9tIHVwZGF0ZSA0IGFuZCBsYXRlci48L3A+Ci08cD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS9kb3dubG9hZHMvIj5odHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS9kb3dubG9hZHMvPC9hPjwvcD4KLQotCi08aDM+SkFYLVdTIFJ1bnRpbWU8L2gzPgotPHA+QmVmb3JlIGNyZWF0aW5nIFdlYiBzZXJ2aWNlIGFwcGxpY2F0aW9ucyB3aXRoIEpBWC1XUyBUb29scyBhIEpBWC1XUyBydW50aW1lIG11c3QgYmUgZG93bmxvYWRlZCwgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkIGluIHRoZSB3b3JrYmVuY2guPC9wPgotPHA+Q3VycmVudGx5IHdlIHN1cHBvcnQgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBmb3IgSkFYLVdTIGRldmVsb3BtZW50IGZyb20gdmVyc2lvbiAyLjAuNiB1cHdhcmRzLiBXZSByZWNvbW1lbmQgdXNpbmcgYSB2ZXJzaW9uIGZyb20KLXRoZSBDWEYgMi4xLnggb3IgdGhlIGN1cnJlbnQgMi4yLnggc3RyZWFtLjwvcD4KLTxwPlRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cDovL2N4Zi5hcGFjaGUub3JnL2Rvd25sb2FkLmh0bWwiPkFwYWNoZSBDWEYgRG93bmxvYWRzPC9hPiBwYWdlLjxwPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvcHJlZmVyZW5jZXMuaHRtbCI+QXBhY2hlIENYRiAyLnggUHJlZmVyZW5jZXM8L2E+PGJyPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIj5DcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzPC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvbmdyZWxjLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9uZ3JlbGMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNjFlM2FhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9uZ3JlbGMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL25ncmVsci5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvbmdyZWxyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDcyNmY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvbmdyZWxyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHQucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL25ncmVsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0YmVlMmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL25ncmVsdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvd3RwX2xvZ29fMjAxMC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvd3RwX2xvZ29fMjAxMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTI2ZmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL3d0cF9sb2dvXzIwMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvbGVnYWwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2xlZ2FsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3NDMzNGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvbGVnYWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkxlZ2FsPC90aXRsZT4KLQk8bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2xpdmVoZWxwLmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkxlZ2FsPC9oMj4KLTxwPkNvcHlyaWdodCAmY29weTsgMjAwOSwgMjAxMCBTaGFuZSBDbGFya2UgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC48L3A+Ci08cD5UaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdDo8L3A+Ci08cD48Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+PC9jb2RlPjwvcD4KLTxwPjxhIGhyZWY9ImFib3V0Lmh0bWwiPlRlcm1zIGFuZCBjb25kaXRpb25zIHJlZ2FyZGluZyB0aGUgdXNlIG9mIHRoaXMgZ3VpZGUuPC9hPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9tYWlucGFnZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvbWFpbnBhZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTEyNjE3Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9tYWlucGFnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+SkFYLVdTIFRvb2xzIFVzZXIgR3VpZGU8L3RpdGxlPgotCTxsaW5rIGhyZWY9ImJvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotCTxkaXYgYWxpZ249ImNlbnRlciI+Ci0JCTxicj4KLQkJPGltZyBhbHQ9IldlYlRvb2xzIFBsYXRmb3JtIiBzcmM9ImltYWdlcy93dHBfbG9nb18yMDEwLnBuZyI+Ci0JCTxicj4KLQkJPGgxPkpBWC1XUyBUb29scyBVc2VyIEd1aWRlPC9oMT4KLQk8L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NGYyYzhhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXBsdWdpbk5hbWU9SkFYLVdTIFRvb2xzIFVzZXIgR3VpZGUNCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KLQ0KLWNoZWF0c2hlZXQuY2F0ZWdvcnkuamF4d3M9SkFYLVdTIERldmVsb3BtZW50DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExNGNlNDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/Pg0KLTxwbHVnaW4+DQotDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPg0KLSAgICAgIDx0b2MgZmlsZT0idG9jLnhtbCIgcHJpbWFyeT0idHJ1ZSIvPg0KLSAgICAgIDx0b2MgZmlsZT0idG9jY29uY2VwdHMueG1sIi8+DQotICAgICAgPHRvYyBmaWxlPSJ0b2N0YXNrcy54bWwiLz4NCi0gICAgICA8dG9jIGZpbGU9InRvY3JlZmVyZW5jZS54bWwiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICANCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCI+DQotICAgICAgPGNhdGVnb3J5DQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cyINCi0gICAgICAgICAgICBuYW1lPSIlY2hlYXRzaGVldC5jYXRlZ29yeS5qYXh3cyI+DQotICAgICAgPC9jYXRlZ29yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICANCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvYW5ub3RhdGlvbl9wcm9jZXNzb3JzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvYW5ub3RhdGlvbl9wcm9jZXNzb3JzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4NmE2MDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2Fubm90YXRpb25fcHJvY2Vzc29ycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyI+Ci0JPHRpdGxlPkFubm90YXRpb24gUHJvY2Vzc29yczwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QW5ub3RhdGlvbiBWYWxpZGF0aW9uPC9oMj4KLTxwPkpBWC1XUyBUb29scyBwcm92aWRlcyBKRFQtQVBUIEFubm90YXRpb24gUHJvY2Vzc29ycyB0aGF0IGdhdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlIGNvZGUgYXMgaXQgaXMgYmVpbmcgZWRpdGVkLjwvcD4KLTxwPlRoZSBwcm9jZXNzb3JzIHJlcG9ydCBlcnJvcnMgYW5kIHdhcm5pbmdzIGluIHRoZSBQcm9ibGVtcyBWaWV3IHdoZW4gSkFYLVdTIHJ1bGVzIGFyZSBicm9rZW4uPC9wPiAKLTxwPkpBWC1XUyBBbm5vdGF0aW9uIHByb2Nlc3NpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC48L3A+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY29uZmlndXJpbmdfamF4d3NfYW5ub3RhdGlvbl9wcm9jZXNzaW5nLmh0bWwiPkVuYWJsZSBKQVgtV1MgQW5ub3RhdGlvbiBQcm9jZXNzaW5nPC9hPjxicj4gICAgCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2Fubm90YXRpb25fdmlldy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2Fubm90YXRpb25fdmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZmY5MmYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9hbm5vdGF0aW9uX3ZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5Bbm5vdGF0aW9ucyBWaWV3PC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5Bbm5vdGF0aW9uIFByb3BlcnRpZXMgVmlldzwvaDI+Ci08cD5KQVgtV1MgVG9vbHMgcHJvdmlkZXMgYSBjb250ZXh0IGF3YXJlIEFubm90YXRpb24gcHJvcGVydGllcyB2aWV3IHRoYXQgcmVhY3RzIHRvIHRoZSBzZWxlY3Rpb24gaW4gdGhlIEphdmEgCi1FZGl0b3IgcHJlc2VudGluZyBhIGxpc3Qgb2YgYXBwbGljYWJsZSBKQVgtV1MgYW5ub3RhdGlvbnMgZm9yIHRoYXQgc2VsZWN0aW9uLjwvcD4KLTxwPlNlbGVjdGluZyBvciBkZXNlbGVjdGluZyBhIGNoZWNrIGJveCBpbiB0aGUgdmFsdWVzIGNvbHVtbiB3aWxsIGFkZCBvciByZW1vdmUgdGhlIGFubm90YXRpb24gYXQgdGhhdCByb3cgCi10byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIEphdmEgZWxlbWVudCBpbiB0aGUgSmF2YSBFZGl0b3I8L3A+Ci08cD48aW1nIHNyYz0iLi9pbWFnZXMvYW5ub3RhdGlvbnNfdmlldy5wbmciIGFsdD0iQW5ub3RhdGlvbiBwcm9wZXJ0aWVzIHZpZXciID4gPC9wPgotPHA+RXhwYW5kaW5nIGFuIGFubm90YXRpb24gaW4gdGhlIHZpZXcgd2lsbCByZXZlYWwgdGhlIGFubm90YXRpb25zIGVsZW1lbnRzIGFuZCB0aGUgZWxlbWVudCB2YWx1ZXMuPC9wPgotPHA+WW91IGNhbiBlZGl0IHRoZSBhbm5vdGF0aW9uIGVsZW1lbnQgdmFsdWVzIHVzaW5nIHRoZSBlZGl0b3JzIGluIHRoZSB2YWx1ZXMgY29sdW1uLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9hbm5vdGF0aW9uc192aWV3X2V4cGFuZGVkLnBuZyIgYWx0PSJBbm5vdGF0aW9uIHByb3BlcnRpZXMgdmlldyBleHBhbmRlZCIgPiA8L3A+Ci08cD5UaGUgPHN0cm9uZz5Bbm5vdGF0aW9uIFByb3BlcnRpZXM8L3N0cm9uZz4gdmlldyBpcyBhdmFpbGFibGUgdW5kZXIKLTxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLnNob3dWaWV3KG9yZy5lY2xpcHNlLnVpLnZpZXdzLnNob3dWaWV3LnZpZXdJZD1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkudmlld3MuQW5ub3RhdGlvbnNWaWV3KSIpJz4KLTxpbWcgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9jb21tYW5kX2xpbmsucG5nIiBhbHQ9Ik9wZW4gdGhlIGFubm90YXRpb24gcHJvcGVydGllcyB2aWV3Ij48c3Ryb25nPldpbmRvdyAmZ3Q7IFNob3cgVmlldyAmZ3Q7IE90aGVyLi4uICZndDsgSkFYLVdTICZndDsgQW5ub3RhdGlvbiBQcm9wZXJ0aWVzPC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudS4gPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hbm5vdGF0aW9uc192aWV3LnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYW5ub3RhdGlvbnNfdmlldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjMzZiOTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hbm5vdGF0aW9uc192aWV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYW5ub3RhdGlvbnNfdmlld19leHBhbmRlZC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2Fubm90YXRpb25zX3ZpZXdfZXhwYW5kZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OTRlNTNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYW5ub3RhdGlvbnNfdmlld19leHBhbmRlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90aXBzL2ltYWdlcy9jb250ZW50X2Fzc2lzdC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90aXBzL2ltYWdlcy9jb250ZW50X2Fzc2lzdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwNDdmMjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdGlwcy9pbWFnZXMvY29udGVudF9hc3Npc3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdGlwcy9pbWFnZXMvcXVpY2tfZml4ZXMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdGlwcy9pbWFnZXMvcXVpY2tfZml4ZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyY2E0YzFiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RpcHMvaW1hZ2VzL3F1aWNrX2ZpeGVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RpcHMvdGlwc190cmlja3MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RpcHMvdGlwc190cmlja3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTlkMGFkMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90aXBzL3RpcHNfdHJpY2tzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+VGlwcyBhbmQgdHJpY2tzIChKQVgtV1MgVG9vbHMpPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2xpdmVoZWxwLmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPlRpcHMgYW5kIHRyaWNrcyAoSkFYLVdTIFRvb2xzKTwvaDI+Ci08cD5UaGUgZm9sbG93aW5nIHRpcHMgYW5kIHRyaWNrcyBnaXZlIHNvbWUgaGVscGZ1bCBpZGVhcyBmb3IgaW5jcmVhc2luZyB5b3VyIHByb2R1Y3Rpdml0eS48L3A+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBzdW1tYXJ5PSJKYXZhIHNlYXJjaCBhY3Rpb25zIj4KLSAgICAgIDx0Ym9keT4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD48Yj5Db250ZW50IEFzc2lzdDwvYj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5Db250ZW50IGFzc2lzdCBwcm92aWRlcyB5b3Ugd2l0aCBhIGxpc3Qgb2YgcHJvcG9zYWxzIGlmIGF2YWlsYWJsZSBvciB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIGFzIG91dGxpbmVkIGluIHRoZSBKQVgtV1Mgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBhbm5vdGF0aW9ucyBlbGVtZW50LgotICAgICAgICAgICAgSW4gdGhlIEphdmEgZWRpdG9yIHByZXNzIDxiPkN0cmwrU3BhY2U8L2I+IG9yIHVzZSA8Yj5FZGl0ICZndDsgQ29udGVudCBBc3Npc3QgICZndDsgSkFYLVdTIFByb3Bvc2FsczwvYj4gd2hlbiB0aGUgY3Vyc29yIGlzIGJldHdlZW4gdGhlIHF1b3RhdGlvbiBtYXJrcyBvZiBhbiBhbm5vdGF0aW9ucyBlbGVtZW50IFN0cmluZyB2YWx1ZQotICAgICAgICAgICAgb3IgZGlyZWN0bHkgYWZ0ZXIgdGhlICc9JyBzaW1wbGUgYXNzaWdubWVudCBvcGVyYXRvci48L3A+Ci0gICAgICAgICAgICA8cD48aW1nIHNyYz0iLi9pbWFnZXMvY29udGVudF9hc3Npc3QucG5nIiBhbHQ9IkNvbnRlbnQgQXNzaXN0IiA+IDwvcD4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+PGI+VXNlIFF1aWNrIEZpeGVzIHRvIHJlc29sdmUgSkFYLVdTIHZhbGlkYXRpb24gZXJyb3JzPC9iPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPldpdGggPGI+QW5ub3RhdGlvbiBQcm9jZXNzaW5nPC9iPiBlbmFibGVkIG9uIGEgcHJvamVjdCB0aGUgSkFYLVdTIGFubm90YXRpb24gcHJvY2Vzc29ycyByZXBvcnQgZXJyb3JzIGFuZCB3YXJuaW5nIHdoZW4KLSAgICAgICAgICAgIHJ1bGVzIGFyZSBicm9rZW4uIEEgbnVtYmVyIG9mIHRoZXNlIHJ1bGVzIGFyZSByZXBvcnRlZCBhcyBmaXhhYmxlIGVycm9ycyBhbmQgd2FybmluZ3MuPC9wPgotICAgICAgICAgICAgPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3F1aWNrX2ZpeGVzLnBuZyIgYWx0PSJRdWljayBGaXhlcyIgPiA8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD48Yj5Jbml0aWFsaXplIHRoZSBXZWIgU2VydmljZXMgd2l6YXJkczwvYj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5MYXVuY2ggdGhlIFdlYiBTZXJ2aWNlIGFuZCBXZWIgU2VydmljZSBDbGllbnQgd2l6YXJkcyBmcm9tIHRoZSBjb250ZXh0IG1lbnUgdG8gaW5pdGlhbGl6ZSB0aGUgd2l6YXJkIGZpZWxkcy4gCi0gICAgICAgICAgICBSaWdodC1jbGljayBvbiBhIEphdmEgSW1wbGVtZW50YXRpb24gYmVhbiBhbmQgc2VsZWN0IDxiPldlYiBTZXJ2aWNlcyA+IENyZWF0ZSBXZWIgU2VydmljZTwvYj4uIAotICAgICAgICAgICAgRm9yIGEgV1NETCBkb2N1bWVudCByaWdodC1jbGljayBhbmQgc2VsZWN0IDxiPldlYiBTZXJ2aWNlcyA+IEdlbmVyYXRlIEphdmEgYmVhbiBza2VsZXRvbjwvYj4uCi0gICAgICAgICAgICBUaGlzIHdpbGwgaW5pdGlhbGl6ZSB0aGUgJnF1b3Q7V2ViIHNlcnZpY2UgdHlwZSZxdW90OywgdGhlICZxdW90O1NlcnZpY2UgaW1wbGVtZW50YXRpb24mcXVvdDsgb3IgJnF1b3Q7U2VydmljZSBkZWZpbml0aW9uJnF1b3Q7IGZpZWxkcwotICAgICAgICAgICAgYW5kIHRoZSAmcXVvdDtTZXJ2aWNlIHByb2plY3QmcXVvdDsgZmllbGQuPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2ZDc1ZGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJKQVgtV1MgVG9vbHMgVXNlciBHdWlkZSIgdG9waWM9Im1haW5wYWdlLmh0bWwiPgotICAgPHRvcGljIGhyZWY9ImdldHRpbmdzdGFydGVkL2dldHRpbmdfc3RhcnRlZC5odG1sIiBsYWJlbD0iR2V0dGluZyBTdGFydGVkIj4KLSAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nc3RhcnRlZC9yZXF1aXJlbWVudHMuaHRtbCIgbGFiZWw9IlJlcXVpcmVtZW50cyBhbmQgSW5zdGFsbGF0aW9uIi8+Ci0gICAgICA8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sIi8+Ci0gICAgICA8YW5jaG9yIGlkPSJnZXR0aW5nc3RhcnRlZCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiPgotICAgICAgPGFuY2hvciBpZD0iY29uY2VwdHMiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlRhc2tzIj4KLSAgICAgIDxhbmNob3IgaWQ9InRhc2tzIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJSZWZlcmVuY2UiPgotICAgICAgPGFuY2hvciBpZD0icmVmZXJlbmNlIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGhyZWY9InRpcHMvdGlwc190cmlja3MuaHRtbCIgbGFiZWw9IlRpcHMgYW5kIHRyaWNrcyI+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGhyZWY9ImxlZ2FsLmh0bWwiIGxhYmVsPSJMZWdhbCI+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2Njb25jZXB0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2Njb25jZXB0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4NjVjYzQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jY29uY2VwdHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iQ29uY2VwdHMiIGxpbmtfdG89InRvYy54bWwjY29uY2VwdHMiPgotICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzL2pheHdzLmh0bWwiIGxhYmVsPSJKYXZhIEFQSSBmb3IgWE1MLUJhc2VkIFdlYiBTZXJ2aWNlcyI+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2NyZWZlcmVuY2UueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jcmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQwYTFjOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2NyZWZlcmVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IlJlZmVyZW5jZSIgbGlua190bz0idG9jLnhtbCNyZWZlcmVuY2UiPgotICAgPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwiLz4KLSAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UvYW5ub3RhdGlvbl9wcm9jZXNzb3JzLmh0bWwiIGxhYmVsPSJBbm5vdGF0aW9uIFZhbGlkYXRpb24iPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UvYW5ub3RhdGlvbl92aWV3Lmh0bWwiIGxhYmVsPSJBbm5vdGF0aW9uIFByb3BlcnRpZXMgVmlldyI+Ci0gICA8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jdGFza3MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jdGFza3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGNkYmM2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY3Rhc2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IlRhc2tzIiBsaW5rX3RvPSJ0b2MueG1sI3Rhc2tzIj4KLSAgIDxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2N0YXNrcy54bWwiLz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDljMzAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjEzNzg5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NjIyNzYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSJBc3NlbWJseSBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iV2VidG9vbHMgUGxhdGZvcm0gUHJvamVjdCI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgZmVhdHVyZSBpcyBmb3IgYnVpbGRpbmcgb25seSwgdG8gYXNzZW1ibGUgdGhlIHJlbGVhdGVkIGZlYXR1cmVzLCB3aXRob3V0IGZvcmNlaW5nIHRoZW0gdG8gZW5jb2RpbmcgZGVwZW5kZW5jaWVzIG9uIGVhY2ggb3RoZXIuIAotVGhpcyBmZWF0dXJlIHNob3VsZCBuZXZlciBhcHBlYXIgaW4gYnVpbGQgZGlzdHJpYnV0aW9ucyBvciB1cGRhdGUgc2l0ZXMuCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhODk2Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjEzNzg5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYThhMWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IkFzc2VtYmx5IEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJXZWJ0b29scyBQbGF0Zm9ybSBQcm9qZWN0Ij4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgVGhpcyBmZWF0dXJlIGlzIGZvciBidWlsZGluZyBvbmx5LCB0byBhc3NlbWJsZSB0aGUgcmVsZWF0ZWQgZmVhdHVyZXMsIHdpdGhvdXQgZm9yY2VpbmcgdGhlbSB0byBlbmNvZGluZyBkZXBlbmRlbmNpZXMgb24gZWFjaCBvdGhlci4gCi1UaGlzIGZlYXR1cmUgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBidWlsZCBkaXN0cmlidXRpb25zIG9yIHVwZGF0ZSBzaXRlcy4KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgICAgICAgCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgICAgIAotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMDNkYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjEzNzg5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMTdjNTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSJBc3NlbWJseSBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iV2VidG9vbHMgUGxhdGZvcm0gUHJvamVjdCI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgZmVhdHVyZSBpcyBmb3IgYnVpbGRpbmcgb25seSwgdG8gYXNzZW1ibGUgdGhlIHJlbGVhdGVkIGZlYXR1cmVzLCB3aXRob3V0IGZvcmNlaW5nIHRoZW0gdG8gZW5jb2RpbmcgZGVwZW5kZW5jaWVzIG9uIGVhY2ggb3RoZXIuIAotVGhpcyBmZWF0dXJlIHNob3VsZCBuZXZlciBhcHBlYXIgaW4gYnVpbGQgZGlzdHJpYnV0aW9ucyBvciB1cGRhdGUgc2l0ZXMuCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzIAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgICAgIAotICAgPGluY2x1ZGVzIAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDQ1YjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDlmMzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjAiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjkwZDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yzk5NjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMKLUJ1bmRsZS1OYW1lLjAgPSBDWEYgV2ViIFNlcnZpY2VzIFRlc3RzCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jeGYvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2N4Zi90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTQ4ZGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2N4Zi90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLkpBWEJDb3JlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0cy5KQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLkpBWFdTQ29yZVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNwZWNpZmllcyBhbGwgdGhlIGJ1bmRsZXMgb2YgdGhpcyBjb21wb25lbnQgdGhhdCBwcm92aWRlIGEgdGVzdAotICogc3VpdGUgdG8gcnVuIGR1cmluZyBhdXRvbWF0ZWQgdGVzdGluZy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IEFsbFRlc3RzU3VpdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsVGVzdHNTdWl0ZSgpIHsKLSAgICAgICAgc3VwZXIoIkFsbCBKQVhXUyBhbmQgSkFYQiBUZXN0IFN1aXRlcyIpOwotICAgICAgICBhZGRUZXN0KEpBWFdTQ29yZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChKQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlLnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEpBWEJDb3JlVGVzdFN1aXRlLnN1aXRlKCkpOwotCi0gICAgICAgIC8vQWRkaW5nIEpBWC1XUyBET00gVG9vbHMgdGVzdCBzdWl0ZXMKLSAgICAgICAgYWRkVGVzdChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLmRvbS5BbGxUZXN0c1N1aXRlLnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5BbGxUZXN0c1N1aXRlLnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMuQWxsVGVzdHNTdWl0ZS5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuQWxsVGVzdHNTdWl0ZS5zdWl0ZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGp1c3QgbmVlZCB0byBydW4gaW4gYSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB3b3JrYmVuY2guCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFsbCgpIHsKLSAgICAgICAgLy8gdGhpcyBtZXRob2QgbmVlZHMgdG8gZXhpc3QsIGJ1dCBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZwotICAgICAgICAvLyBvdGhlciB0aGFuIHRvIHNpZ25hbCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICAgICAgLy8gVGhlIHJlc3QgaXQgYXV0b21hdGljIGZyb20gdGhlIHRlc3RzIGFkZGVkIGluIGNvbnN0cnVjdG9yLgotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2N4Zi90ZXN0cy9FYXN5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2N4Zi90ZXN0cy9FYXN5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTJlNzA0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jeGYvdGVzdHMvRWFzeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEVhc3lUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogc2ltcGxlIHRlc3QganVzdCB0byBhbHdheXMgc3VjY2VlZCB0byBkZW1vbnN0cmF0ZSB0ZXN0cyBhcmUgYmVpbmcgY2FsbGVkCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRoYXRUZXN0c1J1bigpIHsKLQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiYWZlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdAotICAgIG5hbWU9InRlc3RzdWl0ZSIKLSAgICBkZWZhdWx0PSJydW4iCi0gICAgYmFzZWRpcj0iLiI+Ci0KLSAgICA8IS0tIAotICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdAotICAgICAgICAgc28gd2UnbGwgZmFpbCBmYXN0IGlmIG5vdC4gCi0gICAgICAgICAgICAgJHtlY2xpcHNlLWhvbWV9ICAgCi0gICAgICAgICAgICAgJHtidWlsZERpcmVjdG9yeX0KLSAgICAgICAgICAgICAke2J1aWxkTGFiZWx9ICAgICAgICAKLSAgICAtLT4KLSAgCi0gIAk8ZmFpbAotICAgICAgICBtZXNzYWdlPSJFcnJvcjogbWlzc2luZyBwcm9wZXJ0eS4gZWNsaXBzZS1ob21lIG11c3QgYmUgcHJvdmlkZWQiCi0gICAgICAgIHVubGVzcz0iZWNsaXBzZS1ob21lIiAvPgotICAgIDxmYWlsCi0gICAgICAgIG1lc3NhZ2U9IkVycm9yOiBtaXNzaW5nIHByb3BlcnR5LiBidWlsZERpcmVjdG9yeSBtdXN0IGJlIHByb3ZpZGVkIgotICAgICAgICB1bmxlc3M9ImJ1aWxkRGlyZWN0b3J5IiAvPgotICAgIDxmYWlsCi0gICAgICAgIG1lc3NhZ2U9IkVycm9yOiBtaXNzaW5nIHByb3BlcnR5LiBidWlsZExhYmVsIG11c3QgYmUgcHJvdmlkZWQiCi0gICAgICAgIHVubGVzcz0iYnVpbGRMYWJlbCIgLz4KLQkKLSAgICA8IS0tIHNob3VsZCBiZSBsaXR0bGUgbmVlZCB0byBjaGFuZ2Ugd2hhdCdzIGFib3ZlICAtLT4KLQkKLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0icGx1Z2luLW5hbWUiCi0gICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzIi8+Ci0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9ImNsYXNzbmFtZSIKLSAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMuQWxsVGVzdHNTdWl0ZSIvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJ0ZXN0VHlwZSIKLSAgICAgICAgdmFsdWU9InVpLXRlc3QiLz4KLQotICAgIDwhLS0gc2hvdWxkIGJlIGxpdHRsZSBuZWVkIHRvIGNoYW5nZSB3aGF0J3MgYmVsb3cgLS0+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0iYmFzZWRpcjogJHtiYXNlZGlyfSIvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9ImVjbGlwc2UtaG9tZTogJHtlY2xpcHNlLWhvbWV9Ii8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0iYnVpbGREaXJlY3Rvcnk6ICR7YnVpbGREaXJlY3Rvcnl9Ii8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0icGx1Z2luLW5hbWU6ICR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0iY2xhc3NuYW1lOiAke2NsYXNzbmFtZX0iLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJ0ZXN0VHlwZSAke3Rlc3RUeXBlfSIvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJsaWJyYXJ5LWZpbGUiCi0gICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIi8+Ci0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9IndvcmtzcGFjZSIKLSAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qdW5pdHdvcmtzcGFjZXMvJHtwbHVnaW4tbmFtZX0iLz4KLQkgIDxlY2hvIAotCSAgICAgIG1lc3NhZ2U9IndvcmtzcGFjZTogJHt3b3Jrc3BhY2V9IiAvPgotICAgIDwhLS0KLSAgICAgICAgVGhpcyBpbml0IHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUKLSAgICAgICAgZm9yIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsCi0gICAgICAgIHRlc3RzIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAKLSAgICAtLT4KLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9ImluaXQiPgotICAgICAgICA8dHN0YW1wLz4KLSAgICAgICAgPGRlbGV0ZT4KLSAgICAgICAgICAgIDxmaWxlc2V0Ci0gICAgICAgICAgICAgICAgZGlyPSIke2VjbGlwc2UtaG9tZX0iCi0gICAgICAgICAgICAgICAgaW5jbHVkZXM9IiR7cGx1Z2luLW5hbWV9Lip4bWwiLz4KLSAgICAgICAgPC9kZWxldGU+Ci0gICAgICAgIDwhLS0gbWFrZSBkaXJlY3RvcnksIGluIGNhc2UgcGF0aCBkb2Vzbid0IGV4aXN0IHlldCAtLT4KLSAgICAgICAgPG1rZGlyCi0gICAgICAgICAgICBkaXI9IiR7d29ya3NwYWNlfSIvPgotICAgICAgICA8IS0tICBidXQgZGVsZXRlIHRvIG1ha2Ugc3VyZSBmcmVzaCBjb250ZW50cy0tPgotICAgICAgICA8ZGVsZXRlCi0gICAgICAgICAgICBkaXI9IiR7d29ya3NwYWNlfSIKLSAgICAgICAgICAgIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0ic3VpdGUiPgotICAgICAgICA8YW50Ci0gICAgICAgICAgICB0YXJnZXQ9IiR7dGVzdFR5cGV9IgotICAgICAgICAgICAgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IgotICAgICAgICAgICAgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0iZGF0YS1kaXIiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0icGx1Z2luLW5hbWUiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJjbGFzc25hbWUiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7Y2xhc3NuYW1lfSIvPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0icGx1Z2luLXBhdGgiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICAgIDwvYW50PgotICAgICAgICA8Y29weQotICAgICAgICAgICAgZmFpbG9uZXJyb3I9ImZhbHNlIgotICAgICAgICAgICAgZmlsZT0iJHt3b3Jrc3BhY2V9Ly5tZXRhZGF0YS8ubG9nIgotICAgICAgICAgICAgdG9maWxlPSIke2J1aWxkRGlyZWN0b3J5fS8ke2J1aWxkTGFiZWx9L3Rlc3RSZXN1bHRzL2NvbnNvbGVsb2dzLyR7cGx1Z2luLW5hbWV9LmNvbnNvbGVsb2cudHh0Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgICA8IS0tCi0gICAgICAgIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8KLSAgICAtLT4KLSAgICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJjbGVhbnVwIj4KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgdXN1YWxseSBubyBuZWVkIHRvIGRlbGV0ZSB3b3Jrc3BhY2UgdW50aWwgbmV4dCBydW4sIGFuZAotICAgICAgICAgICAgbGVhdmluZyBpdCBhbGxvd3MgaW5zcGVjdGlvbgotICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIgLz4gLS0+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLQotICAgICAgICBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuCi0gICAgLS0+Ci0gICAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0icnVuIgotICAgICAgICBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgICAgICA8YW50Ci0gICAgICAgICAgICB0YXJnZXQ9ImNvbGxlY3QiCi0gICAgICAgICAgICBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iCi0gICAgICAgICAgICBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJpbmNsdWRlcyIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0uKnhtbCIvPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0ib3V0cHV0LWZpbGUiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgICAgICA8L2FudD4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzBjYjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU0YWRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDAwMjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNUaHUgTWF5IDA3IDE1OjQwOjIzIElTVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NjUxMGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjAiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5iaW5kO3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb247dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVyczt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIiwKLSBqYXZheC54bWwuYmluZC5hdHRhY2htZW50O3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLmhlbHBlcnM7dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQudXRpbDt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YTAzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkM2JjNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIyNTAzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI3Byb3BlcnRpZXMgZmlsZSBmb3IgSkFYQiBUb29scyBUZXN0cwotcGx1Z2luTmFtZT1KQVhCIFRvb2xzIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDgxNTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlNoYXJlZEFTVFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5QZXJmb3JtQ2hhbmdlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIFRlc3RKYXZhUHJvamVjdCB0ZXN0SmF2YVByb2plY3Q7Ci0gICAgcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgc291cmNlOwotICAgIHByb3RlY3RlZCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0OwotICAgIHByb3RlY3RlZCBBU1QgYXN0OwotICAgIHByb3RlY3RlZCBBU1RSZXdyaXRlIHJld3JpdGVyOwotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGFubm90YXRpb247Ci0gICAgcHJvdGVjdGVkIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlOwotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdCA9IG5ldyBUZXN0SmF2YVByb2plY3QoIkphdmFQcm9qZWN0Iik7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdC5zZXRBdXRvQnVpbGRpbmcoaXNBdXRvQnVpbGRpbmdFbmFibGVkKCkpOwotICAgICAgICB0ZXN0SmF2YVByb2plY3QuZW5hYmxlQW5ub3RhdGlvblByb2Nlc3NpbmcoaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSk7Ci0KLSAgICAgICAgc291cmNlID0gdGVzdEphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChnZXRQYWNrYWdlTmFtZSgpLCBnZXRDbGFzc05hbWUoKSwgZ2V0Q2xhc3NDb250ZW50cygpKTsKLSAgICAgICAgCi0gICAgICAgIGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLSAgICAgICAgYXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFTVCgpOwotICAgICAgICByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFzdCk7Ci0gICAgICAgIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKCJBZGQgYW5ub3RhdGlvbiIsIChJRmlsZSkgc291cmNlLmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICB0ZXh0RmlsZUNoYW5nZS5zZXRFZGl0KG11bHRpVGV4dEVkaXQpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0F1dG9CdWlsZGluZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENsYXNzTmFtZSgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICBpZiAoY2hhbmdlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0KLSAgICAgICAgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbiBjaGFuZ2VPcGVyYXRpb24gPSBuZXcgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbihjaGFuZ2UpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFuZ2VPcGVyYXRpb24ucnVuKG1vbml0b3IpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBjZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hhbmdlT3BlcmF0aW9uLmNoYW5nZUV4ZWN1dGVkKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWRlbGV0ZVByb2plY3QodGVzdEphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0gICAgCQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZGVsZXRlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgIAlpbnQgbm9BdHRlbXB0cyA9IDA7Ci0gICAgCXdoaWxlIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiBub0F0dGVtcHRzIDwgNSkgewotICAgIAkJdHJ5IHsKLSAgICAJCQlub0F0dGVtcHRzKys7Ci0gICAgCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKLSAgICAJCQkJcHJvamVjdC5jbG9zZShudWxsKTsgICAgCQkJCQotICAgIAkJCX0KLSAgICAJCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLSAgICAJCX0gY2F0Y2ggKFJlc291cmNlRXhjZXB0aW9uIHJlKSB7Ci0gICAgCQkJU3lzdGVtLm91dC5wcmludGxuKHJlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgCQkJVGhyZWFkLnNsZWVwKDEpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub1BhY2thZ2VUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub1BhY2thZ2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNmQ5MWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9QYWNrYWdlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBbm5vdGF0aW9uVG9QYWNrYWdlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAicGFja2FnZS1pbmZvLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgcmV0dXJuICJwYWNrYWdlIGNvbS5leGFtcGxlO1xuIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBsb2NhdGlvblZQID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgImxvY2F0aW9uIiwgInVyaTpzb21lU2NoZW1hIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVzcGFjZVZQID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgIm5hbWVzcGFjZSIsICJ1cmk6dGVzdE5TIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobG9jYXRpb25WUCk7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVzcGFjZVZQKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBYbWxTY2hlbWEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQW5ub3RhdGlvblRvUGFja2FnZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoWG1sU2NoZW1hLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIElQYWNrYWdlRGVjbGFyYXRpb24gbXlQYWNrYWdlID0gc291cmNlLmdldFBhY2thZ2VEZWNsYXJhdGlvbihnZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobXlQYWNrYWdlKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG15UGFja2FnZSwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobXlQYWNrYWdlLCBYbWxTY2hlbWEuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG15UGFja2FnZSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoWG1sU2NoZW1hLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvSkFYQkNvcmVUZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvSkFYQkNvcmVUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlYTAxMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0pBWEJDb3JlVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIE9pc2luIEh1cmxleSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSkFYQkNvcmVUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJDb3JlVGVzdFN1aXRlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBKQVhCQ29yZVRlc3RTdWl0ZSgpIHsKLSAgICAgICAgc3VwZXIoIkpBWEIgQ29yZSBUZXN0cyIpOwotICAgICAgICBhZGRUZXN0U3VpdGUoQWRkQW5ub3RhdGlvblRvUGFja2FnZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoUmVtb3ZlQW5ub3RhdGlvbkZyb21QYWNrYWdlVGVzdC5jbGFzcyk7ICAgIAotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21QYWNrYWdlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbVBhY2thZ2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWFkNzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbVBhY2thZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gInBhY2thZ2UtaW5mby5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJAWG1sU2NoZW1hXG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWE7XG5cbiIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFhtbFNjaGVtYS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uRnJvbVBhY2thZ2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFhtbFNjaGVtYS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICBJUGFja2FnZURlY2xhcmF0aW9uIG15UGFja2FnZSA9IHNvdXJjZS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG15UGFja2FnZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobXlQYWNrYWdlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChteVBhY2thZ2UsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUltcG9ydFRleHRFZGl0KG15UGFja2FnZSwgWG1sU2NoZW1hLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobXlQYWNrYWdlLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHNvdXJjZS5nZXRJbXBvcnQoWG1sU2NoZW1hLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9UZXN0SmF2YVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmNGZjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUudXRpbC5BcHRDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGwyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLQotcHVibGljIGNsYXNzIFRlc3RKYXZhUHJvamVjdCBleHRlbmRzIFRlc3RQcm9qZWN0IHsKLSAgICBwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLSAgICAKLSAgICBwdWJsaWMgVGVzdEphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBzdXBlcihwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGdldFByb2plY3QoKSk7Ci0gICAgICAgIGFkZFByb2plY3ROYXR1cmUoZ2V0UHJvamVjdCgpLCBKYXZhQ29yZS5OQVRVUkVfSUQpOwotCi0gICAgICAgIGphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXcgSUNsYXNzcGF0aEVudHJ5WzBdLCBudWxsKTsKLQotICAgICAgICBjcmVhdGVTb3VyY2VGb2xkZXIoKTsKLSAgICAgICAgYWRkVG9DbGFzc3BhdGgoamF2YVByb2plY3QsIGdldEpSRUNvbnRhaW5lckVudHJ5KCkpOwotICAgICAgICBjcmVhdGVPdXRwdXRGb2xkZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0QXV0b0J1aWxkaW5nKGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcoYXV0b0J1aWxkKTsKLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZW5hYmxlQW5ub3RhdGlvblByb2Nlc3NpbmcoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgQXB0Q29uZmlnLnNldEVuYWJsZWQoamF2YVByb2plY3QsIGVuYWJsZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSUNsYXNzcGF0aEVudHJ5IGdldEpSRUNvbnRhaW5lckVudHJ5KCkgewotICAgICAgICBJVk1JbnN0YWxsIGRlZmF1bHRWTUluc3RhbGwgPSBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0gICAgICAgIGlmIChkZWZhdWx0Vk1JbnN0YWxsICE9IG51bGwgJiYgaXNKYXZhNk9yR3JlYXRlckpSRShkZWZhdWx0Vk1JbnN0YWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIEphdmFSdW50aW1lLmdldERlZmF1bHRKUkVDb250YWluZXJFbnRyeSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBJVk1JbnN0YWxsVHlwZVtdIGluc3RhbGxUeXBlcyA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGVzKCk7Ci0gICAgICAgIGZvciAoSVZNSW5zdGFsbFR5cGUgaW5zdGFsbFR5cGUgOiBpbnN0YWxsVHlwZXMpIHsKLSAgICAgICAgICAgIElWTUluc3RhbGxbXSB2bUluc3RhbGxzID0gaW5zdGFsbFR5cGUuZ2V0Vk1JbnN0YWxscygpOwotICAgICAgICAgICAgZm9yIChJVk1JbnN0YWxsIHZtSW5zdGFsbCA6IHZtSW5zdGFsbHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNKYXZhNk9yR3JlYXRlckpSRSh2bUluc3RhbGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShKYXZhUnVudGltZS5uZXdKUkVDb250YWluZXJQYXRoKGluc3RhbGxUeXBlLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1JbnN0YWxsLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIEphdmFSdW50aW1lLmdldERlZmF1bHRKUkVDb250YWluZXJFbnRyeSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNKYXZhNk9yR3JlYXRlckpSRShJVk1JbnN0YWxsIHZtSW5zdGFsbCkgewotICAgICAgICBpZiAodm1JbnN0YWxsIGluc3RhbmNlb2YgSVZNSW5zdGFsbDIpIHsKLSAgICAgICAgICAgIElWTUluc3RhbGwyIHZtSW5zdGFsbDIgPSAoSVZNSW5zdGFsbDIpIHZtSW5zdGFsbDsKLSAgICAgICAgICAgIGlmICh2bUluc3RhbGwyLmdldEphdmFWZXJzaW9uKCkuY29tcGFyZVRvKEphdmFDb3JlLlZFUlNJT05fMV82KSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBjb250ZW50cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChuYW1lLCBjb250ZW50cywgZmFsc2UsIG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lLCB0cnVlLCBtb25pdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkgewotICAgICAgICByZXR1cm4gZ2V0SmF2YVByb2plY3QoKS5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYyIpKTsgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU291cmNlRm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJRm9sZGVyIHNyY0RpciA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYyIpOwotICAgICAgICBta2RpcnMoc3JjRGlyKTsgICAgCi0gICAgICAgIGFkZFRvQ2xhc3NwYXRoKGphdmFQcm9qZWN0LCBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShzcmNEaXIuZ2V0RnVsbFBhdGgoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVPdXRwdXRGb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElGb2xkZXIgb3V0cHV0RGlyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigiYmluIik7Ci0gICAgICAgIG1rZGlycyhvdXRwdXREaXIpOwotICAgICAgICBnZXRKYXZhUHJvamVjdCgpLnNldE91dHB1dExvY2F0aW9uKG91dHB1dERpci5nZXRGdWxsUGF0aCgpLCBtb25pdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gamF2YVByb2plY3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFRvQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IGNsYXNzcGF0aEVudHJ5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBjdXJyZW50Q2xhc3NwYXRoRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoRW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbY3VycmVudENsYXNzcGF0aEVudHJpZXMubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzLCAwLCBuZXdDbGFzc3BhdGhFbnRyaWVzLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzcGF0aEVudHJpZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIG5ld0NsYXNzcGF0aEVudHJpZXNbY3VycmVudENsYXNzcGF0aEVudHJpZXMubGVuZ3RoXSA9IGNsYXNzcGF0aEVudHJ5OwotICAgICAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aEVudHJpZXMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBqbWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzYjE1Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1Rlc3RQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotCi1wdWJsaWMgY2xhc3MgVGVzdFByb2plY3QgewotICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IHRlc3RQcm9qZWN0OwotICAgIAotICAgIHB1YmxpYyBUZXN0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIHRlc3RQcm9qZWN0ID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgdGVzdFByb2plY3QuY3JlYXRlKG1vbml0b3IpOwotICAgICAgICB0ZXN0UHJvamVjdC5vcGVuKG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHRlc3RQcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9qZWN0TmF0dXJlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYXR1cmUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gcHJvamVjdERlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgU3RyaW5nW10gcHJldmlvdXNOYXR1cmVzID0gcHJvamVjdERlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotICAgICAgICAgICAgU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldmlvdXNOYXR1cmVzLmxlbmd0aCArIDFdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwcmV2aW91c05hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZpb3VzTmF0dXJlcy5sZW5ndGgpOwotICAgICAgICAgICAgbmV3TmF0dXJlc1twcmV2aW91c05hdHVyZXMubGVuZ3RoXSA9IG5hdHVyZTsKLSAgICAgICAgICAgIHByb2plY3REZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0gICAgICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKHByb2plY3REZXNjcmlwdGlvbiwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGNlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG1rZGlycyhmaW5hbCBJRm9sZGVyIGZvbGRlcikgewotICAgIAl0cnkgewotCSAgICAgICAgaWYgKCFmb2xkZXIuZXhpc3RzKCkgJiYgZm9sZGVyLmdldFBhcmVudCgpLmlzQWNjZXNzaWJsZSgpKSB7Ci0JICAgICAgICAgICAgZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkgICAgICAgIH0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDNmY2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDAwMjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVGh1IE1heSAwNyAxNTo0MDoyMyBJU1QgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTEzMmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMCIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1JbXBvcnQtUGFja2FnZTogamF2YXguandzLAotIGphdmF4Lmp3cy5zb2FwLAotIGphdmF4LnhtbC53czt2ZXJzaW9uPSIyLjEuMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHMsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZhMDMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzYmM3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjcyMzk5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlIGFuZCBvdGhlcnMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI3Byb3BlcnRpZXMgZmlsZSBmb3IgSkFYLVdTIFRvb2xzIFRlc3RzCi1wbHVnaW5OYW1lPUpBWC1XUyBUb29scyBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNWFkMDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLkFic3RyYWN0QW5ub3RhdGlvblRlc3Q7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBdXRvQnVpbGRpbmdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3REb2N1bWVudEJhcmVWYWxpZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjRmZjUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3REb2N1bWVudEJhcmVWYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotICAgICAgICAKLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInN0eWxlIiwgU3R5bGUuRE9DVU1FTlQpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB1c2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAidXNlIiwgVXNlLkxJVEVSQUwpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJwYXJhbWV0ZXJTdHlsZSIsIFBhcmFtZXRlclN0eWxlLkJBUkUpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHN0eWxlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodXNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzKTsKLQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdCIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIFN0cmluZyBvbmVJTihTdHJpbmcgaW5PbmUsIFN0cmluZyBpblR3bykge1xuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdE9uZXdheVZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0T25ld2F5VmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkZTMwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0T25ld2F5VmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T25ld2F5VmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBPbmV3YXkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc3QoKTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXlSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhPbmV3YXkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZFRvVGVzdCgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIE9uZXdheS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChPbmV3YXkuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0RXJyb3JNZXNzYWdlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzVlMjc2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIFN0cmluZyBteU1ldGhvZChTdHJpbmcgaW4pIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWFlOGMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShuYW1lPVwiTXlDbGFzc1wiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRTdHJpbmcgbXlQYWNrYWdlUHJpdmF0ZU1ldGhvZCgpIHtcblx0XHRyZXR1cm4gXCJwYWNrYWdlLXByaXZhdGVcIjtcblx0fVxuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHJpdmF0ZSBTdHJpbmcgbXlQcml2YXRlTWV0aG9kKCkge1xuXHRcdHJldHVybiBcInByaXZhdGVcIjtcblx0fVxuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHJvdGVjdGVkIFN0cmluZyBteVByb3RlY3RlZE1ldGhvZCgpIHtcblx0XHRteVByaXZhdGVNZXRob2QoKTtcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRcdHJldHVybiBcInByb3RlY3RlZFwiO1xuXHR9XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIHN0YXRpYyBTdHJpbmcgbXlTdGF0aWNNZXRob2QoKSB7XG5cdFx0cmV0dXJuIFwic3RhdGljXCI7XG5cdH1cblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBmaW5hbCBTdHJpbmcgbXlGaW5hbE1ldGhvZCgpIHtcblx0XHRyZXR1cm4gXCJmaW5hbFwiO1xuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJTWV0aG9kIGdldE1ldGhvZFRvVGVzZXQoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYk1ldGhvZFJlc3RyaWN0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZFRvVGVzZXQoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldEVycm9yTWVzc2FnZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjYxOTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiTXlDbGFzcyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwb3J0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAicG9ydE5hbWUiLAotICAgICAgICAgICAgICAgICJNeUNsYXNzUG9ydCIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzZXJ2aWNlTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJzZXJ2aWNlTmFtZSIsICJNeUNsYXNzU2VydmljZSIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocG9ydE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfUFVCTElDX0FCU1RSQUNUX0ZJTkFMLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmEwZDhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICB0ZXN0SmF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGdldFBhY2thZ2VOYW1lKCksIGdldEludGVyZmFjZU5hbWUoKSwgZ2V0SW50ZXJmYWNlQ29udGVudHMoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uZXhhbXBsZS5NeUludGVyZmFjZVwiLCAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9leGFtcGxlLmNvbS9cIiwgcG9ydE5hbWU9XCJNeUNsYXNzUG9ydFwiLCAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInNlcnZpY2VOYW1lPVwiTXlDbGFzc1NlcnZpY2VcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIHZvaWQgbWV0aG9kT25lKFN0cmluZyBpbikge1xuXHR9XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKFN0cmluZyBpbikgeyIgKyAiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbnRlcmZhY2VDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzZWlDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgc2VpQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBzZWlDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJNeUludGVyZmFjZVwiLCB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vZXhhbXBsZS5jb20vXCIpXG4iKTsKLSAgICAgICAgc2VpQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlIHtcblxuIik7Ci0gICAgICAgIHNlaUNvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKFN0cmluZyBpbik7XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIHNlaUNvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15SW50ZXJmYWNlLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Eb2NCYXJlTm9uVm9pZE5vT3V0UGFyYW1ldGVyc1J1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVOb25Wb2lkTm9PdXRQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmNjQyMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVOb25Wb2lkTm9PdXRQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRG9jQmFyZU5vblZvaWROb091dFBhcmFtZXRlcnNSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlBhcmFtO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgU3RyaW5nIG5vT3V0KFN0cmluZyBpbiwgQFdlYlBhcmFtKG5hbWU9XCJvdXRcIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLk9VVCkgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJTdHJpbmcgb3V0KSB7XG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb25Wb2lkTm9PVVRQYXJhbWV0ZXJSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibm9PdXQiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiLAotICAgICAgICAgICAgICAgICAgICAiUVN0cmluZzsgIn0pOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfTk9OX1ZPSURfUkVUVVJOX05PX0lOT1VUX09VVF9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVPbmVOb25IZWFkZXJJTlBhcmFtZXRlclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVPbmVOb25IZWFkZXJJTlBhcmFtZXRlclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Yjg0NTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Eb2NCYXJlT25lTm9uSGVhZGVySU5QYXJhbWV0ZXJSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRG9jQmFyZU9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50QmFyZVZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0Iik7Ci0gICAgICAgIC8vY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBTdHJpbmcgb25lSU4oKSB7XG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxuXHQiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBTdHJpbmcgb25lTW9yZShAV2ViUGFyYW0obmFtZT1cImluT25lXCIsIG1vZGU9V2ViUGFyYW0uTW9kZS5JTikgU3RyaW5nICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW5PbmUsIEBXZWJQYXJhbShuYW1lPVwiaW5Ud29cIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLklOKVN0cmluZyBpblR3bykge1xuXHRcdCIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicmV0dXJuIFwidHh0XCI7XG5cdH1cblxuXHRwdWJsaWMgU3RyaW5nIG9ubHlPbmVJTihTdHJpbmcgaW5PbmUsIFN0cmluZyBpblR3bykgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVOb25IZWFkZXJJTlBhcmFtZXRlclJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTT0FQQmluZGluZyIsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgib25lSU4iLCBuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmdldEltcG9ydENoYW5nZShjb21waWxhdGlvblVuaXQsIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5jcmVhdGVNZXRob2RBbm5vdGF0aW9uQ2hhbmdlKHNvdXJjZSwgY29tcGlsYXRpb25Vbml0LCByZXdyaXRlciwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX09ORV9OT05fSEVBREVSX0lOX1BBUkFNRVRFUl9FUlJPUl9NRVNTQUdFLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfSovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25seU9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm9ubHlPbmVJTiIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIsCi0gICAgICAgICAgICAgICAgICAgICJRU3RyaW5nOyIgfSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9PTkxZX09ORV9OT05fSEVBREVSX0lOX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmx5T25lTm9uSGVhZGVySU5QYXJhbWV0ZXJXaXRoV2ViUGFyYW1zUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm9uZU1vcmUiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiLAotICAgICAgICAgICAgICAgICAgICAiUVN0cmluZzsiIH0pOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfT05MWV9PTkVfTk9OX0hFQURFUl9JTl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZVZvaWRPbmVJTk9uZU91dFBhcmFtZXRlclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVWb2lkT25lSU5PbmVPdXRQYXJhbWV0ZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTY1MTIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZVZvaWRPbmVJTk9uZU91dFBhcmFtZXRlclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEb2NCYXJlVm9pZE9uZUlOT25lT3V0UGFyYW1ldGVyUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50QmFyZVZhbGlkYXRpb25UZXN0IHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHQiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyB2b2lkIG9uZUluKEBXZWJQYXJhbShuYW1lPVwiaW5PbmVcIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLklOT1VUKSAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkhvbGRlcjxTdHJpbmc+IGluT25lLCBAV2ViUGFyYW0obmFtZT1cImluVHdvXCIsIG1vZGU9V2ViUGFyYW0uTW9kZS5JTikgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJTdHJpbmcgaW5Ud28pIHtcblxuXHR9XG5cblx0Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgdm9pZCBvbmVPdXQoQFdlYlBhcmFtKG5hbWU9XCJvdXRPbmVcIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLklOT1VUKSAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkhvbGRlcjxTdHJpbmc+IG91dE9uZSwgQFdlYlBhcmFtKG5hbWU9XCJvdXRUd29cIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLk9VVCkgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJIb2xkZXI8U3RyaW5nPiBvdXRUd28pIHtcblxuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZE9uZUluUGFyYW1ldGVyUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm9uZUluIiwgbmV3IFN0cmluZ1tdIHsgIlFIb2xkZXI8UVN0cmluZzs+OyIsCi0gICAgICAgICAgICAgICAgICAgICJRU3RyaW5nOyJ9KTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX1ZPSURfUkVUVVJOX09ORV9JTl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZE9uZU91dFBhcmFtZXRlclJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJvbmVPdXQiLCBuZXcgU3RyaW5nW10geyAiUUhvbGRlcjxRU3RyaW5nOz47IiwKLSAgICAgICAgICAgICAgICAgICAgIlFIb2xkZXI8UVN0cmluZzs+OyJ9KTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX1ZPSURfUkVUVVJOX09ORV9PVVRfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0hvbGRlclR5cGVQYXJhbWV0ZXJSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Ib2xkZXJUeXBlUGFyYW1ldGVyUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3ZDUxNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0hvbGRlclR5cGVQYXJhbWV0ZXJSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBIb2xkZXJUeXBlUGFyYW1ldGVyUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgdm9pZCBteU1ldGhvZCgiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJQYXJhbShtb2RlPVdlYlBhcmFtLk1vZGUuSU4pIEhvbGRlcjxqYXZhLmxhbmcuU3RyaW5nPiBwYXJhbSkge1xuXG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SG9sZGVyVHlwZVBhcmFtZXRlclJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5IT0xERVJfVFlQRV9NVVNUX0JFX09VVF9JTk9VVCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH1jYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9KQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0pBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4NGExZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0pBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSkFYV1NBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYV1NBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3RTdWl0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBKQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlKCkgewotICAgICAgICBzdXBlcigiSkFYLVdTIEFubm90YXRpb24gVmFsaWRhdGlvbiBUZXN0cyIpOwotICAgICAgICBhZGRUZXN0U3VpdGUoRG9jQmFyZU5vblZvaWROb091dFBhcmFtZXRlcnNSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShEb2NCYXJlT25lTm9uSGVhZGVySU5QYXJhbWV0ZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShEb2NCYXJlVm9pZE9uZUlOT25lT3V0UGFyYW1ldGVyUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoT25ld2F5Tm9SZXR1cm5WYWx1ZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKE9uZXdheU5vQ2hlY2tlZEV4Y2VwdGlvbnNSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShIb2xkZXJUeXBlUGFyYW1ldGVyUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoT25ld2F5Tm9Ib2xkZXJQYXJhbWV0ZXJzUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoU09BUEJpbmRpbmdSUENTdHlsZU9uTWV0aG9kUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoU09BUEJpbmRpbmdSUENFbmNvZGVkUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoU09BUEJpbmRpbmdEb2N1bWVudEVuY29kZWRSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShTT0FQQmluZGluZ1JDUEJhcmVSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShTT0FQQmluZGluZ01peGVkQmluZGluZ3NSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2RFeGNsdWRlUnVsZU9uU0VJVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2RFeGNsdWRlUnVsZU9uSW1wbFRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViTWV0aG9kTm9QYWNrYWdlUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZE5vUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZE5vUHJvdGVjdGVkTWV0aG9kUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViTWV0aG9kTm9GaW5hbE1vZGlmaWVyUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViTWV0aG9kTm9TdGF0aWNNb2RpZmllclJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlBhcmFtTW9kZUhvbGRlclR5cGVSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlTm9GaW5hbE1vZGlmZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlTm9BYnN0cmFjdE1vZGlmaWVyUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVNFSU5vU2VydmljZU5hbWVSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb1BvcnROYW1lUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVNFSU5vV2ViTWV0aG9kUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVNFSU5vV2ViUmVzdWx0UnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVNFSU5vV2ViUGFyYW1SdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9PbmV3YXlSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9TT0FQQmluZGluZ1J1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZVRlc3QuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb0NoZWNrZWRFeGNlcHRpb25zUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9DaGVja2VkRXhjZXB0aW9uc1J1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOWQwOWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb0NoZWNrZWRFeGNlcHRpb25zUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgT25ld2F5Tm9DaGVja2VkRXhjZXB0aW9uc1J1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgdm9pZCBteU1ldGhvZChpbnQgaSkgdGhyb3dzIEV4Y2VwdGlvbiB7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLk9ORVdBWV9OT19DSEVDS0VEX0VYQ0VQVElPTlM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNZXRob2QgZ2V0TWV0aG9kVG9UZXN0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW117IkkifSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vSG9sZGVyUGFyYW1ldGVyc1J1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vSG9sZGVyUGFyYW1ldGVyc1J1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZjRhOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb0hvbGRlclBhcmFtZXRlcnNSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBPbmV3YXlOb0hvbGRlclBhcmFtZXRlcnNSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0T25ld2F5VmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIHZvaWQgbXlNZXRob2QoIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJIb2xkZXI8U3RyaW5nPiBpbikge1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fSE9MREVSX1BBUkFNRVRFUlM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNZXRob2QgZ2V0TWV0aG9kVG9UZXN0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW117IlFIb2xkZXI8UVN0cmluZzs+OyJ9KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9SZXR1cm5WYWx1ZVJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vUmV0dXJuVmFsdWVSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWEwZjkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9SZXR1cm5WYWx1ZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE9uZXdheU5vUmV0dXJuVmFsdWVSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0T25ld2F5VmFsaWRhdGlvblRlc3QgewotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotCSAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0JICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIGludCBteU1ldGhvZChpbnQgaSkge1xuXHRcdHJldHVybiAwO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0JfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fUkVUVVJOX1ZBTFVFOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZFRvVGVzdCgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdeyJJIn0pOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdEb2N1bWVudEVuY29kZWRSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjg0MjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdEb2N1bWVudEVuY29kZWRSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzdHlsZSIsIFN0eWxlLkRPQ1VNRU5UKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInVzZSIsIFVzZS5FTkNPREVEKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAicGFyYW1ldGVyU3R5bGUiLCBQYXJhbWV0ZXJTdHlsZS5CQVJFKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfRE9DVU1FTlRfRU5DT0RFRF9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ01peGVkQmluZGluZ3NSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ01peGVkQmluZGluZ3NSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODkwMGNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdNaXhlZEJpbmRpbmdzUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdNaXhlZEJpbmRpbmdzUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAic3R5bGUiLCBTdHlsZS5ET0NVTUVOVCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHVzZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJ1c2UiLCBVc2UuTElURVJBTCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInBhcmFtZXRlclN0eWxlIiwgUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc3R5bGVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh1c2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZztcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAU09BUEJpbmRpbmcoc3R5bGU9U09BUEJpbmRpbmcuU3R5bGUuUlBDLCB1c2U9U09BUEJpbmRpbmcuVXNlLkxJVEVSQUwsICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicGFyYW1ldGVyU3R5bGU9U09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRClcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoU3RyaW5nIGluKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBCaW5kaW5nTWl4ZWRCaW5kaW5nc1J1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfTk9fTUlYRURfQklORElOR1MsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUkNQQmFyZVJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUkNQQmFyZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NjI2OTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JDUEJhcmVSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ1JDUEJhcmVSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzdHlsZSIsIFN0eWxlLlJQQyk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHVzZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJ1c2UiLCBVc2UuTElURVJBTCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInBhcmFtZXRlclN0eWxlIiwgUGFyYW1ldGVyU3R5bGUuQkFSRSk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc3R5bGVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh1c2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdSUENCYXJlUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX1JQQ19OT19CQVJFX1BBUkFNRVRFUl9TVFlMRSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JQQ0VuY29kZWRSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JQQ0VuY29kZWRSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWIwYTI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSUENFbmNvZGVkUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdSUENFbmNvZGVkUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAic3R5bGUiLCBTdHlsZS5SUEMpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB1c2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAidXNlIiwgVXNlLkVOQ09ERUQpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJwYXJhbWV0ZXJTdHlsZSIsIFBhcmFtZXRlclN0eWxlLldSQVBQRUQpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHN0eWxlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodXNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBCaW5kaW5nUlBDRW5jb2RlZFJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUlBDU3R5bGVPbk1ldGhvZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUlBDU3R5bGVPbk1ldGhvZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NDI0YTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JQQ1N0eWxlT25NZXRob2RSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nUlBDU3R5bGVPbk1ldGhvZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInN0eWxlIiwgU3R5bGUuUlBDKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInVzZSIsIFVzZS5MSVRFUkFMKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAicGFyYW1ldGVyU3R5bGUiLCBQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQQmluZGluZ1JQQ1N0eWxlT25NZXRob2RzUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19OT19SUENfU1RZTEVfT05fTUVUSE9EUywKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDQwYzRkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG9wZXJhdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJvcGVyYXRpb25OYW1lIiwgIm15TWV0aG9kIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGFjdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAiYWN0aW9uIiwKLSAgICAgICAgICAgICAgICAidXJuOk15TWV0aG9kIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQob3BlcmF0aW9uVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoYWN0aW9uVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKCkgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9TVVBQT1JURURfT05fQ0xBU1NFU19XSVRIX1dFQlNFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlT25JbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RFeGNsdWRlUnVsZU9uSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlODhiYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlT25JbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25JbXBsVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG9wZXJhdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJvcGVyYXRpb25OYW1lIiwgIm15TWV0aG9kIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGFjdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAiYWN0aW9uIiwKLSAgICAgICAgICAgICAgICAidXJuOk15TWV0aG9kIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGV4Y2x1ZGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQm9vbGVhbk1lbWJlclZhbHVlUGFpcihhc3QsICJleGNsdWRlIiwKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG9wZXJhdGlvblZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGFjdGlvblZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGV4Y2x1ZGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJNeUNsYXNzXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKCkgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfRVhDTFVERV9TUEVDSUZJRURfTk9fT1RIRVJfQVRUUklCVVRFU19BTExPV0VELAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RFeGNsdWRlUnVsZU9uU0VJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RFeGNsdWRlUnVsZU9uU0VJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjgwMjQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kRXhjbHVkZVJ1bGVPblNFSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2RFeGNsdWRlUnVsZU9uU0VJVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGV4Y2x1ZGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQm9vbGVhbk1lbWJlclZhbHVlUGFpcihhc3QsICJleGNsdWRlIiwKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGV4Y2x1ZGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJNeUludGVyZmFjZVwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgaW50ZXJmYWNlIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoKTtcbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJNZXRob2RFeGNsdWRlUnVsZU9uSW50ZXJmYWNlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfRVhDTFVERV9OT1RfQUxMT1dFRF9PTl9TRUksCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9GaW5hbE1vZGlmaWVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9GaW5hbE1vZGlmaWVyUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0ZDU2ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vRmluYWxNb2RpZmllclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZE5vRmluYWxNb2RpZmllclJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZFRvVGVzZXQoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteUZpbmFsTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfTk9fRklOQUxfTU9ESUZJRVJfQUxMT1dFRDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9QYWNrYWdlUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUGFja2FnZVByaXZhdGVNZXRob2RSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGU4ZWIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9QYWNrYWdlUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZE5vUGFja2FnZVByaXZhdGVNZXRob2RSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc2V0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlQYWNrYWdlUHJpdmF0ZU1ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfT05fUFVCTElDX01FVEhPRFM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MjQxYzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1ByaXZhdGVNZXRob2RSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2ROb1ByaXZhdGVNZXRob2RSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc2V0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlQcml2YXRlTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9Qcm90ZWN0ZWRNZXRob2RSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1Byb3RlY3RlZE1ldGhvZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNTgzNTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1Byb3RlY3RlZE1ldGhvZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZE5vUHJvdGVjdGVkTWV0aG9kUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNZXRob2QgZ2V0TWV0aG9kVG9UZXNldCgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15UHJvdGVjdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9TdGF0aWNNb2RpZmllclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vU3RhdGljTW9kaWZpZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWFlNTNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9TdGF0aWNNb2RpZmllclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZE5vU3RhdGljTW9kaWZpZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc2V0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlTdGF0aWNNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9OT19TVEFUSUNfTU9ESUZJRVJfQUxMT1dFRDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViUGFyYW1Nb2RlSG9sZGVyVHlwZVJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlBhcmFtTW9kZUhvbGRlclR5cGVSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDIzZjAyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViUGFyYW1Nb2RlSG9sZGVyVHlwZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJQYXJhbU1vZGVIb2xkZXJUeXBlUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBtb2RlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFdlYlBhcmFtLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgIm1vZGUiLCBNb2RlLk9VVCk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobW9kZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJNeUNsYXNzXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKFN0cmluZyBwYXJhbSkgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViUGFyYW1Nb2RlSG9sZGVyVHlwZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIElMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TG9jYWxWYXJpYWJsZShtZXRob2QsICJwYXJhbSIpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KGxvY2FsVmFyaWFibGUsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobG9jYWxWYXJpYWJsZSwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlBhcmFtLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlBBUkFNX01PREVfT1VUX0lOT1VUX0hPTERFUl9UWVBFLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhOGZkZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBvcnROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJwb3J0TmFtZSIsCi0gICAgICAgICAgICAgICAgIk15Q2xhc3NQb3J0Iik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHNlcnZpY2VOYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInNlcnZpY2VOYW1lIiwgIk15Q2xhc3NTZXJ2aWNlIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwb3J0TmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHNlcnZpY2VOYW1lVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIE15Q2xhc3MoU3RyaW5nIGFyZykge1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfREVGQVVMVF9QVUJMSUNfQ09OU1RSVUNUT1IsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vQWJzdHJhY3RNb2RpZmllclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0Fic3RyYWN0TW9kaWZpZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTA4MzI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vQWJzdHJhY3RNb2RpZmllclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZU5vQWJzdHJhY3RNb2RpZmllclJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGVUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGFic3RyYWN0IGNsYXNzIE15Q2xhc3Mge1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIFN0cmluZyBteU1ldGhvZCgpIHsiICsgIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vRmluYWxNb2RpZmVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vRmluYWxNb2RpZmVyUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjOTFmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0ZpbmFsTW9kaWZlclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZU5vRmluYWxNb2RpZmVyUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZVRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgZmluYWwgY2xhc3MgTXlDbGFzcyB7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKCkgeyIgKyAiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NGM0MzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBvcnROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJwb3J0TmFtZSIsCi0gICAgICAgICAgICAgICAgIk15Q2xhc3NQb3J0Iik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHNlcnZpY2VOYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInNlcnZpY2VOYW1lIiwgIk15Q2xhc3NTZXJ2aWNlIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwb3J0TmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHNlcnZpY2VOYW1lVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIHZvaWQgZmluYWxpemUoKSB7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX09WRVJSSURFX0ZJTkFMSVpFLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb0VuZHBvaW50SW50ZXJmYWNlUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vRW5kcG9pbnRJbnRlcmZhY2VSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzBkZTFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vRW5kcG9pbnRJbnRlcmZhY2VSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSU5vRW5kcG9pbnRJbnRlcmZhY2VSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiTXlDbGFzcyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBlbmRwb2ludEludGVyZmFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJlbmRwb2ludEludGVyZmFjZSIsICJNeUludGVyZmFjZSIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoZW5kcG9pbnRJbnRlcmZhY2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBpbnRlcmZhY2UgTXlJbnRlcmZhY2Uge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXllTWV0aG9kKCk7XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUludGVyZmFjZS5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVNFSU5vRW5kcG9pbnRJbnRlcmZhY2VSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTkRQT0lOVElOVEVSRkFDRV9TRUksCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vT25ld2F5UnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vT25ld2F5UnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjN2YzNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb09uZXdheVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9PbmV3YXlSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgT25ld2F5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VTRUlQcmVzZW50Tm9PbmV3YXlSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhPbmV3YXkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm1ldGhvZE9uZSIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgT25ld2F5LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KE9uZXdheS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fT05FV0FZLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1BvcnROYW1lUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vUG9ydE5hbWVSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjlmMDQ1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vUG9ydE5hbWVSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSU5vUG9ydE5hbWVSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiTXlDbGFzcyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcG9ydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgInBvcnROYW1lIiwKLSAgICAgICAgIk15Q2xhc3NQb3J0Iik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBvcnROYW1lVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15ZU1ldGhvZCgpO1xuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlJbnRlcmZhY2UuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VTRUlOb1BvcnROYW1lUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfUE9SVE5BTUVfU0VJLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1NPQVBCaW5kaW5nUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vU09BUEJpbmRpbmdSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWQxYjk5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vU09BUEJpbmRpbmdSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb1NPQVBCaW5kaW5nUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vU09BUEJpbmRpbmdPbk1ldGhvZFJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1NPQVBCSU5ESU5HLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vU09BUEJpbmRpbmdPblR5cGVSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1NPQVBCSU5ESU5HLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1NlcnZpY2VOYW1lUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vU2VydmljZU5hbWVSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjMzNWZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vU2VydmljZU5hbWVSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSU5vU2VydmljZU5hbWVSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiTXlDbGFzcyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc2VydmljZU5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAic2VydmljZU5hbWUiLCAiTXlDbGFzc1NlcnZpY2UiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc2VydmljZU5hbWVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBpbnRlcmZhY2UgTXlJbnRlcmZhY2Uge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXllTWV0aG9kKCk7XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUludGVyZmFjZS5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVNFSU5vU2VydmljZU5hbWVSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9TRVJWSUNFTkFNRV9TRUksCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViTWV0aG9kUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViTWV0aG9kUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0OTIwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1dlYk1ldGhvZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9XZWJNZXRob2RSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VTRUlQcmVzZW50Tm9XZWJNZXRob2RSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJNRVRIT0RTLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1dlYlBhcmFtUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViUGFyYW1SdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGI5NGM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViUGFyYW1SdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9XZWJQYXJhbVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJUHJlc2VudE5vV2ViUGFyYW1SdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibWV0aG9kT25lIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgbG9jYWxWYXJpYWJsZSA9IEFubm90YXRpb25VdGlscy5nZXRMb2NhbFZhcmlhYmxlKG1ldGhvZCwgImluIik7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KGxvY2FsVmFyaWFibGUsIFdlYlBhcmFtLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobG9jYWxWYXJpYWJsZSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQlBBUkFNLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJSZXN1bHRSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJSZXN1bHRSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjBmMjhiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViUmVzdWx0UnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb1dlYlJlc3VsdFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJSZXN1bHQuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVNFSVByZXNlbnROb1dlYlJlc3VsdFJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlJlc3VsdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFdlYlJlc3VsdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJSZXN1bHQuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQlJFU1VMVCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MGQzNDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTtcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjtcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2VQcm92aWRlclxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyBpbXBsZW1lbnRzIFByb3ZpZGVyPFNvdXJjZT4ge1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIFNvdXJjZSBpbnZva2UoU291cmNlIGFyZzApIHsiICsgIlxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV0VCU0VSVklDRVBST1ZJREVSX0NPTUJJTkFUSU9OLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmYjM3OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlNoYXJlZEFTVFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5QZXJmb3JtQ2hhbmdlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIFRlc3RKYXZhUHJvamVjdCB0ZXN0SmF2YVByb2plY3Q7Ci0gICAgcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgc291cmNlOwotICAgIHByb3RlY3RlZCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0OwotICAgIHByb3RlY3RlZCBBU1QgYXN0OwotICAgIHByb3RlY3RlZCBBU1RSZXdyaXRlIHJld3JpdGVyOwotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGFubm90YXRpb247Ci0gICAgcHJvdGVjdGVkIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlOwotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdCA9IG5ldyBUZXN0SmF2YVByb2plY3QoIkphdmFQcm9qZWN0Iik7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdC5zZXRBdXRvQnVpbGRpbmcoaXNBdXRvQnVpbGRpbmdFbmFibGVkKCkpOwotICAgICAgICB0ZXN0SmF2YVByb2plY3QuZW5hYmxlQW5ub3RhdGlvblByb2Nlc3NpbmcoaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSk7Ci0KLSAgICAgICAgc291cmNlID0gdGVzdEphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChnZXRQYWNrYWdlTmFtZSgpLCBnZXRDbGFzc05hbWUoKSwgZ2V0Q2xhc3NDb250ZW50cygpKTsKLQotICAgICAgICBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgIGFzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRBU1QoKTsKLSAgICAgICAgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOwotICAgICAgICBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbigpOwotICAgICAgICB0ZXh0RmlsZUNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQWRkIGFubm90YXRpb24iLCAoSUZpbGUpIHNvdXJjZS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgdGV4dEZpbGVDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBdXRvQnVpbGRpbmdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDbGFzc05hbWUoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIENoYW5nZSBjaGFuZ2UpIHsKLSAgICAgICAgaWYgKGNoYW5nZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotCi0gICAgICAgIFBlcmZvcm1DaGFuZ2VPcGVyYXRpb24gY2hhbmdlT3BlcmF0aW9uID0gbmV3IFBlcmZvcm1DaGFuZ2VPcGVyYXRpb24oY2hhbmdlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2hhbmdlT3BlcmF0aW9uLnJ1bihtb25pdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoYW5nZU9wZXJhdGlvbi5jaGFuZ2VFeGVjdXRlZCgpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlkZWxldGVQcm9qZWN0KHRlc3RKYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWxldGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgCWludCBub0F0dGVtcHRzID0gMDsKLSAgICAJd2hpbGUgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICYmIG5vQXR0ZW1wdHMgPCA1KSB7Ci0gICAgCQl0cnkgewotICAgIAkJCW5vQXR0ZW1wdHMrKzsKLSAgICAJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgewotICAgIAkJCQlwcm9qZWN0LmNsb3NlKG51bGwpOyAgICAJCQkJCi0gICAgCQkJfQotICAgIAkJCXByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotICAgIAkJfSBjYXRjaCAoUmVzb3VyY2VFeGNlcHRpb24gcmUpIHsKLSAgICAJCQlTeXN0ZW0ub3V0LnByaW50bG4ocmUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAJCQlUaHJlYWQuc2xlZXAoMSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvRmllbGRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvRmllbGRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYzY5MmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub0ZpZWxkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIEFkZEFubm90YXRpb25Ub0ZpZWxkVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIHJldHVybiAicGFja2FnZSBjb20uZXhhbXBsZTtcblxucHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHN0YXRpYyBTdHJpbmcgc2VydmljZTtcblxufSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgd3NkbExvY2F0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgIndzZGxMb2NhdGlvbiIsICJodHRwOi8vbG9jYWxob3N0OjgwODMvU2VydmljZVByb2plY3Qvc2Vydml2ZXMvTXlTZXJ2aWNlP1dTREwiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh3c2RsTG9jYXRpb25WYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2VSZWYuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQW5ub3RhdGlvblRvRmllbGQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2VSZWYuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJRmllbGQgZmllbGQgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RmllbGQoInNlcnZpY2UiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZmllbGQpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChmaWVsZCwgV2ViU2VydmljZVJlZi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChmaWVsZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChmaWVsZCwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZVJlZi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvTWV0aG9kUGFyYW1ldGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub01ldGhvZFBhcmFtZXRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyMjk1Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvTWV0aG9kUGFyYW1ldGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgQWRkQW5ub3RhdGlvblRvTWV0aG9kUGFyYW1ldGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxuXHRwdWJsaWMgaW50IGFkZChpbnQgaSwgaW50IGspIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBpICsgaztcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiaSIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb25Ub01ldGhvZFBhcmFtZXRlcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoImFkZCIsIG5ldyBTdHJpbmdbXSB7ICJJIiwgIkkiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlICA9IEFubm90YXRpb25VdGlscy5nZXRMb2NhbFZhcmlhYmxlKG1ldGhvZCwgImkiKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobG9jYWxWYXJpYWJsZSwgV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobG9jYWxWYXJpYWJsZSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvTWV0aG9kVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWZlNjFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgQWRkQW5ub3RhdGlvblRvTWV0aG9kVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxuXHRwdWJsaWMgaW50IGFkZChpbnQgaSwgaW50IGspIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBpICsgaztcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG9wZXJhdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJvcGVyYXRpb25OYW1lIiwgImFkZCIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG9wZXJhdGlvblZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb25Ub01ldGhvZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJhZGQiLCBuZXcgU3RyaW5nW10geyAiSSIsICJJIiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvVHlwZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9UeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDRmYWQzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9UeXBlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotCi1wdWJsaWMgY2xhc3MgQWRkQW5ub3RhdGlvblRvVHlwZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIkNhbGN1bGF0b3IuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvciB7XG5cblx0cHVibGljIGludCBhZGQoaW50IGksIGludCBrKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gaSArIGs7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJuYW1lIiwgIkNhbGN1bGF0b3IiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInRhcmdldE5hbWVzcGFjZSIsIEpEVFV0aWxzLmdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShnZXRQYWNrYWdlTmFtZSgpKSk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBvcnROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJwb3J0TmFtZSIsCi0gICAgICAgICAgICAgICAgIkNhbGN1bGF0b3JQb3J0Iik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHNlcnZpY2VOYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInNlcnZpY2VOYW1lIiwgIkNhbGN1bGF0b3JTZXJ2aWNlIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBvcnROYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc2VydmljZU5hbWVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQW5ub3RhdGlvblRvVHlwZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkTWVtYmVyVmFsdWVQYWlyVG9Bbm5vdGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZE1lbWJlclZhbHVlUGFpclRvQW5ub3RhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmZjUxOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkTWVtYmVyVmFsdWVQYWlyVG9Bbm5vdGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7DQotDQotcHVibGljIGNsYXNzIEFkZE1lbWJlclZhbHVlUGFpclRvQW5ub3RhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7DQotCSAgICByZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgew0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcbiIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kO1xuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTtcbiIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZjtcblxuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UoKVxuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdEBXZWJTZXJ2aWNlUmVmKClcbiIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIFN0cmluZyBteUZpZWxkO1xuXG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdEBXZWJNZXRob2QoKVxuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgaW50IGFkZChAV2ViUGFyYW0oKSBpbnQgaSwgaW50IGspIHsiKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gaSArIGs7XG5cdH1cbn0iKTsNCi0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgew0KLQkJcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgew0KLQkJcmV0dXJuICJjb20uZXhhbXBsZSI7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RBZGRNZW1iZXJWYWx1ZVBhaXJUb0Fubm90YXRpb24oKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vQFdlYlNlcnZpY2UNCi0gICAgICAgICAgICBJVHlwZSB0eXBlID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCAiV2ViU2VydmljZSIpKTsNCi0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYlNlcnZpY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBXZWJTZXJ2aWNlLmNsYXNzKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2UpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZSBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViU2VydmljZUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgd2ViU2VydmljZTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2VBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAwKTsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJuYW1lIiwgIkNhbGN1bGF0b3IiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkTWVtYmVyVmFsdWVQYWlyKHdlYlNlcnZpY2VBbm5vdGF0aW9uLCBuYW1lVmFsdWVQYWlyKTsNCi0gICAgICAgICAgICB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBXZWJTZXJ2aWNlLmNsYXNzKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2VBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAxKTsNCi0NCi0gICAgICAgICAgICAvL0BXZWJTZXJ2aWNlUmVmDQotICAgICAgICAgICAgSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCgibXlGaWVsZCIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoZmllbGQsICJXZWJTZXJ2aWNlUmVmIikpOw0KLSAgICAgICAgICAgIEFubm90YXRpb24gd2ViU2VydmljZVJlZiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGZpZWxkLCBXZWJTZXJ2aWNlUmVmLmNsYXNzKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2VSZWYpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZVJlZiBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViU2VydmljZVJlZkFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgd2ViU2VydmljZVJlZjsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAwKTsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtYXBwZWROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJtYXBwZWROYW1lIiwgIm15RmllbGQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkTWVtYmVyVmFsdWVQYWlyKHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uLCBtYXBwZWROYW1lVmFsdWVQYWlyKTsNCi0gICAgICAgICAgICB3ZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihmaWVsZCwgV2ViU2VydmljZVJlZi5jbGFzcyk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMSk7DQotDQotICAgICAgICAgICAgLy9AV2ViTWV0aG9kDQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiYWRkIiwgbmV3IFN0cmluZ1tdIHsgIkkiLCAiSSIgfSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsICJXZWJNZXRob2QiKSk7DQotICAgICAgICAgICAgQW5ub3RhdGlvbiB3ZWJNZXRob2QgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2QsIFdlYk1ldGhvZC5jbGFzcyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViTWV0aG9kIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7DQotDQotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJNZXRob2RBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIHdlYk1ldGhvZDsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYk1ldGhvZEFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDApOw0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG9wZXJhdGlvbk5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm9wZXJhdGlvbk5hbWUiLCAiYWRkIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZE1lbWJlclZhbHVlUGFpcih3ZWJNZXRob2RBbm5vdGF0aW9uLCBvcGVyYXRpb25OYW1lVmFsdWVQYWlyKTsNCi0gICAgICAgICAgICB3ZWJNZXRob2RBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYk1ldGhvZEFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOw0KLQ0KLSAgICAgICAgICAgIC8vQFdlYlBhcmFtDQotICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgbG9jYWxWYXJpYWJsZSA9IEFubm90YXRpb25VdGlscy5nZXRMb2NhbFZhcmlhYmxlKG1ldGhvZCwgImkiKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGxvY2FsVmFyaWFibGUsICJXZWJQYXJhbSIpKTsNCi0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obG9jYWxWYXJpYWJsZSwgV2ViUGFyYW0uY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViUGFyYW0pOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViUGFyYW0gaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIHdlYlBhcmFtQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJQYXJhbTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlBhcmFtQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMCk7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgInBhcnROYW1lIiwgImkiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkTWVtYmVyVmFsdWVQYWlyKHdlYlBhcmFtQW5ub3RhdGlvbiwgcGFydE5hbWVWYWx1ZVBhaXIpOw0KLSAgICAgICAgICAgIHdlYlBhcmFtQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihsb2NhbFZhcmlhYmxlLCBXZWJQYXJhbS5jbGFzcyk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJQYXJhbUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOw0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgew0KLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvSkFYV1NDb3JlVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvSkFYV1NDb3JlVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZWJmMTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0pBWFdTQ29yZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpBWFdTQ29yZVRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYV1NDb3JlVGVzdFN1aXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEpBWFdTQ29yZVRlc3RTdWl0ZSgpIHsKLSAgICAgICAgc3VwZXIoIkpBWC1XUyBDb3JlIFRlc3RzIik7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShBZGRBbm5vdGF0aW9uVG9UeXBlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShSZW1vdmVBbm5vdGF0aW9uRnJvbVR5cGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEFkZEFubm90YXRpb25Ub0ZpZWxkVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShSZW1vdmVBbm5vdGF0aW9uRnJvbUZpZWxkVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShBZGRBbm5vdGF0aW9uVG9NZXRob2RUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShBZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShBZGRNZW1iZXJWYWx1ZVBhaXJUb0Fubm90YXRpb25UZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFJlbW92ZU1lbWJlclZhbHVlUGFpclRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShVcGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21GaWVsZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbUZpZWxkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWJmZGY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbUZpZWxkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25Gcm9tRmllbGRUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRAV2ViU2VydmljZVJlZigpXG5cdHN0YXRpYyBTdHJpbmcgc2VydmljZTtcblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2VSZWYuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbkZyb21GaWVsZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZVJlZi5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElGaWVsZCBmaWVsZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGaWVsZCgic2VydmljZSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmaWVsZCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoZmllbGQsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2VSZWYuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChmaWVsZCwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlSW1wb3J0VGV4dEVkaXQoZmllbGQsIFdlYlNlcnZpY2VSZWYuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRGYWxzZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChmaWVsZCwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2VSZWYuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFBhcmFtZXRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFBhcmFtZXRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3MGIxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RQYXJhbWV0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFBhcmFtZXRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIkNhbGN1bGF0b3IuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlBhcmFtO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxuXHRwdWJsaWMgaW50IGFkZChAV2ViUGFyYW0obmFtZT1cImlcIikiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImludCBpLCBpbnQgaykge1xuXHRcdHJldHVybiBpICsgaztcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgiYWRkIiwgbmV3IFN0cmluZ1tdIHsgIkkiLCAiSSIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIElMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TG9jYWxWYXJpYWJsZShtZXRob2QsICJpIik7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobG9jYWxWYXJpYWJsZSwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzb3VyY2UuZ2V0SW1wb3J0KFdlYlBhcmFtLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQobG9jYWxWYXJpYWJsZSwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlSW1wb3J0VGV4dEVkaXQobG9jYWxWYXJpYWJsZSwgV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRGYWxzZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlBhcmFtLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTJhMWE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIkNhbGN1bGF0b3IuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYk1ldGhvZDtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvciB7XG5cblx0QFdlYk1ldGhvZFxuXHRwdWJsaWMgaW50IGFkZChpbnQgaSwgaW50IGspIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBpICsgaztcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJhZGQiLCBuZXcgU3RyaW5nW10geyAiSSIsICJJIiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc291cmNlLmdldEltcG9ydChXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUltcG9ydFRleHRFZGl0KG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShzb3VyY2UuZ2V0SW1wb3J0KFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tVHlwZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbVR5cGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MzM3ZDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tVHlwZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25Gcm9tVHlwZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIk15Q2xhc3NcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJNeUludGVyZmFjZVwiLCAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9leGFtcGxlLmNvbS9cIiwgcG9ydE5hbWU9XCJNeUNsYXNzUG9ydFwiLCAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInNlcnZpY2VOYW1lPVwiTXlDbGFzc1NlcnZpY2VcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIFN0cmluZyBteU1ldGhvZCgpIHsiICsgIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25Gcm9tVHlwZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRGYWxzZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlTWVtYmVyVmFsdWVQYWlyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZU1lbWJlclZhbHVlUGFpclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwMzJmNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlTWVtYmVyVmFsdWVQYWlyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVNZW1iZXJWYWx1ZVBhaXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShuYW1lPVwiQ2FsY3VsYXRvclwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvciB7XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTWVtYmVyVmFsdWVQYWlyRnJvbUFubm90YXRpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsICJXZWJTZXJ2aWNlIikpOwotICAgICAgICAgICAgQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2UpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViU2VydmljZUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgd2ViU2VydmljZTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOwotCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZUFubm90YXRpb24sICJuYW1lIik7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5yZW1vdmVNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZUFubm90YXRpb24sIG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICAgICAgd2ViU2VydmljZUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2VBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAwKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVGVzdEphdmFQcm9qZWN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVGVzdEphdmFQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMGI1YjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUudXRpbC5BcHRDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGwyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLQotcHVibGljIGNsYXNzIFRlc3RKYXZhUHJvamVjdCBleHRlbmRzIFRlc3RQcm9qZWN0IHsKLSAgICBwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLSAgICAKLSAgICBwdWJsaWMgVGVzdEphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBzdXBlcihwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGdldFByb2plY3QoKSk7Ci0gICAgICAgIGFkZFByb2plY3ROYXR1cmUoZ2V0UHJvamVjdCgpLCBKYXZhQ29yZS5OQVRVUkVfSUQpOwotCi0gICAgICAgIGphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXcgSUNsYXNzcGF0aEVudHJ5WzBdLCBudWxsKTsKLQotICAgICAgICBjcmVhdGVTb3VyY2VGb2xkZXIoKTsKLSAgICAgICAgYWRkVG9DbGFzc3BhdGgoamF2YVByb2plY3QsIGdldEpSRUNvbnRhaW5lckVudHJ5KCkpOwotICAgICAgICBjcmVhdGVPdXRwdXRGb2xkZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0QXV0b0J1aWxkaW5nKGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcoYXV0b0J1aWxkKTsKLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZW5hYmxlQW5ub3RhdGlvblByb2Nlc3NpbmcoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgQXB0Q29uZmlnLnNldEVuYWJsZWQoamF2YVByb2plY3QsIGVuYWJsZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSUNsYXNzcGF0aEVudHJ5IGdldEpSRUNvbnRhaW5lckVudHJ5KCkgewotICAgICAgICBJVk1JbnN0YWxsIGRlZmF1bHRWTUluc3RhbGwgPSBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0gICAgICAgIGlmIChkZWZhdWx0Vk1JbnN0YWxsICE9IG51bGwgJiYgaXNKYXZhNk9yR3JlYXRlckpSRShkZWZhdWx0Vk1JbnN0YWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIEphdmFSdW50aW1lLmdldERlZmF1bHRKUkVDb250YWluZXJFbnRyeSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBJVk1JbnN0YWxsVHlwZVtdIGluc3RhbGxUeXBlcyA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGVzKCk7Ci0gICAgICAgIGZvciAoSVZNSW5zdGFsbFR5cGUgaW5zdGFsbFR5cGUgOiBpbnN0YWxsVHlwZXMpIHsKLSAgICAgICAgICAgIElWTUluc3RhbGxbXSB2bUluc3RhbGxzID0gaW5zdGFsbFR5cGUuZ2V0Vk1JbnN0YWxscygpOwotICAgICAgICAgICAgZm9yIChJVk1JbnN0YWxsIHZtSW5zdGFsbCA6IHZtSW5zdGFsbHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNKYXZhNk9yR3JlYXRlckpSRSh2bUluc3RhbGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShKYXZhUnVudGltZS5uZXdKUkVDb250YWluZXJQYXRoKGluc3RhbGxUeXBlLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1JbnN0YWxsLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIEphdmFSdW50aW1lLmdldERlZmF1bHRKUkVDb250YWluZXJFbnRyeSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNKYXZhNk9yR3JlYXRlckpSRShJVk1JbnN0YWxsIHZtSW5zdGFsbCkgewotICAgICAgICBpZiAodm1JbnN0YWxsIGluc3RhbmNlb2YgSVZNSW5zdGFsbDIpIHsKLSAgICAgICAgICAgIElWTUluc3RhbGwyIHZtSW5zdGFsbDIgPSAoSVZNSW5zdGFsbDIpIHZtSW5zdGFsbDsKLSAgICAgICAgICAgIGlmICh2bUluc3RhbGwyLmdldEphdmFWZXJzaW9uKCkuY29tcGFyZVRvKEphdmFDb3JlLlZFUlNJT05fMV82KSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBjb250ZW50cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChuYW1lLCBjb250ZW50cywgZmFsc2UsIG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lLCB0cnVlLCBtb25pdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkgewotICAgICAgICByZXR1cm4gZ2V0SmF2YVByb2plY3QoKS5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYyIpKTsgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU291cmNlRm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJRm9sZGVyIHNyY0RpciA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYyIpOwotICAgICAgICBta2RpcnMoc3JjRGlyKTsgICAgCi0gICAgICAgIGFkZFRvQ2xhc3NwYXRoKGphdmFQcm9qZWN0LCBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShzcmNEaXIuZ2V0RnVsbFBhdGgoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVPdXRwdXRGb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElGb2xkZXIgb3V0cHV0RGlyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigiYmluIik7Ci0gICAgICAgIG1rZGlycyhvdXRwdXREaXIpOwotICAgICAgICBnZXRKYXZhUHJvamVjdCgpLnNldE91dHB1dExvY2F0aW9uKG91dHB1dERpci5nZXRGdWxsUGF0aCgpLCBtb25pdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gamF2YVByb2plY3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFRvQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IGNsYXNzcGF0aEVudHJ5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBjdXJyZW50Q2xhc3NwYXRoRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoRW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbY3VycmVudENsYXNzcGF0aEVudHJpZXMubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzLCAwLCBuZXdDbGFzc3BhdGhFbnRyaWVzLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudENsYXNzcGF0aEVudHJpZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIG5ld0NsYXNzcGF0aEVudHJpZXNbY3VycmVudENsYXNzcGF0aEVudHJpZXMubGVuZ3RoXSA9IGNsYXNzcGF0aEVudHJ5OwotICAgICAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aEVudHJpZXMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBqbWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9UZXN0UHJvamVjdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1Rlc3RQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZGVhZTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1Rlc3RQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotCi1wdWJsaWMgY2xhc3MgVGVzdFByb2plY3QgewotICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLSAgICBwcml2YXRlIElQcm9qZWN0IHRlc3RQcm9qZWN0OwotICAgIAotICAgIHB1YmxpYyBUZXN0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIHRlc3RQcm9qZWN0ID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgdGVzdFByb2plY3QuY3JlYXRlKG1vbml0b3IpOwotICAgICAgICB0ZXN0UHJvamVjdC5vcGVuKG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHRlc3RQcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9qZWN0TmF0dXJlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYXR1cmUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gcHJvamVjdERlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgU3RyaW5nW10gcHJldmlvdXNOYXR1cmVzID0gcHJvamVjdERlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotICAgICAgICAgICAgU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldmlvdXNOYXR1cmVzLmxlbmd0aCArIDFdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwcmV2aW91c05hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZpb3VzTmF0dXJlcy5sZW5ndGgpOwotICAgICAgICAgICAgbmV3TmF0dXJlc1twcmV2aW91c05hdHVyZXMubGVuZ3RoXSA9IG5hdHVyZTsKLSAgICAgICAgICAgIHByb2plY3REZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0gICAgICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKHByb2plY3REZXNjcmlwdGlvbiwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGNlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG1rZGlycyhmaW5hbCBJRm9sZGVyIGZvbGRlcikgewotICAgIAl0cnkgewotCSAgICAgICAgaWYgKCFmb2xkZXIuZXhpc3RzKCkgJiYgZm9sZGVyLmdldFBhcmVudCgpLmlzQWNjZXNzaWJsZSgpKSB7Ci0JICAgICAgICAgICAgZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkgICAgICAgIH0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1VwZGF0ZU1lbWJlclZhbHVlUGFpclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkYWYxYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlBhcmFtO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIkNhbGN1bGF0b3JcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0QFdlYlNlcnZpY2VSZWYobWFwcGVkTmFtZT1cIm15RmllbGRcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU3RyaW5nIG15RmllbGQ7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJhZGRcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgaW50IGFkZChAV2ViUGFyYW0ocGFydE5hbWU9XCJpXCIpIGludCBpLCBpbnQgaykgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWVtYmVyVmFsdWVQYWlyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9AV2ViU2VydmljZQotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCAiV2ViU2VydmljZSIpKTsKLSAgICAgICAgICAgIEFubm90YXRpb24gd2ViU2VydmljZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZSBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pOwotCi0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIHdlYlNlcnZpY2U7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2VBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAxKTsKLQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYlNlcnZpY2VBbm5vdGF0aW9uLCAibmFtZSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgbmFtZVZhbHVlID0gIChTdHJpbmdMaXRlcmFsKSBuYW1lVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG5hbWVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoIkNhbGN1bGF0b3IiKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy51cGRhdGVNZW1iZXJWYWx1ZVBhaXIobmFtZVZhbHVlUGFpciwgQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCAiU2NpZW50aWZpY0NhbGN1bGF0b3IiKSk7Ci0gICAgICAgICAgICB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYlNlcnZpY2VBbm5vdGF0aW9uLCAibmFtZSIpOwotICAgICAgICAgICAgbmFtZVZhbHVlID0gIChTdHJpbmdMaXRlcmFsKSBuYW1lVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG5hbWVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoIlNjaWVudGlmaWNDYWxjdWxhdG9yIikpOwotCi0gICAgICAgICAgICAvL0BXZWJTZXJ2aWNlUmVmCi0gICAgICAgICAgICBJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCJteUZpZWxkIik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGZpZWxkLCAiV2ViU2VydmljZVJlZiIpKTsKLSAgICAgICAgICAgIEFubm90YXRpb24gd2ViU2VydmljZVJlZiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGZpZWxkLCBXZWJTZXJ2aWNlUmVmLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZVJlZik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2VSZWYgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKTsKLQotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJTZXJ2aWNlUmVmOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMSk7Ci0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtYXBwZWROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvblV0aWxzLmdldE1lbWJlclZhbHVlUGFpcih3ZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbiwgIm1hcHBlZE5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWFwcGVkTmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICBTdHJpbmdMaXRlcmFsIG1hcHBlZE5hbWVWYWx1ZSA9ICAoU3RyaW5nTGl0ZXJhbCkgbWFwcGVkTmFtZVZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtYXBwZWROYW1lVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJteUZpZWxkIikpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMudXBkYXRlTWVtYmVyVmFsdWVQYWlyKG1hcHBlZE5hbWVWYWx1ZVBhaXIsIEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgImFub3RoZXJGaWVsZCIpKTsKLSAgICAgICAgICAgIHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGZpZWxkLCBXZWJTZXJ2aWNlUmVmLmNsYXNzKTsKLSAgICAgICAgICAgIG1hcHBlZE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uLCAibWFwcGVkTmFtZSIpOwotICAgICAgICAgICAgbWFwcGVkTmFtZVZhbHVlID0gIChTdHJpbmdMaXRlcmFsKSBtYXBwZWROYW1lVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1hcHBlZE5hbWVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoImFub3RoZXJGaWVsZCIpKTsKLQotICAgICAgICAgICAgLy9AV2ViTWV0aG9kCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJhZGQiLCBuZXcgU3RyaW5nW10geyAiSSIsICJJIiB9KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCAiV2ViTWV0aG9kIikpOwotICAgICAgICAgICAgQW5ub3RhdGlvbiB3ZWJNZXRob2QgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2QsIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdlYk1ldGhvZCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYk1ldGhvZCBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pOwotCi0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIHdlYk1ldGhvZEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgd2ViTWV0aG9kOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJNZXRob2RBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAxKTsKLQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG9wZXJhdGlvbk5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYk1ldGhvZEFubm90YXRpb24sICJvcGVyYXRpb25OYW1lIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbk5hbWVWYWx1ZVBhaXIpOwotICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBvcGVyYXRpb25OYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIG9wZXJhdGlvbk5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uTmFtZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiYWRkIikpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMudXBkYXRlTWVtYmVyVmFsdWVQYWlyKG9wZXJhdGlvbk5hbWVWYWx1ZVBhaXIsIEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgIm11bHRpcGx5IikpOwotICAgICAgICAgICAgd2ViTWV0aG9kQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2QsIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgICAgICBvcGVyYXRpb25OYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvblV0aWxzLmdldE1lbWJlclZhbHVlUGFpcih3ZWJNZXRob2RBbm5vdGF0aW9uLCAib3BlcmF0aW9uTmFtZSIpOwotICAgICAgICAgICAgb3BlcmF0aW9uTmFtZVZhbHVlID0gIChTdHJpbmdMaXRlcmFsKSBvcGVyYXRpb25OYW1lVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbk5hbWVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoIm11bHRpcGx5IikpOwotCi0gICAgICAgICAgICAvL0BXZWJQYXJhbQotICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgbG9jYWxWYXJpYWJsZSA9IEFubm90YXRpb25VdGlscy5nZXRMb2NhbFZhcmlhYmxlKG1ldGhvZCwgImkiKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobG9jYWxWYXJpYWJsZSwgIldlYlBhcmFtIikpOwotICAgICAgICAgICAgQW5ub3RhdGlvbiB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGxvY2FsVmFyaWFibGUsIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViUGFyYW0pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJQYXJhbSBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pOwotCi0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIHdlYlBhcmFtQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJQYXJhbTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViUGFyYW1Bbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAxKTsKLQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBhcnROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvblV0aWxzLmdldE1lbWJlclZhbHVlUGFpcih3ZWJQYXJhbUFubm90YXRpb24sICJwYXJ0TmFtZSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJ0TmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICBTdHJpbmdMaXRlcmFsIHBhcnROYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIHBhcnROYW1lVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHBhcnROYW1lVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJpIikpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMudXBkYXRlTWVtYmVyVmFsdWVQYWlyKHBhcnROYW1lVmFsdWVQYWlyLCBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsICJpaWkiKSk7Ci0gICAgICAgICAgICB3ZWJQYXJhbUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obG9jYWxWYXJpYWJsZSwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgcGFydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYlBhcmFtQW5ub3RhdGlvbiwgInBhcnROYW1lIik7Ci0gICAgICAgICAgICBwYXJ0TmFtZVZhbHVlID0gIChTdHJpbmdMaXRlcmFsKSBwYXJ0TmFtZVZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0TmFtZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiaWlpIikpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9VcGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1VwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZGExNDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1VwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAQmluZGluZ1R5cGUoXCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvaHR0cFwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvciB7XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCAiQmluZGluZ1R5cGUiKSk7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIGJpbmRpbmdUeXBlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwgQmluZGluZ1R5cGUuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChiaW5kaW5nVHlwZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGJpbmRpbmdUeXBlIGluc3RhbmNlb2YgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgICAgIFNpbmdsZU1lbWJlckFubm90YXRpb24gYmluZGluZ1R5cGVBbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGJpbmRpbmdUeXBlOwotICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBiaW5kaW5nVHlwZVZhbHVlID0gKFN0cmluZ0xpdGVyYWwpIGJpbmRpbmdUeXBlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiaW5kaW5nVHlwZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwL2h0dHAiKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy51cGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGJpbmRpbmdUeXBlQW5ub3RhdGlvbiwgQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIikpOwotICAgICAgICAgICAgYmluZGluZ1R5cGVBbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIEJpbmRpbmdUeXBlLmNsYXNzKTsKLSAgICAgICAgICAgIGJpbmRpbmdUeXBlVmFsdWUgPSAoU3RyaW5nTGl0ZXJhbCkgYmluZGluZ1R5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGJpbmRpbmdUeXBlVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDFhNDMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1MzY3NWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmVkNjIyNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMA0KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMsDQotIG9yZy5qbW9jaywNCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsDQotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aSwNCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwNCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aSwNCi0gb3JnLmVjbGlwc2UudWkuaWRlLA0KLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSwNCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwNCi0gb3JnLmVjbGlwc2UuamR0LnVpLA0KLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUNCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5kb20sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvci5hY3Rpb25zDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI3YWNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BdWd1c3QgMjAsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjODhlZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI0NDMwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUJ1bmRsZS1OYW1lLjA9SkFYLVdTIERPTSBJbnRlZ3JhdGlvbiBUZXN0cw0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvZG9tL0FsbFRlc3RzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvZG9tL0FsbFRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjg3NTAyZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL2RvbS9BbGxUZXN0c1N1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMuZG9tOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3IuRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeVRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLldlYlNlcnZpY2VEZWNvcmF0b3JUZXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0c1N1aXRlDQotew0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLQl7DQotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7DQotDQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeVRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VEZWNvcmF0b3JUZXN0LmNsYXNzKTsNCi0JCQ0KLQkJcmV0dXJuIHN1aXRlOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0ZmMxMWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3QuSUxvYWRpbmdDYW5jZWxlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdC5JTG9hZGluZ0R1bW15OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklTRUlDaGlsZExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVdlYlNlcnZpY2VDaGlsZExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0c1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgCi17Ci0JcHJpdmF0ZSBUZXN0UHJvamVjdCB0ZXN0UHJqMTsgCi0JCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzE7Ci0JCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0OwotCQotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHRhcmdldFJlc291cmNlOwotCXByb3RlY3RlZCBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBhZGFwdGVyRmFjdG9yeTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCUlQcm9qZWN0IGVqYlByb2plY3QgPSBUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVFamIzUHJvamVjdCgiRE9NQ250UHJvdlRlc3RQcm9qZWN0MSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCXRlc3RQcmoxID0gbmV3IFRlc3RQcm9qZWN0KGVqYlByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMSIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTF7XG4iICsKLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2QobmFtZT1cInBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc0luUGFyZW50KCk7XG4iICsKLQkJCQkifSIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkyTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTIgZXh0ZW5kcyBTZWkxIHtcbiIgKwotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChuYW1lPVwidm9pZE1ldGhvZFdpdGhBcmdzXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoQXJncyhAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbTFcIikgamF2YS51dGlsLkxpc3Q8U3RyaW5nPiBwYXJhbTEpO1xuIiArCi0JCQkJIn0iKTsKLQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiV1MxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsKLQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiV1MyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MyTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MyIHt9Iik7Ci0JCQotCQl0YXJnZXRSZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7Ci0JCXRhcmdldFJlc291cmNlLmxvYWQobnVsbCk7Ci0JCQotCQl0aGlzLndzUHJvamVjdCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0UmVzb3VyY2UuZ2V0RE9NKCksIHRlc3RQcmoxLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMud3NQcm9qZWN0KTsKLQkJCi0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKCkgCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXc1Byb2plY3QoZmluYWwgSURPTSBkb20sIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCQlyZXR1cm4gd3NQcm9qZWN0OwotCQkJfQotCQl9OwotCQkKLQkJdGFyZ2V0UmVzb3VyY2Uuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRhcmdldFJlc291cmNlLnN0b3BTeW5jaHJvbml6aW5nKCk7Ci0JCXRlc3RQcmoxLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKCkgCi0JewotCQlhc3NlcnROb3ROdWxsKGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlhc3NlcnRUcnVlKGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXJGYWN0b3J5KCkgaW5zdGFuY2VvZiBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSAKLQl7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKG5ldyBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckZhY3RvcnkoKSBpbnN0YW5jZW9mIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hpbGRyZW5MaXN0c09iamVjdCgpIAotCXsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChjaGlsZHJlbik7Ci0JCWFzc2VydEVxdWFscyhjaGlsZHJlbi5sZW5ndGgsIDEpOwotCQlhc3NlcnRUcnVlKGNoaWxkcmVuWzBdIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KTsKLQkJCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChjaGlsZHJlbik7Ci0JCWFzc2VydEVxdWFscyhjaGlsZHJlbi5sZW5ndGgsIDIpOwotCQlhc3NlcnRUcnVlKGNoaWxkcmVuWzBdIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCk7Ci0JCWFzc2VydFRydWUoY2hpbGRyZW5bMV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCk7Ci0JCQotCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChzRUlzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNFSXMubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShzRUlzWzBdIGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0JCWFzc2VydFRydWUoc0VJc1sxXSBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQlhc3NlcnRUcnVlKHNFSXNbMl0gaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJCi0JCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzFdKTsKLQkJCi0JCWFzc2VydE5vdE51bGwod1NzKTsKLQkJYXNzZXJ0RXF1YWxzKHdTcy5sZW5ndGgsIDIpOwotCQlhc3NlcnRUcnVlKHdTc1swXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKTsKLQkJYXNzZXJ0VHJ1ZSh3U3NbMV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIYXNDaGlsZHJlbk9iamVjdCgpIAotCXsKLQkJLy8gSVdlYlNlcnZpY2VQcm9qZWN0Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsKLQkJCi0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuaGFzQ2hpbGRyZW4oY2hpbGRyZW5bMF0pKTsKLQkJCi0JCS8vIElTRUlDaGlsZExpc3QgJiBJV2ViU2VydmljZUNoaWxkTGlzdAotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsKLQkJCi0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuaGFzQ2hpbGRyZW4oY2hpbGRyZW5bMF0pKTsKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihjaGlsZHJlblsxXSkpOwotCQkKLQkJLy8gbnVsbCBwYXJhbWV0ZXIKLQkJYXNzZXJ0RmFsc2UoYWRhcHRlckZhY3RvcnkuaGFzQ2hpbGRyZW4obnVsbCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW5JV2ViU2VydmljZSgpCi0JewotCQlJV2ViU2VydmljZSB3cyA9IGZpbmRXcygib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLldTMSIpOwotCQlhc3NlcnROb3ROdWxsKHdzKTsKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbih3cykpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4od3MpLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4od3MpWzBdIGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0JCQotCQkvLyBjaGVjayBpZiBhZGFwdGVkIG9ubHkgb25jZQotCQlET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBvdGhlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKTsKLQkJb3RoZXJGYWN0b3J5LmdldENoaWxkcmVuKHdzKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHdzLmVBZGFwdGVycygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotCXsKLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBmaW5kU2VpKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMiIpOwotCQlhc3NlcnROb3ROdWxsKHNlaSk7Ci0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuaGFzQ2hpbGRyZW4oc2VpKSk7Ci0JCWFzc2VydEVxdWFscygyLCBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihzZWkpLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oc2VpKVswXSBpbnN0YW5jZW9mIElXZWJNZXRob2QpOwotCQlET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBvdGhlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKTsKLQkJb3RoZXJGYWN0b3J5LmdldENoaWxkcmVuKHNlaSk7Ci0JCWFzc2VydEVxdWFscygyLCBzZWkuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsKLQkJCi0JCUlXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuV1MyIik7Ci0JCWFzc2VydE5vdE51bGwod3MpOwotCQlhc3NlcnRGYWxzZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbih3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4od3MuZ2V0U2VydmljZUVuZHBvaW50KCkpLmxlbmd0aCk7Ci0JCS8vIGNoZWNrIGlmIGFkYXB0ZWQgb25seSBvbmNlCi0JCW90aGVyRmFjdG9yeS5nZXRDaGlsZHJlbih3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5lQWRhcHRlcnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW5XZWJNZXRob2QoKQotCXsKLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBmaW5kU2VpKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMiIpOwotCQlhc3NlcnROb3ROdWxsKHNlaSk7Ci0JCQotCQlJV2ViTWV0aG9kIG1ldGhvZCA9IGZpbmRNZXRob2Qoc2VpLCAidm9pZE1ldGhvZFdpdGhBcmdzIik7Ci0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsJCi0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuaGFzQ2hpbGRyZW4obWV0aG9kKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihtZXRob2QpLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4obWV0aG9kKVswXSBpbnN0YW5jZW9mIElXZWJQYXJhbSk7Ci0JCQotCQkgbWV0aG9kID0gZmluZE1ldGhvZChzZWksICJ2b2lkTWV0aG9kV2l0aE5vQXJnc0luUGFyZW50Iik7Ci0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJYXNzZXJ0RmFsc2UoYWRhcHRlckZhY3RvcnkuaGFzQ2hpbGRyZW4obWV0aG9kKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihtZXRob2QpLmxlbmd0aCk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENoaWxkcmVuV2ViUGFyYW0oKQotCXsKLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBmaW5kU2VpKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMiIpOwotCQlhc3NlcnROb3ROdWxsKHNlaSk7Ci0JCQotCQlJV2ViTWV0aG9kIG1ldGhvZCA9IGZpbmRNZXRob2Qoc2VpLCAidm9pZE1ldGhvZFdpdGhBcmdzIik7Ci0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJYXNzZXJ0RmFsc2UoYWRhcHRlckZhY3RvcnkuaGFzQ2hpbGRyZW4obWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApKS5sZW5ndGgpOwotCX0KLQkKLQkKLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZmluZFNlaShmaW5hbCBTdHJpbmcgaW1wbE5hbWUpCi0JewotCQlmb3IoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgOiB3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpKSAKLQkJewotCQkJaWYoc2VpLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxOYW1lKSkgewotCQkJCXJldHVybiBzZWk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JcHJpdmF0ZSBJV2ViU2VydmljZSBmaW5kV3MoZmluYWwgU3RyaW5nIGltcGxOYW1lKQotCXsKLQkJZm9yKElXZWJTZXJ2aWNlIHdzIDogd3NQcm9qZWN0LmdldFdlYlNlcnZpY2VzKCkpIAotCQl7Ci0JCQlpZih3cy5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsTmFtZSkpIHsKLQkJCQlyZXR1cm4gd3M7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIGZpbmRNZXRob2QoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lKSAKLQl7Ci0JCWZvcihJV2ViTWV0aG9kIG1ldGhvZCA6IHNlaS5nZXRXZWJNZXRob2RzKCkpIAotCQl7Ci0JCQlpZihtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSkgewotCQkJCXJldHVybiBtZXRob2Q7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnlDaGFuZ2VkKCkKLS8vCXsKLS8vCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7Ci0vLwkJCi0vLwkJdHJ5Ci0vLwkJewotLy8JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkzTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTMge30iKTsKLS8vCQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiV1MzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MzTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkzXCIpIHB1YmxpYyBjbGFzcyBXUzMge30iKTsKLS8vCQl9Ci0vLwkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpCi0vLwkJewotLy8JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0vLwkJfQotLy8JCQotLy8JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotLy8JCQotLy8JCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKHNFSXMubGVuZ3RoLCAzKTsKLS8vCQkKLS8vCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblsxXSk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKHdTcy5sZW5ndGgsIDMpOwotLy8JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXU1Byb2plY3QoKQotCXsKLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKTsKLQkJCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChjaGlsZHJlbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXc1Byb2plY3REb21Ob3RMb2FkZWQoKQotCXsKLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgZ2V0V3NQcm9qZWN0KGZpbmFsIElET00gZG9tLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkcmVuLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBJTG9hZGluZ1dzUHJvamVjdCk7Ci0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRyZW4ubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlblswXSBpbnN0YW5jZW9mIElMb2FkaW5nRHVtbXkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V3NQcm9qZWN0Q2hpbGRzRG9tTG9hZE5vdENhbmNlbGVkKCkKLQl7Ci0JCUlMb2FkaW5nV3NQcm9qZWN0IGxvYWRpbmdQcm9qZWN0ID0gbmV3IElMb2FkaW5nV3NQcm9qZWN0KCkgewotCQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7IHJldHVybiBudWxsOyB9Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDYW5jZWxlZCgpIHtyZXR1cm4gZmFsc2U7fQotCQl9OwotCQkJCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4obG9hZGluZ1Byb2plY3QpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRyZW4ubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlblswXSBpbnN0YW5jZW9mIElMb2FkaW5nRHVtbXkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXc1Byb2plY3RDaGlsZHNEb21Mb2FkQ2FuY2VsZWQoKQotCXsKLQkJSUxvYWRpbmdXc1Byb2plY3QgbG9hZGluZ1Byb2plY3QgPSBuZXcgSUxvYWRpbmdXc1Byb2plY3QoKSB7Ci0JCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsgcmV0dXJuIG51bGw7IH0KLQkJCXB1YmxpYyBib29sZWFuIGlzTG9hZENhbmNlbGVkKCkge3JldHVybiB0cnVlO30KLQkJfTsKLQkJCQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGxvYWRpbmdQcm9qZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkcmVuLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBJTG9hZGluZ0NhbmNlbGVkKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3VwcG9ydGluZ1J1bnRpbWUoKQotCXsKLQkJRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJNeSBwcm92aWRlciA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlck15KCk7Ci0JCUlXc0RPTVJ1bnRpbWVFeHRlbnNpb24gcnVudGltZSA9IHByb3ZpZGVyLmdldFN1cHBvcnRpbmdSdW50aW1lKHRlc3RQcmoxLmdldFByb2plY3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocnVudGltZSk7Ci0JfQotCQotCXByb3RlY3RlZCBjbGFzcyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlck15IGV4dGVuZHMgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBnZXRTdXBwb3J0aW5nUnVudGltZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0U3VwcG9ydGluZ1J1bnRpbWUocHJvamVjdCk7Ci0JCX0KLQl9OwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZDQxYzIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3RzVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgCi17Ci0JcHJpdmF0ZSBUZXN0UHJvamVjdCB0ZXN0UHJqMTsgCi0JCi0JcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2U7Ci0JcHJvdGVjdGVkIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5OwotCXByb3RlY3RlZCBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQkKLQlwcml2YXRlIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3Q7Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIAotCXsKLQkJSVByb2plY3QgZWpiUHJvamVjdCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZUVqYjNQcm9qZWN0KCJET01MYmxQcm92VGVzdFByb2plY3QxIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJdGVzdFByajEgPSBuZXcgVGVzdFByb2plY3QoZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzEgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEiKTsKLQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiU2VpMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkxe1xuIiArCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG5hbWU9XCJwYXJlbnRNZXRob2RcIikgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NJblBhcmVudCgpO1xuIiArCi0JCQkJIn0iKTsKLQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiU2VpMi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMk5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkyIGV4dGVuZHMgU2VpMSB7XG4iICsKLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2QobmFtZT1cIndlYk1ldGhvZFwiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc05vdEluUGFyZW50KCk7XG4iICsKLQkJCQkifSIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTJcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzIuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzJOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTJcIikgcHVibGljIGNsYXNzIFdTMiB7fSIpOwotCQkKLQkJdGFyZ2V0UmVzb3VyY2UgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSkpOwotCQl0YXJnZXRSZXNvdXJjZS5sb2FkKG51bGwpOwotCQl0aGlzLndzUHJvamVjdCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0UmVzb3VyY2UuZ2V0RE9NKCksIHRlc3RQcmoxLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMud3NQcm9qZWN0KTsKLQkJCi0JCQotCQlsYWJlbFByb3ZpZGVyID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigpOwotCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpIAotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgZ2V0V3NQcm9qZWN0KGZpbmFsIElET00gZG9tLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIHdzUHJvamVjdDsKLQkJCX0JCQkKLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW1hZ2VPYmplY3QoKSAKLQl7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRJbWFnZShjaGlsZHJlblswXSkpOwotCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKGNoaWxkcmVuWzBdKSk7Ci0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRJbWFnZShjaGlsZHJlblsxXSkpOwotCQkKLQkJT2JqZWN0W10gc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRJbWFnZShzRUlzWzBdKSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UobnVsbCksIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uoc0VJc1swXSkpOwotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldEltYWdlKHNFSXNbMF0pKTsKLQkJCi0JCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzFdKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRJbWFnZSh3U3NbMF0pKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRJbWFnZShudWxsKSwgbGFiZWxQcm92aWRlci5nZXRJbWFnZSh3U3NbMF0pKTsKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldEltYWdlKHRlc3RQcmoxKSwgbGFiZWxQcm92aWRlci5nZXRJbWFnZSh3U3NbMF0pKTsKLQkJCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihzRUlzWzBdKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRJbWFnZSh3ZWJNZXRob2RzWzBdKSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UobnVsbCksIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uod2ViTWV0aG9kc1swXSkpOwotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdlYk1ldGhvZHNbMF0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGV4dE9iamVjdCgpIAotCXsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldFRleHQoY2hpbGRyZW5bMF0pKTsKLQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRUZXh0KGNoaWxkcmVuWzBdKSk7Ci0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRUZXh0KGNoaWxkcmVuWzFdKSk7Ci0JCQotCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldFRleHQoc0VJc1swXSkpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldFRleHQobnVsbCksIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChzRUlzWzBdKSk7Ci0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRUZXh0KHRlc3RQcmoxKSwgbGFiZWxQcm92aWRlci5nZXRUZXh0KHNFSXNbMF0pKTsKLQkJCi0JCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzFdKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRUZXh0KHdTc1swXSkpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldFRleHQobnVsbCksIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh3U3NbMF0pKTsKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldFRleHQodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldFRleHQod1NzWzBdKSk7Ci0JCQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oc0VJc1swXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh3ZWJNZXRob2RzWzBdKSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChudWxsKSwgbGFiZWxQcm92aWRlci5nZXRUZXh0KHdlYk1ldGhvZHNbMF0pKTsKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldFRleHQodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldFRleHQod2ViTWV0aG9kc1swXSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVzY3JpcHRpb24oKQotCXsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKGNoaWxkcmVuWzBdKSk7Ci0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oY2hpbGRyZW5bMF0pKTsKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKGNoaWxkcmVuWzFdKSk7Ci0JCQotCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHNFSXNbMF0pKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihudWxsKSwgbGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihzRUlzWzBdKSk7Ci0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbih0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oc0VJc1swXSkpOwotCQkKLQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMV0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHdTc1swXSkpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHdTc1swXSkpOwotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24odGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHdTc1swXSkpOwotCQkKLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHNFSXNbMF0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHdlYk1ldGhvZHNbMF0pKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihudWxsKSwgbGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbih3ZWJNZXRob2RzWzBdKSk7Ci0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbih0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od2ViTWV0aG9kc1swXSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL0RPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3ZjkxMTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWRhcHRlcigpIA0KLQl7DQotCQlET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSBwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5KCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwocHJvcGVydHlBZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKHByb3BlcnR5QWRhcHRlckZhY3RvcnksIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLmNsYXNzKSk7DQotCQlhc3NlcnROdWxsKHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LCBJV2ViU2VydmljZS5jbGFzcykpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIocHJvcGVydHlBZGFwdGVyRmFjdG9yeSwgSVByb3BlcnR5U291cmNlUHJvdmlkZXIuY2xhc3MpIGluc3RhbmNlb2YgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIocHJvcGVydHlBZGFwdGVyRmFjdG9yeSwgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkuY2xhc3MpIGluc3RhbmNlb2YgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBZGFwdGVyTGlzdCgpIA0KLQl7DQotCQlET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSBwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5KCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwocHJvcGVydHlBZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyTGlzdCgpKTsNCi0JCWFzc2VydEVxdWFscyhwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXJMaXN0KCkubGVuZ3RoLCAxKTsNCi0JCWFzc2VydEVxdWFscyhwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXJMaXN0KClbMF0sIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldEFkYXB0ZXJVc2VzU2FtZUZhY3RvcnkoKQ0KLQl7DQotCQlET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSBwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5KCk7DQotCQlPYmplY3QgYWRhcHRlcjEgPSBwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIocHJvcGVydHlBZGFwdGVyRmFjdG9yeSwgSVByb3BlcnR5U291cmNlUHJvdmlkZXIuY2xhc3MpOw0KLQkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyMSk7DQotCQlPYmplY3QgYWRhcHRlcjIgPSBwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIocHJvcGVydHlBZGFwdGVyRmFjdG9yeSwgSVByb3BlcnR5U291cmNlUHJvdmlkZXIuY2xhc3MpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyMT09YWRhcHRlcjIpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL1dlYlNlcnZpY2VEZWNvcmF0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9XZWJTZXJ2aWNlRGVjb3JhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTM3MWJlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL1dlYlNlcnZpY2VEZWNvcmF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUuaW50ZXJuYWwuQXB0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklXZWJTZXJ2aWNlQ2hpbGRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLldlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLklXYWl0Q29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucy5Bc3NlcnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucy5Db25kaXRpb25DaGVja0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdHNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgV2ViU2VydmljZURlY29yYXRvcn0gY2xhc3MKLSAqIAotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VEZWNvcmF0b3JUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlCi17Ci0gICAgcHJpdmF0ZSBNeVdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciBkZWNvcmF0b3I7Ci0gICAgcHJpdmF0ZSBUZXN0UHJvamVjdCB0ZXN0UHJvamVjdDsKLQotICAgIHByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7Ci0gICAgcHJpdmF0ZSBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTsKLSAgICBwcml2YXRlIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3Q7Ci0gICAgcHJpdmF0ZSBJV2ViTWV0aG9kIHdlYk1ldGhvZDsKLSAgICBwcml2YXRlIElXZWJQYXJhbSB3ZWJQYXJhbTsKLSAgICBwcml2YXRlIE1vY2s8SVdlYlNlcnZpY2VDaGlsZExpc3Q+IHdzQ2hpbGRMaXN0OwotICAgIHByaXZhdGUgTW9jazxJU0VJQ2hpbGRMaXN0PiBzZWlDaGlsZExpc3Q7Ci0gICAgcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IHRlc3RQYWNrYWdlOwotCi0gICAgcHJpdmF0ZSBJVHlwZSBzZWlUeXBlOwotICAgIHByaXZhdGUgSVR5cGUgd3NJbXBsVHlwZTsKLQotICAgIHByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBqYXh3c1Jlc291cmNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX0VSUk9SID0gMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUlfQ09OVEVOVCA9ICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cInswfVwiKVxuIiArICJwdWJsaWMgaW50ZXJmYWNlIElTZWkgJ3snXG4iICsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ7MX1cIilcbiIKLSAgICArICJwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInsyfVwiKSBTdHJpbmcgcyk7fSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExfQ09OVEVOVCA9ICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJ7MH1cIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJ0ZXN0LklTZWlcIilcbiIgKyAicHVibGljIGNsYXNzIEVuZHBvaW50Q2xhc3MgJ3snXG4iCi0gICAgKyAicHVibGljIHZvaWQgdGVzdE1ldGhvZChTdHJpbmcgcykneyd9fSI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkZWNvcmF0b3IgPSBuZXcgTXlXZWJTZXJ2aWNlUHJvYmxlbXNEZWNvcmF0b3IoKTsKLSAgICAgICAgdGVzdFByb2plY3QgPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKHRlc3RQcm9qZWN0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlc3RQcm9qZWN0LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGpheHdzUmVzb3VyY2Uuc3RvcFN5bmNocm9uaXppbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wdXRlQWRvcm5tZW50Rm9yT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhuZXcgT2JqZWN0KCkpKTsKLSAgICB9Ci0gICAgLy8gRklYTUUgMzA3MTI0Ci0gICAgLy8gICAgcHVibGljIHZvaWQgdGVzdENvbXB1dGVBZG9ybm1lbnROb1ZhbGlkYXRpb25FcnJvcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgLy8gICAgewotICAgIC8vICAgICAgICBjcmVhdGVXc0NvbnRlbnQoIk15UG9ydCIsICJteU1ldGhvZCIsICJteVBhcmFtIiwgIk15U2VydmljZSIpOwotICAgIC8vICAgICAgICBpbml0V3NEb21PYmplY3RzKCk7Ci0gICAgLy8gICAgICAgIGNoZWNrTm9FcnJvcnNBZG9ybm1lbnQoKTsKLSAgICAvLyAgICB9Ci0KLSAgICAvLyBGSVhNRSBCdWcgMzA1MDc3Ci0gICAgLy8JcHVibGljIHZvaWQgdGVzdENvbXB1dGVBZG9ybm1lbnRGb3JTZWlFcnJvcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAvLwl7Ci0gICAgLy8JCWNyZWF0ZVdzQ29udGVudCgiIiwgIm15TWV0aG9kIiwgIm15UGFyYW0iLCAiTXlTZXJ2aWNlIik7Ci0gICAgLy8JCXdhaXRGb3JBcHRNYXJrZXJzQXBwZWFyKCk7Ci0gICAgLy8JCWluaXRXc0RvbU9iamVjdHMoKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdzQ2hpbGRMaXN0LnByb3h5KCkpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHNlaUNoaWxkTGlzdC5wcm94eSgpKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3cykpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Moc2VpKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3ZWJNZXRob2QpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdlYlBhcmFtKSk7Ci0gICAgLy8KLSAgICAvLwkJZml4QXB0RXJyb3JzKCk7Ci0gICAgLy8JCWNoZWNrTm9FcnJvcnNBZG9ybm1lbnQoKTsKLSAgICAvLwl9Ci0KLSAgICAvLyBGSVhNRSBCdWcgMzA1MDc3Ci0gICAgLy8JcHVibGljIHZvaWQgdGVzdENvbXB1dGVBZG9ybm1lbnRGb3JXZWJNZXRob2RFcnJvcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAvLwl7Ci0gICAgLy8JCWNyZWF0ZVdzQ29udGVudCgiTXlQb3J0IiwgIiIsICJteVBhcmFtIiwgIk15U2VydmljZSIpOwotICAgIC8vCQl3YWl0Rm9yQXB0TWFya2Vyc0FwcGVhcigpOwotICAgIC8vCQlpbml0V3NEb21PYmplY3RzKCk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3c0NoaWxkTGlzdC5wcm94eSgpKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhzZWlDaGlsZExpc3QucHJveHkoKSkpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod3MpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHNlaSkpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod2ViTWV0aG9kKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3ZWJQYXJhbSkpOwotICAgIC8vCi0gICAgLy8JCWZpeEFwdEVycm9ycygpOwotICAgIC8vCQljaGVja05vRXJyb3JzQWRvcm5tZW50KCk7Ci0gICAgLy8JfQotCi0gICAgLy9GSVhNRSAgQnVnIDMwNTA3NwotICAgIC8vCXB1YmxpYyB2b2lkIHRlc3RDb21wdXRlQWRvcm5tZW50Rm9yV2ViUGFyYW1FcnJvcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAvLwl7Ci0gICAgLy8JCWNyZWF0ZVdzQ29udGVudCgiTXlQb3J0IiwgIk15TWV0aG9kIiwgIiIsICJNeVNlcnZpY2UiKTsKLSAgICAvLwkJd2FpdEZvckFwdE1hcmtlcnNBcHBlYXIoKTsKLSAgICAvLwkJaW5pdFdzRG9tT2JqZWN0cygpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod3NDaGlsZExpc3QucHJveHkoKSkpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Moc2VpQ2hpbGRMaXN0LnByb3h5KCkpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdzKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhzZWkpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdlYk1ldGhvZCkpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod2ViUGFyYW0pKTsKLSAgICAvLwotICAgIC8vCQlmaXhBcHRFcnJvcnMoKTsKLSAgICAvLwkJY2hlY2tOb0Vycm9yc0Fkb3JubWVudCgpOwotICAgIC8vCX0KLQotICAgIC8vIEZJWE1FIEJ1ZyAzMDUwNzcKLSAgICAvLwlwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZUFkb3JubWVudEZvcldzSW1wbEVycm9yKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIC8vCXsKLSAgICAvLwkJY3JlYXRlV3NDb250ZW50KCJNeVBvcnQiLCAiTXlNZXRob2QiLCAibXlQYXJhbSIsICIiKTsKLSAgICAvLwkJd2FpdEZvckFwdE1hcmtlcnNBcHBlYXIoKTsKLSAgICAvLwkJaW5pdFdzRG9tT2JqZWN0cygpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod3NDaGlsZExpc3QucHJveHkoKSkpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Moc2VpQ2hpbGRMaXN0LnByb3h5KCkpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdzKSk7Ci0gICAgLy8JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhzZWkpKTsKLSAgICAvLwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdlYk1ldGhvZCkpOwotICAgIC8vCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod2ViUGFyYW0pKTsKLSAgICAvLwotICAgIC8vCQlmaXhBcHRFcnJvcnMoKTsKLSAgICAvLwkJY2hlY2tOb0Vycm9yc0Fkb3JubWVudCgpOwotICAgIC8vCX0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXc0NvbnRlbnQoZmluYWwgU3RyaW5nIHNlaU5hbWUsIGZpbmFsIFN0cmluZyB3ZWJNZXRob2ROYW1lLCBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lLCBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIElQcm9qZWN0IHdlYlAgPSBUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVXZWIyNVByb2plY3QoIldlYlRlc3RlciIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgIHRlc3RQcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KHdlYlApOwotICAgICAgICB0ZXN0UHJvamVjdC5zZXRBcHRQcm9jZXNzaW5nRW5hYmxlZCh0cnVlLCBmYWxzZSk7Ci0KLSAgICAgICAgamF4d3NSZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7Ci0gICAgICAgIGpheHdzUmVzb3VyY2UubG9hZChudWxsKTsKLSAgICAgICAgamF4d3NSZXNvdXJjZS5zdGFydFN5bmNocm9uaXppbmcoKTsKLQotICAgICAgICB0ZXN0UGFja2FnZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVBhY2thZ2UoInRlc3QiKTsKLSAgICAgICAgc2VpVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUodGVzdFBhY2thZ2UsICJJU2VpLmphdmEiLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChTRUlfQ09OVEVOVCwgc2VpTmFtZSwgd2ViTWV0aG9kTmFtZSwgcGFyYW1OYW1lKSk7Ci0gICAgICAgIHdzSW1wbFR5cGUgPSB0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHRlc3RQYWNrYWdlLCAiRW5kcG9pbnRDbGFzcy5qYXZhIiwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSU1QTF9DT05URU5ULCBzZXJ2aWNlTmFtZSkpOwotICAgICAgICB0ZXN0UHJvamVjdC5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxEKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFdzRG9tT2JqZWN0cygpIHRocm93cyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhpcy53c1Byb2plY3QgPSBEb21VdGlsLklOU1RBTkNFLmZpbmRQcm9qZWN0QnlOYW1lKGpheHdzUmVzb3VyY2UuZ2V0RE9NKCksIHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRoaXMud3NQcm9qZWN0KTsKLQotICAgICAgICB3cyA9IHdzUHJvamVjdC5nZXRXZWJTZXJ2aWNlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBzZWkgPSB3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICB3ZWJNZXRob2QgPSBzZWkuZ2V0V2ViTWV0aG9kcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICB3ZWJQYXJhbSA9IHdlYk1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgd3NDaGlsZExpc3QgPSBtb2NrKElXZWJTZXJ2aWNlQ2hpbGRMaXN0LmNsYXNzKTsKLSAgICAgICAgd3NDaGlsZExpc3Quc3R1YnMoKS5tZXRob2QoImdldFdTQ2hpbGRMaXN0Iikud2lsbChyZXR1cm5WYWx1ZShlbGlzdCh3cykpKTsKLSAgICAgICAgc2VpQ2hpbGRMaXN0ID0gbW9jayhJU0VJQ2hpbGRMaXN0LmNsYXNzKTsKLSAgICAgICAgc2VpQ2hpbGRMaXN0LnN0dWJzKCkubWV0aG9kKCJnZXRTRUlDaGlsZExpc3QiKS53aWxsKHJldHVyblZhbHVlKGVsaXN0KHNlaSkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd2FpdEZvckFwdE1hcmtlcnNBcHBlYXIoKQotICAgIHsKLSAgICAgICAgQXNzZXJ0aW9ucy53YWl0QXNzZXJ0KG5ldyBJV2FpdENvbmRpdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNoZWNrQ29uZGl0aW9uKCkgdGhyb3dzIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluZEFwdE1hcmtlcnMoKS5zaXplKCkgPiAwOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sICJBUFQgbWFya2VycyBkaWQgbm90IGFwcGVhciIpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29sbGVjdGlvbjxJTWFya2VyPiBmaW5kQXB0TWFya2VycygpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPElNYXJrZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8SU1hcmtlcj4oKTsKLSAgICAgICAgZm9yKGZpbmFsIElNYXJrZXIgbSA6IHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5maW5kTWFya2VycyhBcHRQbHVnaW4uQVBUX0NPTVBJTEFUSU9OX1BST0JMRU1fTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFkZChtKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihmaW5hbCBJTWFya2VyIG0gOiB0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZmluZE1hcmtlcnMoQXB0UGx1Z2luLkFQVF9OT05SRUNPTkNJTEVfQ09NUElMQVRJT05fUFJPQkxFTV9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKG0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd2FpdEZvck5vQXB0TWFya2VycygpCi0gICAgewotICAgICAgICBBc3NlcnRpb25zLndhaXRBc3NlcnQobmV3IElXYWl0Q29uZGl0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY2hlY2tDb25kaXRpb24oKSB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZmluZE1hcmtlcnMoQXB0UGx1Z2luLkFQVF9OT05SRUNPTkNJTEVfQ09NUElMQVRJT05fUFJPQkxFTV9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpLmxlbmd0aCA9PSAwOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sICJBUFQgbWFya2VycyBkaWQgbm90IGRpc2FwcGVhciIpOwotICAgIH0KLQotICAgIHByaXZhdGUgRUxpc3Q8RU9iamVjdD4gZWxpc3QoZmluYWwgRU9iamVjdC4uLiBlbGVtZW50cykKLSAgICB7Ci0gICAgICAgIGZpbmFsIEVMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBCYXNpY0VMaXN0PEVPYmplY3Q+KCk7Ci0gICAgICAgIGZvciAoRU9iamVjdCBlT2JqIDogZWxlbWVudHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQoZU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaXhBcHRFcnJvcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQW5ub3RhdGlvbldyaXRlciBhbm5Xcml0ZXIgPSBBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCk7Ci0KLSAgICAgICAgZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3Igc2VpSW5zcGVjdG9yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihzZWlUeXBlKTsKLSAgICAgICAgZmluYWwgSUFubm90YXRpb248SVR5cGU+IHNlaVdzQW5ub3RhdGlvbiA9IHNlaUluc3BlY3Rvci5pbnNwZWN0VHlwZSgiamF2YXguandzLldlYlNlcnZpY2UiKTsKLSAgICAgICAgc2VpV3NBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLmNsZWFyKCk7Ci0gICAgICAgIGFubldyaXRlci51cGRhdGUoc2VpV3NBbm5vdGF0aW9uKTsKLQotICAgICAgICBmaW5hbCBJTWV0aG9kIHNlaU1ldGhvZCA9IHNlaVR5cGUuZ2V0TWV0aG9kcygpWzBdOwotICAgICAgICBmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiBzZWlXZWJNZXRob2RBbm5vdGF0aW9uID0gc2VpSW5zcGVjdG9yLmluc3BlY3RNZXRob2Qoc2VpTWV0aG9kLCAiamF2YXguandzLldlYk1ldGhvZCIpOwotICAgICAgICBhbm5Xcml0ZXIucmVtb3ZlKHNlaVdlYk1ldGhvZEFubm90YXRpb24pOwotCi0gICAgICAgIGZpbmFsIElUeXBlUGFyYW1ldGVyIHNlaU1ldGhvZFBhcmFtID0gc2VpTWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIoc2VpTWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKClbMF0pOwotICAgICAgICBmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gc2VpV2ViUGFyYW1Bbm5vdGF0aW9uID0gc2VpSW5zcGVjdG9yLmluc3BlY3RQYXJhbShzZWlNZXRob2RQYXJhbSwgImphdmF4Lmp3cy5XZWJQYXJhbSIpOwotICAgICAgICBhbm5Xcml0ZXIucmVtb3ZlKHNlaVdlYlBhcmFtQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3Igd3NJbXBsSW5zcGVjdG9yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3Rvcih3c0ltcGxUeXBlKTsKLSAgICAgICAgZmluYWwgSUFubm90YXRpb248SVR5cGU+IHdzSW1wbFdzQW5ub3RhdGlvbiA9IHdzSW1wbEluc3BlY3Rvci5pbnNwZWN0VHlwZSgiamF2YXguandzLldlYlNlcnZpY2UiKTsKLSAgICAgICAgZmluYWwgU2V0PElQYXJhbVZhbHVlUGFpcj4gbmV3QW5uVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOwotICAgICAgICBmb3IgKElQYXJhbVZhbHVlUGFpciBwYWlyIDogd3NJbXBsV3NBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocGFpci5nZXRQYXJhbSgpLmVxdWFscygic2VydmljZU5hbWUiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdBbm5WYWx1ZXMuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInNlcnZpY2VOYW1lIiwgQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIk15U2VydmljZU5hbWUiKSkpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3QW5uVmFsdWVzLmFkZChwYWlyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3c0ltcGxXc0Fubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuY2xlYXIoKTsKLSAgICAgICAgd3NJbXBsV3NBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLmFkZEFsbChuZXdBbm5WYWx1ZXMpOwotICAgICAgICBhbm5Xcml0ZXIudXBkYXRlKHdzSW1wbFdzQW5ub3RhdGlvbik7Ci0gICAgICAgIHdhaXRGb3JOb0FwdE1hcmtlcnMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tOb0Vycm9yc0Fkb3JubWVudCgpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod3NDaGlsZExpc3QucHJveHkoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Moc2VpQ2hpbGRMaXN0LnByb3h5KCkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdzKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhzZWkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdlYk1ldGhvZCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod2ViUGFyYW0pKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE15V2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yIGV4dGVuZHMgV2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yCi0gICAgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBjb21wdXRlQWRvcm5tZW50RmxhZ3MoT2JqZWN0IG9iaikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhvYmopOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvYWN0aW9ucy9XU0FjdGlvbkFic3RyYWN0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvYWN0aW9ucy9XU0FjdGlvbkFic3RyYWN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTg0NWM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25BYnN0cmFjdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLmFjdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JV2ViU2VydmljZUNoaWxkTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucy5XU0FjdGlvblByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0c1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5OYXZpZ2F0b3JDb250ZW50U2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLmV4dGVuc2lvbnMuQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25WaWV3ZXJTaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuTmF2aWdhdG9yQ29udGVudFNlcnZpY2VGYWN0b3J5Ow0KLQ0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpDQotcHVibGljIGNsYXNzIFdTQWN0aW9uQWJzdHJhY3RUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIA0KLXsNCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXN0UHJvamVjdCB0ZXN0UHJqMTsgDQotCXByb3RlY3RlZCBzdGF0aWMgVGVzdFByb2plY3QgdGVzdFByajI7IA0KLQlwcm90ZWN0ZWQgc3RhdGljIFRlc3RQcm9qZWN0IHRlc3RQcmozOw0KLQlwcm90ZWN0ZWQgc3RhdGljIFRlc3RQcm9qZWN0IHRlc3RQcmo0Ow0KLQkNCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0MTsNCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0MjsNCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0MzsNCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0NDsNCi0JDQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzE7DQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzI7DQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzM7DQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzQ7DQotCQ0KLQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXRSZXNvdXJjZTsNCi0JcHJvdGVjdGVkIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5Ow0KLQkNCi0JcHJvdGVjdGVkIFdTQWN0aW9uUHJvdmlkZXIgd3NBY3Rpb25Qcm92ID0gbnVsbDsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJaWYodGVzdFByajE9PW51bGwpDQotCQl7DQotCQkJSVByb2plY3QgZWpiUHJvamVjdCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZUVqYjNQcm9qZWN0KCJET01XU0FjdGlvblRlc3RQcm9qZWN0MSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQkJdGVzdFByajEgPSBuZXcgVGVzdFByb2plY3QoZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQkJbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMSIpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMXtcbiIgKw0KLQkJCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJwYXJlbnRNZXRob2RcIikgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NJblBhcmVudCgpO1xuIiArDQotCQkJCQkifSIpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTIuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTJOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMiBleHRlbmRzIFNlaTEge1xuIiArDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIndlYk1ldGhvZFwiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc05vdEluUGFyZW50KCk7XG4iICsNCi0JCQkJCSJ9Iik7DQotCQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiV1MxLmphdmEiLCAiQGphdmF4LmVqYi5TdGF0ZWxlc3NcbiIgKyAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsNCi0JCQkNCi0JCX0NCi0JCQ0KLQkJaWYodGVzdFByajI9PW51bGwpDQotCQl7DQotCQkJSVByb2plY3Qgd2ViUHJvamVjdCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZVdlYjI1UHJvamVjdCgiRE9NV1NBY3Rpb25UZXN0UHJvamVjdDIiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkJCXRlc3RQcmoyID0gbmV3IFRlc3RQcm9qZWN0KHdlYlByb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCQl0ZXN0UHJqMi5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJCW1vZGVsU3luYzIgPSB0ZXN0UHJqMi5jcmVhdGVQYWNrYWdlKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzIiKTsNCi0JCQl0ZXN0UHJqMi5jcmVhdGVUeXBlKG1vZGVsU3luYzIsICJTZWkxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTF7XG4iICsNCi0JCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwicGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzSW5QYXJlbnQoKTtcbiIgKw0KLQkJCQkJIn0iKTsNCi0JCQl0ZXN0UHJqMi5jcmVhdGVUeXBlKG1vZGVsU3luYzIsICJTZWkyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkyTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTIgZXh0ZW5kcyBTZWkxIHtcbiIgKw0KLQkJCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJNZXRob2RcIikgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NOb3RJblBhcmVudCgpO1xuIiArDQotCQkJCQkifSIpOw0KLQkJCXRlc3RQcmoyLmNyZWF0ZVR5cGUobW9kZWxTeW5jMiwgIldTMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMlwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7DQotCQl9DQotCQkNCi0JCWlmKHRlc3RQcmozPT1udWxsKQ0KLQkJew0KLQkJCUlQcm9qZWN0IGVqYlByb2plY3QgPSBUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVFamIzUHJvamVjdCgiRE9NV1NBY3Rpb25UZXN0UHJvamVjdDMiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkJCXRlc3RQcmozID0gbmV3IFRlc3RQcm9qZWN0KGVqYlByb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCQl0ZXN0UHJqMy5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJCW1vZGVsU3luYzMgPSB0ZXN0UHJqMy5jcmVhdGVQYWNrYWdlKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzMiKTsNCi0JCQl0ZXN0UHJqMy5jcmVhdGVUeXBlKG1vZGVsU3luYzMsDQotCQkJCQkiV1MxLmphdmEiLA0KLQkJCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXRTZWkxTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MxIHtcbiINCi0JCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJzdXBlclBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCBzdXBlclBhcmVudE1ldGhvZCgpIHt9XG4iDQotCQkJCQkrICJ9Iik7DQotCQkJDQotCQkJdGVzdFByajMuY3JlYXRlVHlwZShtb2RlbFN5bmMzLA0KLQkJCQkJIldTMi5qYXZhIiwNCi0JCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIkltcGxpY2l0U2VpMk5hbWVcIikgcHVibGljIGNsYXNzIFdTMiBleHRlbmRzIFdTMSB7XG4iDQotCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwicGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHBhcmVudE1ldGhvZCgpIHt9XG4iDQotCQkJCQkrICJ9Iik7DQotCQkJDQotCQkJdGVzdFByajMuY3JlYXRlVHlwZShtb2RlbFN5bmMzLA0KLQkJCQkJIldTMy5qYXZhIiwNCi0JCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIkltcGxpY2l0U2VpM05hbWVcIikgcHVibGljIGNsYXNzIFdTMyBleHRlbmRzIFdTMiB7XG4iDQotCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTWV0aG9kXCIpIHB1YmxpYyB2b2lkIHdlYk1ldGhvZChpbnQgcGFyYW0pIHt9XG4iDQotCQkJCQkrICJ9Iik7DQotCQl9DQotDQotCQlpZih0ZXN0UHJqND09bnVsbCkNCi0JCXsNCi0JCQlJUHJvamVjdCB3ZWJQcm9qZWN0ID0gVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlV2ViMjVQcm9qZWN0KCJET01XU0FjdGlvblRlc3RQcm9qZWN0NCIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQkJdGVzdFByajQgPSBuZXcgVGVzdFByb2plY3Qod2ViUHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJCXRlc3RQcmo0LmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQkJbW9kZWxTeW5jNCA9IHRlc3RQcmo0LmNyZWF0ZVBhY2thZ2UoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jNCIpOw0KLQkJCXRlc3RQcmo0LmNyZWF0ZVR5cGUobW9kZWxTeW5jNCwNCi0JCQkJCSJXUzEuamF2YSIsDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJJbXBsaWNpdFNlaTFOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzEge1xuIg0KLQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cInN1cGVyUGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHN1cGVyUGFyZW50TWV0aG9kKCkge31cbiINCi0JCQkJCSsgIn0iKTsNCi0JCQkNCi0JCQl0ZXN0UHJqNC5jcmVhdGVUeXBlKG1vZGVsU3luYzQsDQotCQkJCQkiV1MyLmphdmEiLA0KLQkJCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXRTZWkyTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MyIGV4dGVuZHMgV1MxIHtcbiINCi0JCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJwYXJlbnRNZXRob2RcIikgcHVibGljIHZvaWQgcGFyZW50TWV0aG9kKCkge31cbiINCi0JCQkJCSsgIn0iKTsNCi0JCQkNCi0JCQl0ZXN0UHJqNC5jcmVhdGVUeXBlKG1vZGVsU3luYzQsDQotCQkJCQkiV1MzLmphdmEiLA0KLQkJCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXRTZWkzTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MzIGV4dGVuZHMgV1MyIHtcbiINCi0JCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJNZXRob2RcIikgcHVibGljIHZvaWQgd2ViTWV0aG9kKCkge31cbiINCi0JCQkJCSsgIn0iKTsNCi0JCX0NCi0NCi0JCXRhcmdldFJlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsNCi0JCXRhcmdldFJlc291cmNlLmxvYWQobnVsbCk7DQotCQkNCi0JCUl0ZXJhdG9yPElXZWJTZXJ2aWNlUHJvamVjdD4gd3NQcm9qZWN0cyA9IHRhcmdldFJlc291cmNlLmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLml0ZXJhdG9yKCk7DQotCQkNCi0JCXdoaWxlKHdzUHJvamVjdHMuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSB3c1Byb2plY3RzLm5leHQoKTsNCi0JCQkNCi0JCQlpZih3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0ZXN0UHJqMS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkNCi0JCQl7DQotCQkJCXRoaXMud3NQcm9qZWN0MSA9IHdzUHJvamVjdDsNCi0JCQl9DQotCQkJZWxzZSBpZih3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0ZXN0UHJqMi5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkNCi0JCQl7DQotCQkJCXRoaXMud3NQcm9qZWN0MiA9IHdzUHJvamVjdDsNCi0JCQl9DQotCQkJZWxzZSBpZih3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0ZXN0UHJqMy5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkNCi0JCQl7DQotCQkJCXRoaXMud3NQcm9qZWN0MyA9IHdzUHJvamVjdDsNCi0JCQl9DQotCQkJZWxzZSBpZih3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0ZXN0UHJqNC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkNCi0JCQl7DQotCQkJCXRoaXMud3NQcm9qZWN0NCA9IHdzUHJvamVjdDsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QxKTsNCi0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QyKTsNCi0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QzKTsNCi0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3Q0KTsNCi0JCQ0KLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKSANCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGdldFdzUHJvamVjdChmaW5hbCBJRE9NIGRvbSwgZmluYWwgSVByb2plY3QgcHJvamVjdCkgew0KLQkJCQlpZihwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHMod3NQcm9qZWN0MS5nZXROYW1lKCkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gd3NQcm9qZWN0MTsNCi0JCQkJfQ0KLQkJCQllbHNlIGlmKHByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh3c1Byb2plY3QyLmdldE5hbWUoKSkpDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2plY3QyOw0KLQkJCQl9DQotCQkJCWVsc2UgaWYocHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHdzUHJvamVjdDMuZ2V0TmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvamVjdDM7DQotCQkJCX0NCi0JCQkJZWxzZSBpZihwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHMod3NQcm9qZWN0NC5nZXROYW1lKCkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gd3NQcm9qZWN0NDsNCi0JCQkJfQ0KLQkJCQl0aHJvdyBuZXcganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yKCJwcm9qZWN0ICIgKyBwcm9qZWN0ICsgIm5vdCBmb3VuZCBpbiBET00iKTsNCi0JCQl9CQkJDQotCQl9Ow0KLQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2UgZ2V0V1NGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJcmV0dXJuIChJV2ViU2VydmljZSl3U3NbMF07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlIGdldFdTRnJvbVdlYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoyLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCXJldHVybiAoSVdlYlNlcnZpY2Upd1NzWzBdOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNFSUV4cEZyb21FamJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlyZXR1cm4gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1swXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBnZXRTRUlGcm9tVGVzdFByajEoU3RyaW5nIHNlaU5hbWUpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJZm9yKGludCBqaj0wOyBqajxzRUlzLmxlbmd0aDsgamorKykNCi0JCQkJew0KLQkJCQkJaWYoKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbampdKS5nZXROYW1lKCkuZXF1YWxzKHNlaU5hbWUpKQ0KLQkJCQkJew0KLQkJCQkJCXJldHVybiAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2pqXTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViU2VydmljZSBnZXRXU0Zyb21UZXN0UHJqKFRlc3RQcm9qZWN0IHRlc3RQcmosIFN0cmluZyB3c05hbWUpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByai5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlmb3IoaW50IGpqPTA7IGpqPHdTcy5sZW5ndGg7IGpqKyspDQotCQkJCXsNCi0JCQkJCWlmKCgoSVdlYlNlcnZpY2Upd1NzW2pqXSkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMod3NOYW1lKSkNCi0JCQkJCXsNCi0JCQkJCQlyZXR1cm4gKElXZWJTZXJ2aWNlKXdTc1tqal07DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLS8vCXByb3RlY3RlZCBJV2ViU2VydmljZSBnZXRXU0Zyb21UZXN0UHJqMShTdHJpbmcgd3NOYW1lKQ0KLS8vCXsNCi0vLwkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLS8vCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0vLw0KLS8vCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0vLwkJew0KLS8vCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotLy8JCQl7DQotLy8JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0vLwkJCQkNCi0vLwkJCQlmb3IoaW50IGpqPTA7IGpqPHdTcy5sZW5ndGg7IGpqKyspDQotLy8JCQkJew0KLS8vCQkJCQlpZigoKElXZWJTZXJ2aWNlKXdTc1tqal0pLmdldE5hbWUoKS5lcXVhbHMod3NOYW1lKSkNCi0vLwkJCQkJew0KLS8vCQkJCQkJcmV0dXJuIChJV2ViU2VydmljZSl3U3NbampdOw0KLS8vCQkJCQl9DQotLy8JCQkJfQ0KLS8vCQkJfQ0KLS8vCQl9DQotLy8JCQ0KLS8vCQlyZXR1cm4gbnVsbDsNCi0vLwl9DQotCQ0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBnZXRTRUlGcm9tVGVzdFByajMoU3RyaW5nIHNlaU5hbWUpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajMuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJZm9yKGludCBqaj0wOyBqajx3U3MubGVuZ3RoOyBqaisrKQ0KLQkJCQl7DQotCQkJCQlpZigoKElXZWJTZXJ2aWNlKXdTc1tqal0pLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldE5hbWUoKS5lcXVhbHMoc2VpTmFtZSkpDQotCQkJCQl7DQotCQkJCQkJcmV0dXJuICgoSVdlYlNlcnZpY2Upd1NzW2pqXSkuZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBnZXRTRUlFeHBGcm9tV2ViUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajIuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJcmV0dXJuIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbMF07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U0VJSW1wRnJvbUVqYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmozLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCXJldHVybiAoKElXZWJTZXJ2aWNlKXdTc1swXSkuZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U0VJSW1wRnJvbVdlYlByb2plY3QoKQ0KLQl7DQotCQkNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajQuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJcmV0dXJuICgoSVdlYlNlcnZpY2Upd1NzWzBdKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRXU01ldGhvZEluaGVyaXRlZEZyb21FamJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMy5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotCQlPYmplY3RbXSB3U3MgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3U3MpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdTcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViU2VydmljZSl3U3NbaWldKS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMzLldTMyIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygic3VwZXJQYXJlbnRNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRXU01ldGhvZEluaGVyaXRlZEZyb21XZWJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqNC5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlPYmplY3RbXSB3U3MgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3U3MpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdTcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViU2VydmljZSl3U3NbaWldKS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmM0LldTMyIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygic3VwZXJQYXJlbnRNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRXU01ldGhvZE5vdEluaGVyaXRlZEZyb21FamJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMy5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlPYmplY3RbXSB3U3MgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3U3MpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdTcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViU2VydmljZSl3U3NbaWldKS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMzLldTMyIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygid2ViTWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0V1NNZXRob2ROb3RJbmhlcml0ZWRGcm9tV2ViUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajQuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gd1NzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod1NzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3U3MubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jNC5XUzMiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIndlYk1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViTWV0aG9kIGdldFNFSU1ldGhvZEluaGVyaXRlZEZyb21FamJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlPYmplY3RbXSBzRUlzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwoc0VJcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8c0VJcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJTZWkyTmFtZSIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygicGFyZW50TWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0U0VJTWV0aG9kSW5oZXJpdGVkRnJvbVdlYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoyLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCU9iamVjdFtdIHNFSXMgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQkJew0KLQkJCQlzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChzRUlzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxzRUlzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIlNlaTJOYW1lIikpDQotCQkJew0KLQkJCQl3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod2ViTWV0aG9kcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d2ViTWV0aG9kcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJwYXJlbnRNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRTRUlNZXRob2ROb3RJbmhlcml0ZWRGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gc0VJcyA9IG51bGw7DQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gbnVsbDsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHNFSXMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHNFSXMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygiU2VpMk5hbWUiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIndlYk1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViTWV0aG9kIGdldFNFSU1ldGhvZE5vdEluaGVyaXRlZEZyb21XZWJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMi5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlPYmplY3RbXSBzRUlzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwoc0VJcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8c0VJcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJTZWkyTmFtZSIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygid2ViTWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFdzQWN0aW9uUHJvdmlkZXJXaXRoVHJlZVNlbGVjdGlvbihPYmplY3RbXSBzZWxlY3Rpb24pDQotCXsNCi0JCXdzQWN0aW9uUHJvdiA9IG5ldyBXU0FjdGlvblByb3ZpZGVyKCk7DQotCQkNCi0JCU1vY2s8VHJlZVZpZXdlcj4gdHJlZVZpZXdlciA9IG1vY2soVHJlZVZpZXdlci5jbGFzcyk7DQotCQlDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlIGNBRXh0U2l0ZSA9IGNyZWF0ZUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGVNb2NrKHRyZWVWaWV3ZXIucHJveHkoKSk7DQotDQotCQl3c0FjdGlvblByb3YuaW5pdChjQUV4dFNpdGUpOw0KLQkJDQotCQlUcmVlUGF0aCBwYXRoID0gbmV3IFRyZWVQYXRoKHNlbGVjdGlvbik7DQotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBUcmVlU2VsZWN0aW9uKHBhdGgpOw0KLQkJQWN0aW9uQ29udGV4dCBhY3RDbnQgPSBuZXcgQWN0aW9uQ29udGV4dChzZWwpOw0KLQkJDQotCQl3c0FjdGlvblByb3Yuc2V0Q29udGV4dChhY3RDbnQpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0V3NBY3Rpb25Qcm92aWRlcldpdGhTdHJ1Y3R1cmVkU2VsZWN0aW9uKE9iamVjdFtdIHNlbGVjdGlvbikNCi0Jew0KLQkJd3NBY3Rpb25Qcm92ID0gbmV3IFdTQWN0aW9uUHJvdmlkZXIoKTsNCi0NCi0JCU1vY2s8VHJlZVZpZXdlcj4gdHJlZVZpZXdlciA9IG1vY2soVHJlZVZpZXdlci5jbGFzcyk7DQotCQlDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlIGNBRXh0U2l0ZSA9IGNyZWF0ZUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGVNb2NrKHRyZWVWaWV3ZXIucHJveHkoKSk7DQotDQotCQl3c0FjdGlvblByb3YuaW5pdChjQUV4dFNpdGUpOw0KLQkJDQotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbik7DQotCQlBY3Rpb25Db250ZXh0IGFjdENudCA9IG5ldyBBY3Rpb25Db250ZXh0KHNlbCk7DQotCQkNCi0JCXdzQWN0aW9uUHJvdi5zZXRDb250ZXh0KGFjdENudCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgZ2V0V3NQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpDQotCXsNCi0JCUl0ZXJhdG9yPElXZWJTZXJ2aWNlUHJvamVjdD4gd3NQcm9qZWN0cyA9IHRhcmdldFJlc291cmNlLmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLml0ZXJhdG9yKCk7DQotCQkNCi0JCXdoaWxlKHdzUHJvamVjdHMuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSB3c1Byb2plY3RzLm5leHQoKTsNCi0JCQkNCi0JCQlpZih3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyhwcm9qZWN0LmdldE5hbWUoKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gd3NQcm9qZWN0Ow0KLQkJCX0NCi0JCX0NCi0JCXRocm93IG5ldyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3IoInByb2plY3QgIiArIHByb2plY3QgKyAibm90IGZvdW5kIGluIERPTSIpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBjcmVhdGVDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlTW9jayhmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikNCi0Jew0KLQkJZmluYWwgTmF2aWdhdG9yQ29udGVudFNlcnZpY2UgY29udGVudFNlcnZpY2UgPSAoTmF2aWdhdG9yQ29udGVudFNlcnZpY2UpTmF2aWdhdG9yQ29udGVudFNlcnZpY2VGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZUNvbnRlbnRTZXJ2aWNlKCJteXZpZXdlciIpOw0KLQkJDQotCQkvL0VjbGlwc2UgMy41IGNvbnN0cnVjdG9yIHJlcXVpcmVkIGZvciBXVFAgYnVpbGQNCi0JCXJldHVybiBuZXcgQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSgibXlleHRlbnNpb25pZCIsICJteXBsdWdpbmlkIiwgKElDb21tb25WaWV3ZXJTaXRlKW1vY2soSUNvbW1vblZpZXdlclNpdGUuY2xhc3MpLnByb3h5KCksIGNvbnRlbnRTZXJ2aWNlLCB2aWV3ZXIpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW0gY3JlYXRlQ29udHJpYnV0aW9uSXRlbU1vY2soZmluYWwgU3RyaW5nIGl0ZW1JZCkNCi0Jew0KLQkJTW9jazxJQ29udHJpYnV0aW9uSXRlbT4gY250cmJJdGVtID0gbW9jayhJQ29udHJpYnV0aW9uSXRlbS5jbGFzcyk7DQotCQljbnRyYkl0ZW0uc3R1YnMoKS5tZXRob2QoImdldElkIikud2lsbChyZXR1cm5WYWx1ZShpdGVtSWQpKTsNCi0JCWNudHJiSXRlbS5zdHVicygpLm1ldGhvZCgic2V0UGFyZW50Iikud2lsbChyZXR1cm5WYWx1ZShudWxsKSk7DQotCQljbnRyYkl0ZW0uc3R1YnMoKS5tZXRob2QoImlzRHluYW1pYyIpLndpbGwocmV0dXJuVmFsdWUoZmFsc2UpKTsNCi0JCXJldHVybiBjbnRyYkl0ZW0ucHJveHkoKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnVXaXRoQ29udHJpYnV0aW9uSXRlbXMoZmluYWwgTWVudU1hbmFnZXIgbWVudSwgZmluYWwgU3RyaW5nLi4uIGl0ZW1JZHMpDQotCXsNCi0JCWZvcihTdHJpbmcgaWQgOiBpdGVtSWRzKQ0KLQkJew0KLQkJCUlDb250cmlidXRpb25JdGVtIGNudHJiSXRlbSA9IGNyZWF0ZUNvbnRyaWJ1dGlvbkl0ZW1Nb2NrKGlkKTsNCi0JCQltZW51LmFkZChjbnRyYkl0ZW0pOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWMyNDFhNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQzNjBjZGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMA0KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHM7c2luZ2xldG9uOj10cnVlDQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbg0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLA0KLSBvcmcuam1vY2ssDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsDQotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLA0KLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UudWkuaWRlLA0KLSBvcmcuanVuaXQsDQotIG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUsDQotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLA0KLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUNCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuYW5ub3RhdGlvbiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLmltcGwsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuZGVmYXVsdHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplciwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnV0aWwsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjdhY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDIwLCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FhZTI0OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMmJhZjkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1CdW5kbGUtTmFtZS4wPUpBWC1XUyBET00gUnVudGltZSBUZXN0cw0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2OTNiN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4NCi08IS0tDQotICAgIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICANCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIC0tPg0KLQ0KLTxmcmFnbWVudD4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9InN1cHBvcnRlZHJ1bnRpbWV0ZXN0Ig0KLSAgICAgICAgIG5hbWU9IlRlc3RpbmciDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5kb21ydW50aW1lcyI+DQotICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLlRlc3RXc0RPTVJ1bnRpbWVFeHRlbnNpb24iLz4NCi0gICAgICA8cHJvamVjdF9mYWNldCANCi0gICAgICAJIGlkPSJqc3Qud2ViIg0KLSAgICAgIAkgdmVyc2lvbj0iMS4wLjAuMCIvPg0KLSAgICAgIDxwcm9qZWN0X2ZhY2V0IA0KLSAgICAgIAkgaWQ9InRlc3QuZmFjZXQiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9InN1cHBvcnRlZHJ1bnRpbWV0ZXN0MSINCi0gICAgICAgICBuYW1lPSJUZXN0aW5nMSINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmRvbXJ1bnRpbWVzIj4NCi0gICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20uVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbiIvPg0KLSAgICAgIDxwcm9qZWN0X2ZhY2V0IA0KLSAgICAgIAkgaWQ9ImpzdC53ZWJiIg0KLSAgICAgIAkgdmVyc2lvbj0iMS4wLjAuMCIvPg0KLSAgICAgIDxwcm9qZWN0X2ZhY2V0IA0KLSAgICAgIAkgaWQ9InRlc3QuZmFjZXR0Ii8+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJzdXBwb3J0ZWRydW50aW1ldGVzdDIiDQotICAgICAgICAgbmFtZT0iVGVzdGluZzIiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5kb21ydW50aW1lcyI+DQotICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLldzRE9NUnVudGltZVJlZ2lzdHJ5VGVzdCIvPg0KLSAgICAgIDxwcm9qZWN0X2ZhY2V0IA0KLSAgICAgIAkgaWQ9ImpzdC53ZWJiIg0KLSAgICAgIAkgdmVyc2lvbj0iMS4wLjAuMCIvPg0KLSAgICAgIDxwcm9qZWN0X2ZhY2V0IA0KLSAgICAgIAkgaWQ9InRlc3QuZmFjZXR0Ii8+DQotICAgPC9leHRlbnNpb24+DQotPC9mcmFnbWVudD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5ODI4NjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uc1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zLkFycmF5VmFsdWVJbXBsVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnMuQ29tcGxleEFubm90YXRpb25JbXBsVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnMuUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnMuUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLldzRE9NUnVudGltZVJlZ2lzdHJ5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLkpheFdzRGVmYXVsdHNDYWxjdWxhdG9yVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2VUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLkplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuUHJvamVjdEFkZGluZ1Rlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuV29ya3NwYWNlQ1VGaW5kZXJUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQWRhcHRlckZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsLkFubm90YXRpb25BZGFwdGVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmRlZmF1bHRzLk1ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmRlZmF1bHRzLlBhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmRlZmF1bHRzLlNlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmRlZmF1bHRzLldzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5BYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuTWV0aG9kU2VyaWFsaXplckFkYXB0ZXJUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlclRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLlNlaVNlcmlhbGl6ZXJBZGFwdGVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuV3NTZXJpYWxpemVyQWRhcHRlclRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZS5NZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZS5QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZS5Qcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3RhdGUuU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3RhdGUuV3NQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jLkFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYy5JbXBsaWNpdFNlaU1ldGhvZFN5bmNocm9uaXphdGlvblRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYy5NZXRob2RQYXJhbXNTeW5jaHJvbml6YXRpb25UZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmMuTW9kZWxTeW5jaHJvbml6YXRpb25UZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmMuT25FdmVudE1vZGVsU3luY3Jvbml6ZXJUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYy5TZWlNZXRob2RTeW5jcm9uaXphdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jLlNlaVN5bmNyb25pemF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmMuV3NTeW5jaHJvbml6YXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udXRpbC5Eb20yUmVzb3VyY2VNYXBwZXJUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udXRpbC5Eb21VdGlsVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb24uRW5kcG9pbnRJc1Nlc3Npb25CZWFuUnVsZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uLlNlaVZhbGlkYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbi5XbVZhbGlkYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbi5XcFZhbGlkYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbi5Xc1ZhbGlkYXRpb25UZXN0OwotCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHNTdWl0ZQotewotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25GYWN0b3J5VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uc1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDb21wbGV4QW5ub3RhdGlvbkltcGxUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFF1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5VmFsdWVJbXBsVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShXc0RPTVJ1bnRpbWVSZWdpc3RyeVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoV3NET01SdW50aW1lTWFuYWdlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRG9tMlJlc291cmNlTWFwcGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShEb21VdGlsVGVzdC5jbGFzcyk7Ci0KLSAgICAgICAgLy8gRE9NIHRlc3RzCi0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShKZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShKYXhXc1dvcmtzcGFjZVJlc291cmNlVGVzdHMuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvamVjdEFkZGluZ1Rlc3RzLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFdvcmtzcGFjZUNVRmluZGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIC8vIERPTSBzeW5jIHRlc3RzCi0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShPbkV2ZW50TW9kZWxTeW5jcm9uaXplclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSW1wbGljaXRTZWlNZXRob2RTeW5jaHJvbml6YXRpb25UZXN0cy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNZXRob2RQYXJhbXNTeW5jaHJvbml6YXRpb25UZXN0cy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNb2RlbFN5bmNocm9uaXphdGlvblRlc3RzLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNlaU1ldGhvZFN5bmNyb25pemF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTZWlTeW5jcm9uaXphdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoV3NTeW5jaHJvbml6YXRpb25UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yVGVzdC5jbGFzcyk7Ci0gICAgICAgIC8vIHN0YXRlIGFkYXB0ZXJzIHRlc3RzCi0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTZWlQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoV3NQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgLy8gc2VyaWFsaXplIGFkYXB0ZXIgdGVzdHMKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFic3RyYWN0U2VyaWFsaXplckFkYXB0ZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTZWlTZXJpYWxpemVyQWRhcHRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShXc1NlcmlhbGl6ZXJBZGFwdGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlclRlc3QuY2xhc3MpOwotICAgICAgICAvLyBkZWZhdWx0IHZhbHVlcyBhZGFwdGVyIHRlc3RzCi0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoV3NQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFBhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIC8vIG90aGVyIGFkYXB0ZXJzIHRlc3RzCi0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uQWRhcHRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5VGVzdC5jbGFzcyk7Ci0gICAgICAgIC8vIHZhbGlkYXRpb24gdGVzdHMKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNlaVZhbGlkYXRpb25UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFdzVmFsaWRhdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoV21WYWxpZGF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIC8vIENvbW1lbnRlZCBvdXQgZHVlIHRvIGJ1ZyAzMDU3NzIKLSAgICAgICAgLy9zdWl0ZS5hZGRUZXN0U3VpdGUoV3BWYWxpZGF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShFbmRwb2ludElzU2Vzc2lvbkJlYW5SdWxlVGVzdC5jbGFzcyk7Ci0KLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOWFmZTdjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi0vKioNCi0gKiBBbm5vdGF0aW9uRmFjdG9yeSBjbGFzcyB0ZXN0IGNhc2VzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikNCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZhY3RvcnlUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU3RyaW5nVmFsdWUoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJSVZhbHVlIHN0clZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotCQlhc3NlcnROb3ROdWxsKHN0clZhbHVlKTsNCi0JCWFzc2VydFRydWUoc3RyVmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoInZhbHVlIikpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQYXJhbVZhbHVlUGFpcigpDQotCXsNCi0JCUlWYWx1ZSBzdHJWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZSIpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShudWxsLCBzdHJWYWx1ZSk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIiIsIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJfQ0KLQ0KLQkJSVBhcmFtVmFsdWVQYWlyIHZhbHVlUGFpciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgc3RyVmFsdWUpOw0KLQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZVBhaXIpOw0KLQkJYXNzZXJ0VHJ1ZSh2YWx1ZVBhaXIuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIElWYWx1ZSk7DQotCQlhc3NlcnRUcnVlKHZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygicGFyYW0iKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbXBsZXhBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlJVmFsdWUgc3RyVmFsdWUxID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotCQlJUGFyYW1WYWx1ZVBhaXIgdmFsdWVQYWlyMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgc3RyVmFsdWUxKTsNCi0NCi0JCUlWYWx1ZSBzdHJWYWx1ZTIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUxIik7DQotCQlJUGFyYW1WYWx1ZVBhaXIgdmFsdWVQYWlyMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtMSIsIHN0clZhbHVlMik7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhcmFtVmFsdWVzLmFkZCh2YWx1ZVBhaXIxKTsNCi0JCXBhcmFtVmFsdWVzLmFkZCh2YWx1ZVBhaXIyKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24obnVsbCwgcGFyYW1WYWx1ZXMsZW5kcG9pbnQpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCIiLCBudWxsLCBlbmRwb2ludCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gY2EgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJuYW1lIiwgcGFyYW1WYWx1ZXMsZW5kcG9pbnQpOw0KLQkJYXNzZXJ0Tm90TnVsbChjYSk7DQotCQlhc3NlcnRFcXVhbHMoY2EuZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpLCAyKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVmFsdWVQYWlyKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiIiwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUobnVsbCwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQXJyYXlWYWx1ZSgpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFycmF5VmFsdWUobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCUlWYWx1ZSBzdHJWYWx1ZTEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUxIik7DQotCQlJVmFsdWUgc3RyVmFsdWUyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlMiIpOw0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzLmFkZChzdHJWYWx1ZTEpOw0KLQkJdmFsdWVzLmFkZChzdHJWYWx1ZTIpOw0KLQkJDQotCQkNCi0JCUlWYWx1ZSBhcnJWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFycmF5VmFsdWUodmFsdWVzKTsNCi0JCWFzc2VydE5vdE51bGwoYXJyVmFsdWUpOw0KLQkJYXNzZXJ0VHJ1ZShhcnJWYWx1ZS50b1N0cmluZygpLmVxdWFscygiW3ZhbHVlMSwgdmFsdWUyXSIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQlJVmFsdWUgcU5hbWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoIm9yZy5lY2xpcHNlLmRlbW8uVGVzdCIpOw0KLQkJYXNzZXJ0Tm90TnVsbChxTmFtZSk7DQotCQlhc3NlcnRUcnVlKHFOYW1lLnRvU3RyaW5nKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5kZW1vLlRlc3QiKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUJvb2xlYW5WYWx1ZSgpDQotCXsNCi0JCUlWYWx1ZSBib29sVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVCb29sZWFuVmFsdWUodHJ1ZSk7DQotCQlhc3NlcnROb3ROdWxsKGJvb2xWYWx1ZSk7DQotCQlhc3NlcnRFcXVhbHMoYm9vbFZhbHVlLnRvU3RyaW5nKCksICJ0cnVlIik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25zRnJvbUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotCX0NCi0NCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotLy8Jew0KLS8vCQlwcmVwYXJlUHJvamVjdCgpOw0KLS8vDQotLy8JCUlGaWVsZCBmaWVsZCA9IGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChmaWVsZCk7DQotLy8NCi0vLwkJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXR0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCkgZ2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoZmllbGQpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0vLwkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5sZW5ndGggPT0gMSk7DQotLy8JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbnNGcm9tTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTs7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uc0lUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuIGluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc01ldGhvZCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uc0lUeXBlU2V0T2ZTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlTZXQ8U3RyaW5nPiB0b1JlbW92ZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0JCXRvUmVtb3ZlLmFkZCgiV2ViU2VydmljZSIpOw0KLQkJdG9SZW1vdmUuYWRkKCJXZWJNZXRob2QiKTsNCi0NCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zKGVuZHBvaW50LCB0b1JlbW92ZSk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTWV0aG9kID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc01ldGhvZC5zaXplKCkgPT0gMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25zSUZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJSUZpZWxkIGZpZWxkID0gZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpOw0KLQkJYXNzZXJ0Tm90TnVsbChmaWVsZCk7DQotDQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChmaWVsZCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTWV0aG9kID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc01ldGhvZC5zaXplKCkgPT0gMSk7DQotDQotLy8JCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuZ2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoZmllbGQpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0vLwkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5sZW5ndGggPT0gMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25zSU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQlJRmllbGQgZmllbGQgPSBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotDQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChtZXRob2QpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDIpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNZXRob2QgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTWV0aG9kLnNpemUoKT09IDApOw0KLQ0KLS8vCQlhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUZpZWxkKGZpZWxkKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotLy8JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMubGVuZ3RoID09IDApOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwcmVwYXJlUHJvamVjdCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbnNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTkzZTMzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29tcGxleEFubm90YXRpb25RTlZhbHVlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCUlQYXJhbVZhbHVlUGFpciBwdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgcXYpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwYXJhbVZhbHVlcy5hZGQocHYpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViU2VydmljZSIsIHBhcmFtVmFsdWVzLCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgZW5kcG9pbnQpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpLnNpemUoKSA+IDApOw0KLQl9DQotDQotLy8JcHVibGljIHZvaWQgdGVzdEFkZFNpbmdsZUVsZW1lbnRBbm5vdGF0aW9uQXJyYXlWYWx1ZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotLy8Jew0KLS8vCQlJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU2luZ2xlRWxlbWVudEFubm90YXRpb24oImphdmF4Lmp3cy5XZWJTZXJ2aWNlIiwgbmV3IFN0cmluZ1tdIHsgInZhbDEiLCAidmFsMiIgfSk7DQotLy8JCWFubm90YXRpb24uYWRkVG9DbGFzcyhlbmRwb2ludCk7DQotLy8NCi0vLwkJYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uRmFjdG9yeS5nZXRBbm5vdGF0aW9uc0Zyb21DbGFzcyhlbmRwb2ludCkubGVuZ3RoID4gMCk7DQotLy8JfQ0KLS8vDQotLy8JcHVibGljIHZvaWQgdGVzdEFkZFNpbXBsZUFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotLy8Jew0KLS8vCQlJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU2ltcGxlQW5ub3RhdGlvbigiamF2YXguandzLldlYlNlcnZpY2UiKTsNCi0vLwkJYW5ub3RhdGlvbi5hZGRUb0NsYXNzKGVuZHBvaW50KTsNCi0vLw0KLS8vCQlhc3NlcnRUcnVlKEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUNsYXNzKGVuZHBvaW50KS5sZW5ndGggPiAwKTsNCi0vLwl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggYW5ub3RhdGlvbiBhbmQgYWRkcyBpdCB0byBjbGFzcy4gVGhlIGFubm90YXRpb24gaGFzIHRoZSBmb3JtOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogCSBAV2ViU2VydmljZShzZXJ2aWNlTmFtZT0mcXVvdDtzZXJ2aWNlTmFtZSZxdW90OywNCi0JICogCSBuYW1lPSZxdW90O3BvcnRUeXBlTmFtZSZxdW90OywNCi0JICogCSB0YXJnZXROYW1lc3BhY2U9JnF1b3Q7aHR0cDovL2RlbW8uc2FwLmNvbS8mcXVvdDssDQotCSAqIAkgd3NkbExvY2F0aW9uPSZxdW90O2h0dHA6Ly93c2RsL3VybC8mcXVvdDssDQotCSAqIAkgcG9ydE5hbWU9JnF1b3Q7cG9ydE5hbWUmcXVvdDssDQotCSAqIAkgZW5kcG9pbnRJbnRlcmZhY2U9JnF1b3Q7b3JnLmVjbGlwc2UuZGVtby5JU2VpJnF1b3Q7KQ0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbXBsZXhDbGFzc0Fubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQ0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJzZXJ2aWNlTmFtZSIsICJzZXJ2aWNlTmFtZSIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJuYW1lIiwgInBvcnRUeXBlTmFtZSIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2RlbW8uc2FwLmNvbS8iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAid3NkbExvY2F0aW9uIiwgImh0dHA6Ly93c2RsL3VybC8iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAicG9ydE5hbWUiLCAicG9ydE5hbWUiKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAiZW5kcG9pbnRJbnRlcmZhY2UiLCAib3JnLmVjbGlwc2UuZGVtby5JU2VpIik7DQotDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImphdmF4Lmp3cy5XZWJTZXJ2aWNlIiwgcGFyYW1WYWx1ZXMsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5vdGF0aW9uLCBlbmRwb2ludCk7DQotDQotCQlBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbCBhbm5vdGF0aW9uSW5zcGVjdG9yID0gbmV3IEFubm90YXRpb25JbnNwZWN0b3JJbXBsKGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiB0eXBlQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uSW5zcGVjdG9yLmluc3BlY3RUeXBlKCk7DQotCQkgCQkNCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlPiB0eXBlQW5ub3RhdGlvbiA6IHR5cGVBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlpZih0eXBlQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiV2ViU2VydmljZSIpIHx8IHR5cGVBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJqYXZheC5qd3MuV2ViU2VydmljZSIpKQ0KLQkJCXsNCi0JCQkJaWYodHlwZUFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpICE9IDYpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJzZXJ2aWNlTmFtZSIpLmVxdWFscygic2VydmljZU5hbWUiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKS5lcXVhbHMoInBvcnRUeXBlTmFtZSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgidGFyZ2V0TmFtZXNwYWNlIikuZXF1YWxzKCJodHRwOi8vZGVtby5zYXAuY29tLyIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgid3NkbExvY2F0aW9uIikuZXF1YWxzKCJodHRwOi8vd3NkbC91cmwvIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwb3J0TmFtZSIpLmVxdWFscygicG9ydE5hbWUiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImVuZHBvaW50SW50ZXJmYWNlIikuZXF1YWxzKCJvcmcuZWNsaXBzZS5kZW1vLklTZWkiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0NCi0JCQkJcmVzdWx0ID0gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnRUcnVlKCJDbGFzcyBpcyBub3QgYW5ub3RhdGVkIGNvcnJlY3RseSIsIHJlc3VsdCk7DQotCQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggYW5ub3RhdGlvbiBhbmQgYWRkcyBpdCB0byBtZXRob2QgZGVjbGFyYXRpb24uIEFubm90YXRpb24gaGFzIHRoZSBmb3JtOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogIFxAV2ViTWV0aG9kKGV4Y2x1ZGU9ZmFsc2Usb3BlcmF0aW9uTmFtZT0mcXVvdDthbm5vdGF0ZWRNZXRob2QmcXVvdDssYWN0aW9uPSZxdW90O2dvJnF1b3Q7KQkNCi0JICogPC9wcmU+DQotCSAqIA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb21wbGV4TWV0aG9kQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotDQotCQlJVmFsdWUgZW1WYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZShmYWxzZSk7DQotCQlwYXJhbVZhbHVlcy5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiZXhjbHVkZSIsIGVtVmFsdWUpKTsNCi0NCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAib3BlcmF0aW9uTmFtZSIsICJhbm5vdGF0ZWRNZXRob2QiKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAiYWN0aW9uIiwgImdvIik7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCQkJDQotCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiamF2YXguandzLldlYk1ldGhvZCIsIHBhcmFtVmFsdWVzLCBtZXRob2QpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIG1ldGhvZCk7DQotDQotCQlBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbCBhbm5vdGF0aW9uSW5zcGVjdG9yID0gbmV3IEFubm90YXRpb25JbnNwZWN0b3JJbXBsKGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IG1ldGhvZEFubm90YXRpb25zID0gYW5ub3RhdGlvbkluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkgCQkNCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotCQlmb3IgKElBbm5vdGF0aW9uPElNZXRob2Q+IG1ldGhvZEFubm90YXRpb24gOiBtZXRob2RBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlpZihtZXRob2RBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJqYXZheC5qd3MuV2ViTWV0aG9kIikgfHwgbWV0aG9kQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiV2ViTWV0aG9kIikpDQotCQkJew0KLQkJCQlpZihtZXRob2RBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSAhPSAzKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighbWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJleGNsdWRlIikuZXF1YWxzKCJmYWxzZSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighbWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJvcGVyYXRpb25OYW1lIikuZXF1YWxzKCJhbm5vdGF0ZWRNZXRob2QiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIW1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYWN0aW9uIikuZXF1YWxzKCJnbyIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJIAkJCQkNCi0JCQkJcmVzdWx0ID0gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnRUcnVlKCJNZXRob2QgaXMgbm90IGFubm90YXRlZCBjb3JyZWN0bHkiLCByZXN1bHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggYW5ub3RhdGlvbiBhbmQgYWRkcyBpdCB0byBhIG1ldGhvZCBwYXJhbWV0ZXIuIFRoZSBhbm5vdGF0aW9uIGhhcyB0aGUgZm9ybToNCi0JICogDQotCSAqIDxwcmU+DQotCSAqICBcQFdlYlBhcmFtKG9wZXJhdGlvbk5hbWU9JnF1b3Q7YW5ub3RhdGVkUGFyYW0mcXVvdDssIHRhcmdldE5hbWVzcGFjZT0mcXVvdDtodHRwOi8vZGVtby5zYXAuY29tL3BhcmFtcy8mcXVvdDssIHBhcnROYW1lPSZxdW90O3BhcnROYW1lJnF1b3Q7KQ0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbXBsZXhQYXJhbUFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKCJhbm5vdGF0ZWRQYXJhbSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotDQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgImFubm90YXRlZFBhcmFtIiwgInBhcmFtIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZGVtby5zYXAuY29tL3BhcmFtcy8iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAicGFydE5hbWUiLCAicGFydE5hbWUiKTsNCi0NCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiamF2YXguandzLldlYlBhcmFtIiwgcGFyYW1WYWx1ZXMsIHR5cGVQYXJhbWV0ZXIpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIHR5cGVQYXJhbWV0ZXIpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhZGRTdHJpbmdQcm9wZXJ0eShTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcywgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdmFsdWUpDQotCXsNCi0JCUlWYWx1ZSBwVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSh2YWx1ZSk7DQotCQlJUGFyYW1WYWx1ZVBhaXIgcGFpciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUocHJvcGVydHksIHBWYWx1ZSk7DQotCQlwYXJhbVZhbHVlcy5hZGQocGFpcik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvQXJyYXlWYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9BcnJheVZhbHVlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmUyZTIwMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9BcnJheVZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5BcnJheVZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuU3RyaW5nVmFsdWVJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBBcnJheVZhbHVlSW1wbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0NCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkNCi0Jew0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMSA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczEuY2xlYXIoKTsNCi0JCXZhbHVlczEuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDEiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjEgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMSk7DQotCQkNCi0JCVNldDxJVmFsdWU+IHZhbHVlczIgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMyLmNsZWFyKCk7DQotCQl2YWx1ZXMyLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwyIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYyID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczIpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShhdjEuaGFzaENvZGUoKSAhPSBhdjIuaGFzaENvZGUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEFycmF5VmFsdWVJbXBsKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJbmV3IEFycmF5VmFsdWVJbXBsKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMSA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczEuY2xlYXIoKTsNCi0JCXZhbHVlczEuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDEiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjEgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMSk7DQotDQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMyID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzMi5jbGVhcigpOw0KLQkJdmFsdWVzMi5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMiIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2MiA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMyKTsNCi0NCi0JCVNldDxJVmFsdWU+IHZhbHVlczMgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMzLmNsZWFyKCk7DQotCQl2YWx1ZXMzLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwxIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYzID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczMpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoYXYxLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShhdjEuZXF1YWxzKDEyMykpOw0KLQkJYXNzZXJ0RmFsc2UoYXYxLmVxdWFscyhhdjIpKTsNCi0NCi0JCWFzc2VydFRydWUoYXYxLmVxdWFscyhhdjMpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9Db21wbGV4QW5ub3RhdGlvbkltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9Db21wbGV4QW5ub3RhdGlvbkltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4NjY1ZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvQ29tcGxleEFubm90YXRpb25JbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIENvbXBsZXhBbm5vdGF0aW9uSW1wbFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17CQ0KLQlwcml2YXRlIE1vY2s8SVR5cGU+IHR5cGVFbGVtZW50ID0gbW9jayhJVHlwZS5jbGFzcyk7DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKQ0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwdnAgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHZhbHVlKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHB2cCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZSIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lMiIsIHBhcmFtVmFsdWVzLHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uMS5oYXNoQ29kZSgpICE9IGFubm90YXRpb24yLmhhc2hDb2RlKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwdnAgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHZhbHVlKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHB2cCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZSIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lMiIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lIiwgcGFyYW1WYWx1ZXMsIHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbjEuZXF1YWxzKGFubm90YXRpb24yKSk7DQotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uMS5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbjEuZXF1YWxzKDEyMykpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uMS5lcXVhbHMoYW5ub3RhdGlvbjMpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9FbmRwb2ludC5zcmMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9FbmRwb2ludC5zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5YzdhNDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvRW5kcG9pbnQuc3JjCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJXU0ltcGxCZWFuU2VydmljZSIsIG5hbWU9IldTSW1wbEJlYW4iLCB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZW1vL3NhcC9jb20vIiwgcG9ydE5hbWU9IldTSW1wbEJlYW5Qb3J0IikNCi1AU3RhdGVsZXNzDQotcHVibGljIGNsYXNzIEVuZHBvaW50DQotew0KLQlATXlBbm5vdGF0aW9uKG5hbWU9ImZpZWxkMSIpDQotCXB1YmxpYyBTdHJpbmcgZmllbGQxOw0KLQkNCi0JQFdlYk1ldGhvZChleGNsdWRlPWZhbHNlLG9wZXJhdGlvbk5hbWU9InRlc3QiKQ0KLQlwdWJsaWMgdm9pZCBhbm5vdGF0ZWRNZXRob2QoIEBXZWJQYXJhbShuYW1lPSJhbm5vdGF0ZWRQYXJhbSIpIFN0cmluZyBhbm5vdGF0ZWRQYXJhbSkgDQotCXsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9QYXJhbVZhbHVlUGFpckltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9QYXJhbVZhbHVlUGFpckltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1NjdlZjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuUGFyYW1WYWx1ZVBhaXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5TdHJpbmdWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIFBhcmFtVmFsdWVQYWlySW1wbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0NCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkNCi0Jew0KLQkJSVZhbHVlIHZhbHVlID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbSIsIHZhbHVlKTsNCi0NCi0JCUlWYWx1ZSB2YWx1ZTEgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWx1ZTEiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAxID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0xIiwgdmFsdWUxKTsNCi0NCi0JCWFzc2VydEZhbHNlKHB2cC5oYXNoQ29kZSgpID09IHB2cDEuaGFzaENvZGUoKSk7DQotCQlhc3NlcnRGYWxzZShwdnAuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMoMTIzKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlIik7DQotCQlQYXJhbVZhbHVlUGFpckltcGwgcHZwID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0iLCB2YWx1ZSk7DQotDQotCQlJVmFsdWUgdmFsdWUxID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAxID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0iLCB2YWx1ZTEpOw0KLQ0KLQkJSVZhbHVlIHZhbHVlMiA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlMiIpOw0KLQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHB2cDIgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbTIiLCB2YWx1ZTIpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShwdnAuZXF1YWxzKHB2cDEpKTsNCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMocHZwMikpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL1F1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9RdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NzY3MzQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL1F1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIFF1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotDQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpDQotCXsNCi0JCUlWYWx1ZSBxdjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUxIik7DQotCQlJVmFsdWUgcXYyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlhc3NlcnRGYWxzZShxdjEuaGFzaENvZGUoKSA9PSBxdjIuaGFzaENvZGUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQkJSVZhbHVlIHF2MSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZTEiKTsNCi0JCUlWYWx1ZSBxdjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCWFzc2VydEZhbHNlKHF2LmVxdWFscyhxdjEpKTsNCi0JCWFzc2VydFRydWUocXYuZXF1YWxzKHF2MikpOw0KLQkJYXNzZXJ0RmFsc2UocXYuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKHF2LmVxdWFscygxMjMpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL1Rlc3RXc0RPTVJ1bnRpbWVFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjc3NTFmZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RvbUxvYWRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5qbW9jay5Nb2NrOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0V3NET01SdW50aW1lRXh0ZW5zaW9uIGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIGltcGxlbWVudHMgSVdzRE9NUnVudGltZUV4dGVuc2lvbiANCi17DQotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7DQotCQ0KLQlwdWJsaWMgdm9pZCBjcmVhdGVET00oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSANCi0Jew0KLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsNCi0JfQ0KLQkNCi0JcHVibGljIElET00gZ2V0RE9NKCkNCi0Jew0KLQkJTW9jayBpdGVyID0gbmV3IE1vY2soSXRlcmF0b3IuY2xhc3MpOw0KLQkJaXRlci5leHBlY3RzKGF0TGVhc3RPbmNlKCkpLm1ldGhvZCgiaGFzTmV4dCIpLndpbGwocmV0dXJuVmFsdWUoZmFsc2UpKTsNCi0JCSgoSXRlcmF0b3I8Pz4paXRlci5wcm94eSgpKS5oYXNOZXh0KCk7DQotCQlNb2NrIGVMaXN0ID0gbmV3IE1vY2soRUxpc3QuY2xhc3MpOw0KLQkJZUxpc3QuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoIml0ZXJhdG9yIikud2lsbChyZXR1cm5WYWx1ZShpdGVyLnByb3h5KCkpKTsNCi0JCSgoRUxpc3Q8Pz4pZUxpc3QucHJveHkoKSkuaXRlcmF0b3IoKTsNCi0JCU1vY2sgZG9tID0gbmV3IE1vY2soSURPTS5jbGFzcyk7DQotCQlkb20uZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldFdlYlNlcnZpY2VQcm9qZWN0cyIpLndpbGwocmV0dXJuVmFsdWUoZUxpc3QucHJveHkoKSkpOw0KLQkJKChJRE9NKWRvbS5wcm94eSgpKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0JCXJldHVybiAoSURPTSlkb20ucHJveHkoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBhZGRMb2FkTGlzdGVuZXIoSVdzRG9tTG9hZExpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotCX0NCi0NCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9hZExpc3RlbmVyKElXc0RvbUxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGlzTG9hZENhbmNlbGVkKCkgew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL1dzRE9NUnVudGltZU1hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxNGMwZDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL1dzRE9NUnVudGltZU1hbmFnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NUnVudGltZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5JV3NET01SdW50aW1lSW5mbzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LldzRE9NUnVudGltZVJlZ2lzdHJ5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBXc0RPTVJ1bnRpbWVNYW5hZ2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQlwcml2YXRlIFdzRE9NUnVudGltZU1hbmFnZXIgdGFyZ2V0Ow0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgDQotCXsNCi0JCXRhcmdldCA9IChXc0RPTVJ1bnRpbWVNYW5hZ2VyKVdzRE9NUnVudGltZU1hbmFnZXIuaW5zdGFuY2UoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldERPTVJ1bnRpbWVGb3JSdW50aW1lSW5mbygpDQotCXsNCi0JCUNvbGxlY3Rpb248SVdzRE9NUnVudGltZUluZm8+IHJlZ2lzdGVyZWRSdW50aW1lcyA9IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh0YXJnZXQuZ2V0RE9NUnVudGltZShyZWdpc3RlcmVkUnVudGltZXMuaXRlcmF0b3IoKS5uZXh0KCkpKTsNCi0JCQ0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBydW50aW1lID0gdGFyZ2V0LmdldERPTVJ1bnRpbWUocmVnaXN0ZXJlZFJ1bnRpbWVzLml0ZXJhdG9yKCkubmV4dCgpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKHJ1bnRpbWUsIHRhcmdldC5nZXRET01SdW50aW1lKHJlZ2lzdGVyZWRSdW50aW1lcy5pdGVyYXRvcigpLm5leHQoKSkpOw0KLQkJDQotCQlyZWdpc3RlcmVkUnVudGltZXMgPSBXc0RPTVJ1bnRpbWVSZWdpc3RyeS5nZXRSZWdpc3RlcmVkUnVudGltZXNJbmZvKCk7DQotCQkNCi0JCWFzc2VydEVxdWFscyhydW50aW1lLCB0YXJnZXQuZ2V0RE9NUnVudGltZShyZWdpc3RlcmVkUnVudGltZXMuaXRlcmF0b3IoKS5uZXh0KCkpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RE9NUnVudGltZUZvclJ1bnRpbWVJZCgpDQotCXsNCi0JCWFzc2VydE5vdE51bGwodGFyZ2V0LmdldERPTVJ1bnRpbWUoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0IikpOw0KLQkJYXNzZXJ0TnVsbCh0YXJnZXQuZ2V0RE9NUnVudGltZSgidGVzdC5pZCIpKTsNCi0JCWFzc2VydEVxdWFscyh0YXJnZXQuZ2V0RE9NUnVudGltZSgic3VwcG9ydGVkcnVudGltZXRlc3QiKSwgdGFyZ2V0LmdldERPTVJ1bnRpbWUoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0IikpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRE9NUnVudGltZXMoKQ0KLQl7DQotCQl0YXJnZXQuY3JlYXRlRE9NUnVudGltZXMobnVsbCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwodGFyZ2V0LmdldERPTVJ1bnRpbWUoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0IikpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0YXJnZXQuZ2V0RE9NUnVudGltZSgic3VwcG9ydGVkcnVudGltZXRlc3QxIikpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RWFybHlTdGFydHVwKCkNCi0Jew0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZkVsZW1lbnRzID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2UudWkuc3RhcnR1cCIpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNvbmZFbGVtZW50cy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudCIuZXF1YWxzKGNvbmZFbGVtZW50c1tpaV0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSkNCi0JCQl7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWZhaWwoIlRoZSBlYXJseSBzdGFydHVwIGZvciBET00gTW9kZWwgaXMgbm90IGRlZmluZWQgISIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVsb2FkRE9NUnVudGltZXMoKQ0KLQl7DQotCQl0YXJnZXQucmVsb2FkRE9NUnVudGltZXMobnVsbCk7DQotCQkNCi0JCUlXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZSA9IHRhcmdldC5nZXRET01SdW50aW1lKCJzdXBwb3J0ZWRydW50aW1ldGVzdCIpOw0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lMSA9IHRhcmdldC5nZXRET01SdW50aW1lKCJzdXBwb3J0ZWRydW50aW1ldGVzdDEiKTsNCi0JCQkNCi0JCXRhcmdldC5yZWxvYWRET01SdW50aW1lcyhudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90U2FtZShkb21SdW50aW1lLHRhcmdldC5nZXRET01SdW50aW1lKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJ1bnRpbWVJbmZvKCJzdXBwb3J0ZWRydW50aW1ldGVzdCIpLmdldElkKCkpKTsNCi0JCWFzc2VydE5vdFNhbWUoZG9tUnVudGltZTEsdGFyZ2V0LmdldERPTVJ1bnRpbWUoV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8oInN1cHBvcnRlZHJ1bnRpbWV0ZXN0MSIpLmdldElkKCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldERPTVJ1bnRpbWVzKCkNCi0Jew0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lID0gdGFyZ2V0LmdldERPTVJ1bnRpbWUoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0Iik7CQkNCi0JCWFzc2VydE5vdE51bGwoZG9tUnVudGltZSk7DQotCQlhc3NlcnRUcnVlKGRvbVJ1bnRpbWUgaW5zdGFuY2VvZiBUZXN0V3NET01SdW50aW1lRXh0ZW5zaW9uKTsNCi0JCQ0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lMSA9IHRhcmdldC5nZXRET01SdW50aW1lKCJzdXBwb3J0ZWRydW50aW1ldGVzdDEiKTsJCQ0KLQkJYXNzZXJ0Tm90TnVsbChkb21SdW50aW1lMSk7DQotCQlhc3NlcnRUcnVlKGRvbVJ1bnRpbWUxIGluc3RhbmNlb2YgVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbik7CQkNCi0JCQ0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lMiA9IHRhcmdldC5nZXRET01SdW50aW1lKCJzdXBwb3J0ZWRydW50aW1ldGVzdDIiKTsNCi0JCWFzc2VydE51bGwoZG9tUnVudGltZTIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRE9NUGFzc2VzUHJvZ3Jlc3NNb25pdG9yKCkNCi0Jew0KLQkJTXlXc0RvbVJ1bnRpbWVNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTXlXc0RvbVJ1bnRpbWVNYW5hZ2VyKCk7DQotCQlJV3NET01SdW50aW1lSW5mbyBpbmZvID0gV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8oInN1cHBvcnRlZHJ1bnRpbWV0ZXN0MSIpOw0KLQkJTnVsbFByb2dyZXNzTW9uaXRvciBucG0gPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOw0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBydEV4ID0gbWFuYWdlci5jcmVhdGVET01SdW50aW1lKGluZm8sIG5wbSk7DQotCQlhc3NlcnRUcnVlKHJ0RXggaW5zdGFuY2VvZiBUZXN0V3NET01SdW50aW1lRXh0ZW5zaW9uKTsNCi0JCWFzc2VydEVxdWFscyhucG0sICgoVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbilydEV4KS5tb25pdG9yKTsJCQ0KLQl9DQotCQ0KLQlwcml2YXRlIGNsYXNzIE15V3NEb21SdW50aW1lTWFuYWdlciBleHRlbmRzIFdzRE9NUnVudGltZU1hbmFnZXINCi0Jew0KLQkJcHJvdGVjdGVkIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gY3JlYXRlRE9NUnVudGltZShmaW5hbCBJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbywgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZURPTVJ1bnRpbWUocnVudGltZUluZm8sIG1vbml0b3IpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9Xc0RPTVJ1bnRpbWVSZWdpc3RyeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9Xc0RPTVJ1bnRpbWVSZWdpc3RyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjZmYzIyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vV3NET01SdW50aW1lUmVnaXN0cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbC5OYW1lZEV4dGVuc2lvbkluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5JV3NET01SdW50aW1lSW5mbzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LldzRE9NUnVudGltZVJlZ2lzdHJ5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBXc0RPTVJ1bnRpbWVSZWdpc3RyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVJbmZvIGV4dGVuZHMgTmFtZWRFeHRlbnNpb25JbmZvIGltcGxlbWVudHMgSVdzRE9NUnVudGltZUluZm8NCi0Jew0KLQkJcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9qZWN0RmFjZXRzOw0KLQkJDQotCQlSdW50aW1lSW5mbyhmaW5hbCBTdHJpbmcgcElkLCBmaW5hbCBTdHJpbmcgcExhYmVsLCBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9qZWN0RmFjZXRzKQ0KLQkJew0KLQkJCXN1cGVyKHBJZCwgcExhYmVsKTsNCi0JCQkNCi0JCQl0aGlzLnByb2plY3RGYWNldHMgPSBwcm9qZWN0RmFjZXRzOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRQcm9qZWN0RmFjZXRzKCkNCi0JCXsNCi0JCQlyZXR1cm4gdGhpcy5wcm9qZWN0RmFjZXRzOw0KLQkJfQ0KLSAJfQ0KLQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YW50aWF0ZVJ1bnRpbWUoKSANCi0Jew0KLQkJQ29sbGVjdGlvbjxJV3NET01SdW50aW1lSW5mbz4gcnVudGltZUluZm9zID0gV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzSW5mbygpOw0KLQkJSXRlcmF0b3I8SVdzRE9NUnVudGltZUluZm8+IHJ1bnRpbWVJbmZvSXRlciA9IHJ1bnRpbWVJbmZvcy5pdGVyYXRvcigpOw0KLQkJDQotCQl3aGlsZShydW50aW1lSW5mb0l0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlXc0RPTVJ1bnRpbWVJbmZvIHJ1bnRpbWVJbmZvID0gcnVudGltZUluZm9JdGVyLm5leHQoKTsNCi0JCQkNCi0JCQlpZihydW50aW1lSW5mby5nZXRJZCgpLmVxdWFscygic3VwcG9ydGVkcnVudGltZXRlc3QiKQ0KLQkJCQkJfHwgcnVudGltZUluZm8uZ2V0SWQoKS5lcXVhbHMoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0MSIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0Tm90TnVsbChXc0RPTVJ1bnRpbWVSZWdpc3RyeS5pbnN0YW50aWF0ZVJ1bnRpbWUocnVudGltZUluZm8pKTsNCi0JCQkJYXNzZXJ0VHJ1ZShXc0RPTVJ1bnRpbWVSZWdpc3RyeS5pbnN0YW50aWF0ZVJ1bnRpbWUocnVudGltZUluZm8pIGluc3RhbmNlb2YgVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbik7DQotCQkJfQ0KLQkJCWVsc2UgaWYocnVudGltZUluZm8uZ2V0SWQoKS5lcXVhbHMoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0MiIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0TnVsbChXc0RPTVJ1bnRpbWVSZWdpc3RyeS5pbnN0YW50aWF0ZVJ1bnRpbWUocnVudGltZUluZm8pKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuaW5zdGFudGlhdGVSdW50aW1lKG51bGwpKTsNCi0JCQ0KLQkJUnVudGltZUluZm8gaW5mbyA9IG5ldyBSdW50aW1lSW5mbygiVHN0IiwgImRkZ2ciLCBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpKTsNCi0NCi0JCWFzc2VydE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuaW5zdGFudGlhdGVSdW50aW1lKGluZm8pKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZEV4dGVuc2lvbigpIA0KLQl7DQotCQlhc3NlcnROb3ROdWxsKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmZpbmRFeHRlbnNpb24oV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzSW5mbygpLml0ZXJhdG9yKCkubmV4dCgpKSk7DQotCQlhc3NlcnROdWxsKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmZpbmRFeHRlbnNpb24obnVsbCkpOw0KLQkJDQotCQlSdW50aW1lSW5mbyBydW50aW1lSW5mbyA9IG5ldyBSdW50aW1lSW5mbygiVHN0IiwgImRkZ2ciLCBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpKTsNCi0JCWFzc2VydE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuZmluZEV4dGVuc2lvbihydW50aW1lSW5mbykpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWdpc3RlcmVkUnVudGltZUluZm8oKSANCi0Jew0KLQkJQ29sbGVjdGlvbjxJV3NET01SdW50aW1lSW5mbz4gcnVudGltZUluZm9zID0gV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzSW5mbygpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHJ1bnRpbWVJbmZvcyk7DQotCQlhc3NlcnRUcnVlKHJ1bnRpbWVJbmZvcy5zaXplKCkgPj0gMyk7DQotCQkNCi0JCUl0ZXJhdG9yPElXc0RPTVJ1bnRpbWVJbmZvPiBydW50aW1lSW5mb0l0ZXIgPSBydW50aW1lSW5mb3MuaXRlcmF0b3IoKTsNCi0JCQ0KLQkJd2hpbGUocnVudGltZUluZm9JdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbyA9IHJ1bnRpbWVJbmZvSXRlci5uZXh0KCk7DQotCQkJDQotCQkJYXNzZXJ0Tm90TnVsbChydW50aW1lSW5mby5nZXRJZCgpKTsNCi0JCQkNCi0JCQlpZihydW50aW1lSW5mby5nZXRJZCgpLmVxdWFscygic3VwcG9ydGVkcnVudGltZXRlc3QiKSkNCi0JCQl7DQotCQkJCWFzc2VydE5vdE51bGwocnVudGltZUluZm8uZ2V0TmFtZSgpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKHJ1bnRpbWVJbmZvLmdldE5hbWUoKSwgIlRlc3RpbmciKTsNCi0JCQkJDQotCQkJCWFzc2VydE5vdE51bGwocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5zaXplKCksIDIpOw0KLQkJCQkNCi0JCQkJYXNzZXJ0VHJ1ZShydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuY29udGFpbnNLZXkoImpzdC53ZWIiKSk7DQotCQkJCWFzc2VydFRydWUocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zS2V5KCJ0ZXN0LmZhY2V0IikpOw0KLQkJCQkNCi0JCQkJYXNzZXJ0RmFsc2UocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zS2V5KCJqc3Qud2ViYiIpKTsNCi0JCQkJYXNzZXJ0RmFsc2UocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zS2V5KCJ0ZXN0LmZhY2V0dCIpKTsNCi0JCQkJDQotCQkJCWFzc2VydE5vdE51bGwocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmdldCgianN0LndlYiIpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5nZXQoImpzdC53ZWIiKSwgIjEuMC4wLjAiKTsNCi0JCQkJYXNzZXJ0TnVsbChydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuZ2V0KCJ0ZXN0LmZhY2V0IikpOw0KLQkJCQkNCi0JCQkJYXNzZXJ0TnVsbChydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuZ2V0KCJkdW1teS5mYWNldCIpKTsNCi0JCQl9DQotCQkJZWxzZSBpZihydW50aW1lSW5mby5nZXRJZCgpLmVxdWFscygic3VwcG9ydGVkcnVudGltZXRlc3QxIikpDQotCQkJew0KLQkJCQlhc3NlcnROb3ROdWxsKHJ1bnRpbWVJbmZvLmdldE5hbWUoKSk7DQotCQkJCWFzc2VydEVxdWFscyhydW50aW1lSW5mby5nZXROYW1lKCksICJUZXN0aW5nMSIpOw0KLQkJCQkNCi0JCQkJYXNzZXJ0Tm90TnVsbChydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLnNpemUoKSwgMik7DQotCQkJCQ0KLQkJCQlhc3NlcnRUcnVlKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5jb250YWluc0tleSgianN0LndlYmIiKSk7DQotCQkJCWFzc2VydFRydWUocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zS2V5KCJ0ZXN0LmZhY2V0dCIpKTsNCi0JCQkJDQotCQkJCWFzc2VydEZhbHNlKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5jb250YWluc0tleSgianN0LndlYiIpKTsNCi0JCQkJYXNzZXJ0RmFsc2UocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zS2V5KCJ0ZXN0LmZhY2V0IikpOw0KLQkJCQkNCi0JCQkJYXNzZXJ0Tm90TnVsbChydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuZ2V0KCJqc3Qud2ViYiIpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5nZXQoImpzdC53ZWJiIiksICIxLjAuMC4wIik7DQotCQkJCWFzc2VydE51bGwocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmdldCgidGVzdC5mYWNldHQiKSk7DQotCQkJCQ0KLQkJCQlhc3NlcnROdWxsKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5nZXQoImR1bW15LmZhY2V0IikpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSdW50aW1lSW5mbygpDQotCXsNCi0JCWFzc2VydE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8oInRlc3QuaWQiKSk7DQotCQlhc3NlcnROb3ROdWxsKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJ1bnRpbWVJbmZvKCJzdXBwb3J0ZWRydW50aW1ldGVzdCIpKTsNCi0JCWFzc2VydE5vdE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8oInN1cHBvcnRlZHJ1bnRpbWV0ZXN0MSIpKTsNCi0JCWFzc2VydE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8obnVsbCkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Db21waWxhdGlvblVuaXRGaW5kZXJDb250cmFjdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Db21waWxhdGlvblVuaXRGaW5kZXJDb250cmFjdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWRiNGQxZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvQ29tcGlsYXRpb25Vbml0RmluZGVyQ29udHJhY3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQ29tcGlsYXRpb25Vbml0RmluZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JUHJvamVjdFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkludm9jYXRpb247DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLlN0dWI7DQotDQotLyoqDQotICogVGhlIHRlc3RzIGluIHRoaXMgY2xhc3MgbWlnaHQgYmUgZXhlY3V0ZWQgaW4gYSBkaXJ0eSB3b3Jrc3BhY2UuIFRodXMgdGhpcyBjbGFzcyBzaG91bGQgYXNzdW1lIHRoYXQgb3RoZXIgcHJvamVjdHMgYXJlIGFscmVhZHkgZXhpc3RpbmcgYW5kIGlnbm9yZSB0aGVtDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21waWxhdGlvblVuaXRGaW5kZXJDb250cmFjdFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17DQotLy8JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0RmluZGVyIHRhcmdldDsNCi0JcHJpdmF0ZSBMaXN0PElQcm9qZWN0U2VsZWN0b3I+IHByb2plY3RTZWxlY3RvcnM7DQotCQ0KLQlwcml2YXRlIElKYXZhTW9kZWwgamF2YU1vZGVsOw0KLQkNCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gZXhpc3RpbmdQcm9qZWN0c05hbWVzOw0KLQkNCi0JcHJvdGVjdGVkIElKYXZhTW9kZWwgamF2YU1vZGVsKCkgew0KLQkJcmV0dXJuIGphdmFNb2RlbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIExpc3Q8SVByb2plY3RTZWxlY3Rvcj4gcHJvamVjdFNlbGVjdG9ycygpIHsNCi0JCXJldHVybiBwcm9qZWN0U2VsZWN0b3JzOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUNvbXBpbGF0aW9uVW5pdEZpbmRlciBjcmVhdGVUYXJnZXQoKTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsNCi0JCQ0KLQkJamF2YU1vZGVsID0gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOw0KLQkJcHJvamVjdFNlbGVjdG9ycyA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RTZWxlY3Rvcj4oKTsNCi0JCWV4aXN0aW5nUHJvamVjdHNOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQkJZm9yIChJUHJvamVjdCBwcmogOiAoSVByb2plY3RbXSlqYXZhTW9kZWwuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkpDQotCQl7DQotCQkJZXhpc3RpbmdQcm9qZWN0c05hbWVzLmFkZChwcmouZ2V0TmFtZSgpKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9maW5kKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIHsNCi0JDQotCQkNCi0JCWZpbmFsIFRlc3RQcm9qZWN0IHByb2plY3QxID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQlwcm9qZWN0MS5jcmVhdGVTb3VyY2VGb2xkZXIoInNvdXJjZUZvbGRlciIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZjEgPSBwcm9qZWN0MS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QxIik7DQotCQlwcm9qZWN0MS5jcmVhdGVUeXBlKHBmMSwgIkNvbXBpbGF0aW9uVW5pdDEuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQlwcm9qZWN0MS5jcmVhdGVUeXBlKHBmMSwgIkNvbXBpbGF0aW9uVW5pdDIuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQlwcm9qZWN0MS5jcmVhdGVUeXBlKHBmMSwgIkNvbXBpbGF0aW9uVW5pdDMuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQkNCi0JCWZpbmFsIFRlc3RQcm9qZWN0IHByb2plY3QyID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQlwcm9qZWN0Mi5jcmVhdGVTb3VyY2VGb2xkZXIoInNvdXJjZUZvbGRlciIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZjIgPSBwcm9qZWN0Mi5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QxIik7DQotCQlwcm9qZWN0Mi5jcmVhdGVUeXBlKHBmMiwgIkNvbXBpbGF0aW9uVW5pdDEuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQlwcm9qZWN0Mi5jcmVhdGVUeXBlKHBmMiwgIkNvbXBpbGF0aW9uVW5pdDIuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQkNCi0JCWZpbmFsIFRlc3RQcm9qZWN0IHByb2plY3QzID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQlwcm9qZWN0My5jcmVhdGVTb3VyY2VGb2xkZXIoInNvdXJjZUZvbGRlciIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZjMgPSBwcm9qZWN0My5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QzIik7DQotCQlwcm9qZWN0My5jcmVhdGVUeXBlKHBmMywgIkNvbXBpbGF0aW9uVW5pdDEuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQlwcm9qZWN0My5jcmVhdGVUeXBlKHBmMywgIkNvbXBpbGF0aW9uVW5pdDIuamF2YSIsICJjbGFzcyBJZ25vcnJlZHt9Iik7DQotCQ0KLQkJZmluYWwgSVByb2plY3RTZWxlY3RvciBleGx1ZGVQcm9qZWN0MiA9IG5ldyBJUHJvamVjdFNlbGVjdG9yKCkgew0KLQ0KLQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikNCi0JCQl7DQotCQkJCXJldHVybiBwcmouZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMocHJvamVjdDIuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKSB8fCBleGlzdGluZ1Byb2plY3RzTmFtZXMuY29udGFpbnMocHJqLmdldEVsZW1lbnROYW1lKCkpPyBmYWxzZSA6IHRydWU7DQotCQkJfQ0KLQkJCQ0KLQkJfTsNCi0JCQ0KLQkJZmluYWwgSVByb2plY3RTZWxlY3RvciBhZGRtaXRBbGxfZXhjZXB0UHJvamVjdDIgPSBuZXcgSVByb2plY3RTZWxlY3RvcigpIHsNCi0JCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopDQotCQkJew0KLQkJCQlyZXR1cm4gcHJqLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHByb2plY3QyLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkgfHwgZXhpc3RpbmdQcm9qZWN0c05hbWVzLmNvbnRhaW5zKHByai5nZXRFbGVtZW50TmFtZSgpKSA/IGZhbHNlIDogdHJ1ZTsNCi0JCQl9DQotCQl9Ow0KLQkJDQotCQlwcm9qZWN0U2VsZWN0b3JzKCkuYWRkKGV4bHVkZVByb2plY3QyKTsNCi0JCXByb2plY3RTZWxlY3RvcnMoKS5hZGQoYWRkbWl0QWxsX2V4Y2VwdFByb2plY3QyKTsNCi0NCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXRGaW5kZXIgdGFyZ2V0ID0gY3JlYXRlVGFyZ2V0KCk7DQotCQkJDQotCQkNCi0JCWZpbmFsIE1vY2s8SUNvbXBpbGF0aW9uVW5pdEhhbmRsZXI+IG1vY2tDVUhhbmRsZXIgPSBtb2NrKElDb21waWxhdGlvblVuaXRIYW5kbGVyLmNsYXNzKTsNCi0JCQ0KLQkJZmluYWwgU3R1YiBjb25maWd1cmVFeHBlY3RhdGlvbnMgPSBuZXcgU3R1YigpIA0KLQkJew0KLQ0KLQkJCXB1YmxpYyBPYmplY3QgaW52b2tlKEludm9jYXRpb24gYXJnMCkgdGhyb3dzIFRocm93YWJsZQ0KLQkJCXsNCi0JCQkJbW9ja0NVSGFuZGxlci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJoYW5kbGUiKS53aXRoKHByb2plY3ROYW1lZChwcm9qZWN0MS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpKS5pZCgiY3VDYWxsMSIpOw0KLQkJCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImhhbmRsZSIpLndpdGgoY3VOYW1lZChwZjEuZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21waWxhdGlvblVuaXQxLmphdmEiKS5nZXRQYXRoKCkudG9PU1N0cmluZygpKSkuYWZ0ZXIoImN1Q2FsbDEiKS5pZCgiY3VDYWxsMiIpOw0KLQkJCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImhhbmRsZSIpLndpdGgoY3VOYW1lZChwZjEuZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21waWxhdGlvblVuaXQyLmphdmEiKS5nZXRQYXRoKCkudG9PU1N0cmluZygpKSkuYWZ0ZXIoImN1Q2FsbDEiKS5pZCgiY3VDYWxsMyIpOw0KLQkJCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImhhbmRsZSIpLndpdGgoY3VOYW1lZChwZjEuZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21waWxhdGlvblVuaXQzLmphdmEiKS5nZXRQYXRoKCkudG9PU1N0cmluZygpKSkuYWZ0ZXIoImN1Q2FsbDEiKS5pZCgiY3VDYWxsNCIpOw0KLQkJCQkNCi0JCQkJbW9ja0NVSGFuZGxlci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJoYW5kbGUiKS53aXRoKHByb2plY3ROYW1lZChwcm9qZWN0My5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpKS5pZCgiY3VDYWxsNSIpOw0KLQkJCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImhhbmRsZSIpLndpdGgoY3VOYW1lZChwZjMuZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21waWxhdGlvblVuaXQxLmphdmEiKS5nZXRQYXRoKCkudG9PU1N0cmluZygpKSkuYWZ0ZXIoImN1Q2FsbDUiKS5pZCgiY3VDYWxsNiIpOw0KLQkJCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImhhbmRsZSIpLndpdGgoY3VOYW1lZChwZjMuZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21waWxhdGlvblVuaXQyLmphdmEiKS5nZXRQYXRoKCkudG9PU1N0cmluZygpKSkuYWZ0ZXIoImN1Q2FsbDUiKS5pZCgiY3VDYWxsNyIpOw0KLQkJCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImZpbmlzaGVkIikud2l0aE5vQXJndW1lbnRzKCkuYWZ0ZXIoImN1Q2FsbDEiKS5hZnRlcigiY3VDYWxsMiIpLmFmdGVyKCJjdUNhbGwzIikuYWZ0ZXIoImN1Q2FsbDQiKS5hZnRlcigiY3VDYWxsNSIpLmFmdGVyKCJjdUNhbGw2IikuYWZ0ZXIoImN1Q2FsbDciKTsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyBTdHJpbmdCdWZmZXIgZGVzY3JpYmVUbyhTdHJpbmdCdWZmZXIgYXJnMCkNCi0JCQl7DQotCQkJCXJldHVybiBhcmcwLmFwcGVuZCgiQ29uZmlndXJlIGV4cGVjdGF0aW9ucyBhZnRlciBzdGFydCBpcyBpbnZva2VkIik7DQotCQkJfQ0KLQkJCQ0KLQkJfTsNCi0JCW1vY2tDVUhhbmRsZXIuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgic3RhcnRlZCIpLndpdGhOb0FyZ3VtZW50cygpLndpbGwoY29uZmlndXJlRXhwZWN0YXRpb25zKTsNCi0JCXRhcmdldC5maW5kKG51bGwsIG1vY2tDVUhhbmRsZXIucHJveHkoKSk7DQotCX0NCi0JDQotCXByaXZhdGUgQ29uc3RyYWludCBwcm9qZWN0TmFtZWQoZmluYWwgU3RyaW5nIHByak5hbWUpIHsNCi0JCXJldHVybiBuZXcgQ29uc3RyYWludCgpIHsNCi0JCQlwdWJsaWMgU3RyaW5nQnVmZmVyIGRlc2NyaWJlVG8oU3RyaW5nQnVmZmVyIGFyZzApDQotCQkJew0KLQkJCQlyZXR1cm4gYXJnMC5hcHBlbmQocHJqTmFtZSk7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyBib29sZWFuIGV2YWwoT2JqZWN0IGFyZzApDQotCQkJew0KLQkJCQlpZiAoIShhcmcwIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotCQkJCWZpbmFsIElKYXZhUHJvamVjdCBjYXN0ID0gKElKYXZhUHJvamVjdClhcmcwOw0KLQkJCQlyZXR1cm4gcHJqTmFtZS5lcXVhbHMoY2FzdC5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQl9DQotCQl9Ow0KLQl9DQotCQ0KLQlwcml2YXRlIENvbnN0cmFpbnQgY3VOYW1lZChmaW5hbCBTdHJpbmcgY3VOYW1lKSB7DQotCQlyZXR1cm4gbmV3IENvbnN0cmFpbnQoKSB7DQotCQkJcHVibGljIFN0cmluZ0J1ZmZlciBkZXNjcmliZVRvKFN0cmluZ0J1ZmZlciBhcmcwKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGFyZzAuYXBwZW5kKGN1TmFtZSk7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyBib29sZWFuIGV2YWwoT2JqZWN0IGFyZzApDQotCQkJew0KLQkJCQlpZiAoIShhcmcwIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkpDQotCQkJCXsNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJfQ0KLQkJCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGNhc3QgPSAoSUNvbXBpbGF0aW9uVW5pdClhcmcwOw0KLQkJCQlyZXR1cm4gY3VOYW1lLmVxdWFscyhjYXN0LmdldFBhdGgoKS50b09TU3RyaW5nKCkpOw0KLQkJCX0NCi0JCX07DQotCQkJDQotCX0NCi0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Eb21UZXN0VXRpbHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Eb21UZXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWIzNTdmZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvRG9tVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRmlsZVV0aWxzOwotCi1wdWJsaWMgY2xhc3MgRG9tVGVzdFV0aWxzCi17Ci0JcHVibGljIElNZXRob2QgZ2V0RXhpc3RpbmdNZXRob2QoSVR5cGUgdHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZy4uLiBhcmdzKQotCXsKLQkJZmluYWwgSU1ldGhvZCBtID0gdHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwgYXJncyk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKG0uZXhpc3RzKCkpOwotCQlyZXR1cm4gbTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50cyhmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1LCBmaW5hbCBTdHJpbmcgY29udGVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBTdHJpbmcgY29udGVudFRvU2V0ID0gInBhY2thZ2UgIitjdS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpKyI7XG4iK2NvbnRlbnRzOwotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgc2V0Q29udGVudHNSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCUZpbGVVdGlscy5nZXRJbnN0YW5jZSgpLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoY3UsIGNvbnRlbnRUb1NldCwgdHJ1ZSwgbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUoc2V0Q29udGVudHNSdW5uYWJsZSk7Ci0JfQotCQotCXB1YmxpYyBJV2ViUGFyYW0gZmluZFBhcmFtKGZpbmFsIElXZWJNZXRob2QgbWV0aG9kLCBmaW5hbCBTdHJpbmcgaW1wbE5hbWUpIAotCXsKLQkJZm9yIChJV2ViUGFyYW0gcGFyYW0gOiBtZXRob2QuZ2V0UGFyYW1ldGVycygpKSB7Ci0JCQlpZiAocGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbE5hbWUpKSB7Ci0JCQkJcmV0dXJuIHBhcmFtOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCQotCXB1YmxpYyBJV2ViTWV0aG9kIGZpbmRXZWJNZXRob2RCeU5hbWUoZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIFN0cmluZyBuYW1lKSAKLQl7Ci0JCWZvciAoSVdlYk1ldGhvZCB3ZWJNZXRob2QgOiBzZWkuZ2V0V2ViTWV0aG9kcygpKSB7Ci0JCQlpZih3ZWJNZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiB3ZWJNZXRob2Q7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0JCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxM2VlN2JhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3JUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9OQU1FID0gIm1ldGhvZCI7DQotCQ0KLQlwcml2YXRlIE1vY2s8SVdlYk1ldGhvZD4gd2ViTWV0aG9kOw0KLQlwcml2YXRlIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIGRlZkNhbGMgPSBuZXcgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IoKTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCXdlYk1ldGhvZCA9IG1vY2soSVdlYk1ldGhvZC5jbGFzcyk7DQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQpKTsNCi0JCXdlYk1ldGhvZC5zdHVicygpLm1ldGhvZCgiZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIpLndpbGwocmV0dXJuVmFsdWUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFKSk7DQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKE1FVEhPRF9OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REZWZpbmVTQlN0eWxlRGVmYXVsdFZhbHVlKCkgDQotCXsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5ULCBkZWZDYWxjLmRlZmluZVNCU3R5bGUobnVsbCkpOw0KLQ0KLQkJTW9jazxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubiA9IG1vY2soSUFubm90YXRpb24uY2xhc3MpOw0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZShudWxsKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCwgZGVmQ2FsYy5kZWZpbmVTQlN0eWxlKGFubi5wcm94eSgpKSk7DQotCQkNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIlN0eWxlLkRPQ1VNRU5UIikpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQsIGRlZkNhbGMuZGVmaW5lU0JTdHlsZShhbm4ucHJveHkoKSkpOw0KLQkJDQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5ULCBkZWZDYWxjLmRlZmluZVNCU3R5bGUoYW5uLnByb3h5KCkpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU0JTdHlsZSgpIA0KLQl7DQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJTdHlsZS5SUEMiKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5SUEMsIGRlZkNhbGMuZGVmaW5lU0JTdHlsZShhbm4ucHJveHkoKSkpOw0KLQ0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiU09BUEJpbmRpbmcuU3R5bGUuUlBDIikpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuUlBDLCBkZWZDYWxjLmRlZmluZVNCU3R5bGUoYW5uLnByb3h5KCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERlZmluZVNCVXNlRGVmYXVsdFZhbHVlKCkgDQotCXsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5MSVRFUkFMLCBkZWZDYWxjLmRlZmluZVNCVXNlKG51bGwpKTsNCi0NCi0JCU1vY2s8SUFubm90YXRpb248SVR5cGU+PiBhbm4gPSBtb2NrKElBbm5vdGF0aW9uLmNsYXNzKTsNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwsIGRlZkNhbGMuZGVmaW5lU0JVc2UoYW5uLnByb3h5KCkpKTsNCi0JCQ0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiU3R5bGUuTElURVJBTCIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5MSVRFUkFMLCBkZWZDYWxjLmRlZmluZVNCVXNlKGFubi5wcm94eSgpKSk7DQotCQkNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIlNPQVBCaW5kaW5nLlN0eWxlLkxJVEVSQUwiKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuTElURVJBTCwgZGVmQ2FsYy5kZWZpbmVTQlVzZShhbm4ucHJveHkoKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU0JVc2UoKQ0KLQl7DQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJVc2UuRU5DT0RFRCIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5FTkNPREVELCBkZWZDYWxjLmRlZmluZVNCVXNlKGFubi5wcm94eSgpKSk7DQotDQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJTT0FQQmluZGluZy5Vc2UuRU5DT0RFRCIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5FTkNPREVELCBkZWZDYWxjLmRlZmluZVNCVXNlKGFubi5wcm94eSgpKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdERlZmluZVNCUGFyYW1ldGVyU3R5bGVEZWZhdWx0VmFsdWUoKSANCi0Jew0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCwgZGVmQ2FsYy5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKG51bGwpKTsNCi0NCi0JCU1vY2s8SUFubm90YXRpb248SVR5cGU+PiBhbm4gPSBtb2NrKElBbm5vdGF0aW9uLmNsYXNzKTsNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCwgZGVmQ2FsYy5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKGFubi5wcm94eSgpKSk7DQotCQkNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIlBhcmFtZXRlclN0eWxlLldSQVBQRUQiKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVELCBkZWZDYWxjLmRlZmluZVNCUGFyYW1ldGVyU3R5bGUoYW5uLnByb3h5KCkpKTsNCi0JCQ0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQsIGRlZkNhbGMuZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShhbm4ucHJveHkoKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU0JQYXJhbWV0ZXJTdHlsZSgpIA0KLQl7DQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJQYXJhbWV0ZXJTdHlsZS5CQVJFIikpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSwgZGVmQ2FsYy5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKGFubi5wcm94eSgpKSk7DQotDQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFIikpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSwgZGVmQ2FsYy5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKGFubi5wcm94eSgpKSk7CQ0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENhbGNXZWJQYXJhbURlZmF1bHROYW1lKCkgDQotCXsNCi0JCWFzc2VydEVxdWFscyhNRVRIT0RfTkFNRSwgZGVmQ2FsYy5jYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJNZXRob2QucHJveHkoKSwgMCkpOw0KLQkJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKSk7DQotCQlhc3NlcnRFcXVhbHMoImFyZzAiLCBkZWZDYWxjLmNhbGNXZWJQYXJhbURlZmF1bHROYW1lKHdlYk1ldGhvZC5wcm94eSgpLCAwKSk7DQotCQkNCi0JCXdlYk1ldGhvZC5zdHVicygpLm1ldGhvZCgiZ2V0U29hcEJpbmRpbmdTdHlsZSIpLndpbGwocmV0dXJuVmFsdWUoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCkpOw0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQpKTsNCi0JCWFzc2VydEVxdWFscygiYXJnMSIsIGRlZkNhbGMuY2FsY1dlYlBhcmFtRGVmYXVsdE5hbWUod2ViTWV0aG9kLnByb3h5KCksIDEpKTsJCQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDYWxjV2ViUGFyYW1EZWZhdWx0VGFyZ2V0TlMoKSANCi0Jew0KLQkJTW9jazxJV2ViUGFyYW0+IHdlYlBhcmFtID0gbW9jayhJV2ViUGFyYW0uY2xhc3MpOw0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQpKTsJCQ0KLQkJd2ViUGFyYW0uc3R1YnMoKS5tZXRob2QoImlzSGVhZGVyIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJDQotCQlNb2NrPElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IHNlaSA9IG1vY2soSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcyk7DQotCQlzZWkuc3R1YnMoKS5tZXRob2QoImdldFRhcmdldE5hbWVzcGFjZSIpLndpbGwocmV0dXJuVmFsdWUoImh0dHA6Ly9jb20uc2FwLnRlc3QiKSk7CQkNCi0JCXdlYk1ldGhvZC5zdHVicygpLm1ldGhvZCgiZUNvbnRhaW5lciIpLndpbGwocmV0dXJuVmFsdWUoc2VpLnByb3h5KCkpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCIiLCBkZWZDYWxjLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyh3ZWJNZXRob2QucHJveHkoKSwgd2ViUGFyYW0ucHJveHkoKSkpOw0KLQ0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1N0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1N0eWxlLlJQQykpOwkJDQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly9jb20uc2FwLnRlc3QiLCBkZWZDYWxjLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyh3ZWJNZXRob2QucHJveHkoKSwgd2ViUGFyYW0ucHJveHkoKSkpOw0KLQkJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQpKTsJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSkpOwkJDQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly9jb20uc2FwLnRlc3QiLCBkZWZDYWxjLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyh3ZWJNZXRob2QucHJveHkoKSwgd2ViUGFyYW0ucHJveHkoKSkpOw0KLQkJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQpKTsJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCkpOw0KLQkJd2ViUGFyYW0uc3R1YnMoKS5tZXRob2QoImlzSGVhZGVyIikud2lsbChyZXR1cm5WYWx1ZSh0cnVlKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscygiaHR0cDovL2NvbS5zYXAudGVzdCIsIGRlZkNhbGMuY2FsY1dlYlBhcmFtRGVmYXVsdFRhcmdldE5TKHdlYk1ldGhvZC5wcm94eSgpLCB3ZWJQYXJhbS5wcm94eSgpKSk7CQkNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FsY1dlYlJlc3VsdERlZmF1bHROYW1lKCkgDQotCXsNCi0JCWFzc2VydEVxdWFscyhNRVRIT0RfTkFNRSArICJSZXNwb25zZSIsIGRlZkNhbGMuY2FsY1dlYlJlc3VsdERlZmF1bHROYW1lKHdlYk1ldGhvZC5wcm94eSgpKSk7DQotCQkNCi0JCXdlYk1ldGhvZC5zdHVicygpLm1ldGhvZCgiZ2V0U29hcEJpbmRpbmdTdHlsZSIpLndpbGwocmV0dXJuVmFsdWUoU09BUEJpbmRpbmdTdHlsZS5SUEMpKTsNCi0JCWFzc2VydEVxdWFscygicmV0dXJuIiwgZGVmQ2FsYy5jYWxjV2ViUmVzdWx0RGVmYXVsdE5hbWUod2ViTWV0aG9kLnByb3h5KCkpKTsNCi0JCQ0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1N0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKSk7DQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCBkZWZDYWxjLmNhbGNXZWJSZXN1bHREZWZhdWx0TmFtZSh3ZWJNZXRob2QucHJveHkoKSkpOwkJCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9KYXhXc1dvcmtzcGFjZVJlc291cmNlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9KYXhXc1dvcmtzcGFjZVJlc291cmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODU4YjYzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NEb21Mb2FkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklQcm9qZWN0U2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0OwotLyoqCi0gKiBUaGlzIHRlc3QgbWlnaHQgYmUgZXhlY3V0ZWQgaW4gbm9uLWNsZWFuIHdvcmtzcGFjZS4gVGh1cyBpdCBzaG91bGQgdHJ5IHRvIGlnbm9yZSBhbnkgZXhpc3RpbmcgcHJvamVjdHMgYW5kIHdvcmsgd2l0aCB0aGUgdGVzdCBwcm9lamN0cyBpdCBjcmVhdGVzLgotICogQGF1dGhvciBIcmlzdG8gU2FiZXYKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXhXc1dvcmtzcGFjZVJlc291cmNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXByaXZhdGUgVGVzdFByb2plY3QgdGVzdFByb2plY3Q7Ci0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IHBmOwotCXByaXZhdGUgSUphdmFNb2RlbCBqYXZhTW9kZWw7Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGVzdFByb2plY3QgPSBuZXcgVGVzdFByb2plY3QoKTsKLQkJdGVzdFByb2plY3QuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsKLQkJcGYgPSB0ZXN0UHJvamVjdC5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3Quc21va2UiKTsKLQkJamF2YU1vZGVsID0gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IGEgc2ltcGxlIHByb2plY3Qgd2l0aCBvbmUgd2ViIHNlcnZpY2UgY2xhc3MgYW5kIG9uZSBzZWkgY2FuIGJlIHBhcnNlZAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9TbW9rZV9PbmVXc0FuZE9uZVNlaSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCXsKLQkJdGVzdFByb2plY3QuY3JlYXRlVHlwZShwZiwgIlNlaTEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGludGVyZmFjZSBTZWkxIHt9Iik7Ci0JCXRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUocGYsICJXZWJTZXJ2aWNlMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5zbW9rZS5TZWkxXCIpIHB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlMXt9Iik7Ci0JCWZpbmFsIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0ID0gY3JlYXRlSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSh0ZXN0UHJvamVjdCk7Ci0JCXRhcmdldC5sb2FkKG51bGwpOwotCQkKLQkJLy9maW5kIHRoZSB0ZXN0IHByb2plY3QgYW5kIHdvcmsgb25seSB3aXRoIGl0LiBpZ25vcmUgYW55IG90aGVyIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UKLQkJZmluYWwgTGlzdDxJV2ViU2VydmljZVByb2plY3Q+IHByb2plY3RzID0gdGFyZ2V0LmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpOwotCQlJV2ViU2VydmljZVByb2plY3QgdGVzdFdzUHJvamVjdCA9IG51bGw7Ci0JCWZvciAoSVdlYlNlcnZpY2VQcm9qZWN0IGFQcm9qZWN0IDogcHJvamVjdHMpCi0JCXsKLQkJCWlmIChhUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHRlc3RQcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkpCi0JCQl7Ci0JCQkJdGVzdFdzUHJvamVjdCA9IGFQcm9qZWN0OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICh0ZXN0V3NQcm9qZWN0ID09IG51bGwpCi0JCXsKLQkJCWZhaWwoIldlYlNlcnZpY2VQcm9qZWN0IHdpdCBuYW1lICIgKyB0ZXN0UHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkgKyAiaXMgbm90IGZvdW5kIGluIHRoZSBtb2RlbCIpOwotCQl9Ci0JCQotCQlmaW5hbCBMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IHNlaXMgPSB0ZXN0V3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9yZSB0aGFuIDEgc2VpIGZvdW5kIGluIHRoZSBtb2RlbCwgd2hpbGUgb25seSBvbmUgdGVzdCBzZWkgd2FzIHVzZWQiLCBzZWlzLnNpemUoKSA9PSAxKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgc2VpIGluIHRoZSBtb2RlbCBpcyB3aXRoIGRpZmZlcmVudCBuYW1lIiwgIlNlaTEiLCBzZWlzLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBzZWkgaW4gdGhlIG1vZGVsIGlzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIiwgImNvbS5zYXAudGVzdC5zbW9rZS5TZWkxIiwgc2Vpcy5nZXQoMCkuZ2V0SW1wbGVtZW50YXRpb24oKSk7Ci0JCWZpbmFsIExpc3Q8SVdlYlNlcnZpY2U+IHdlYlNlcnZpY2VzID0gdGVzdFdzUHJvamVjdC5nZXRXZWJTZXJ2aWNlcygpOwotCQlhc3NlcnRUcnVlKCJNb3JlIHRoYW4gMSB3ZWIgc2VydmljZSBmb3VuZCBpbiB0aGUgbW9kZWwsIHdoaWxlIG9ubHkgb25lIHRlc3Qgd2ViIHNlcnZpY2Ugd2FzIHVzZWQiLCB3ZWJTZXJ2aWNlcy5zaXplKCkgPT0gMSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHdlYiBzZXJ2aWNlIGluIHRoZSBtb2RlbCBpcyB3aXRoIGRpZmZlcmVudCBuYW1lIiwgIldlYlNlcnZpY2UxU2VydmljZSIsIHdlYlNlcnZpY2VzLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB3ZWIgc2VydmljZSBpbiB0aGUgbW9kZWwgaXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24iLCAiY29tLnNhcC50ZXN0LnNtb2tlLldlYlNlcnZpY2UxIiwgd2ViU2VydmljZXMuZ2V0KDApLmdldEltcGxlbWVudGF0aW9uKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VydmljZSBlbmRwb2ludCBmb3VuZCBpbiB0aGUgbW9kZWwgaXMgbm90IHRoZSBzYW1lIGluc3RhbmNlIGFzIHRoZSBzZWkgb2YgdGhlIHdlYiBzZXJ2aWNlIiwgd2ViU2VydmljZXMuZ2V0KDApLmdldFNlcnZpY2VFbmRwb2ludCgpLCBzZWlzLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfRG9tTG9hZGVkRm9yTm9Qcm9jZXNzZWRQcm9qZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXQgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwpIAotCQl7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIElQcm9qZWN0U2VsZWN0b3JbXSBnZXRQcm9qZWN0U2VsZWN0b3JzKCkKLQkJCXsKLQkJCQlyZXR1cm4gbmV3IElQcm9qZWN0U2VsZWN0b3JbXSB7IG5ldyBJUHJvamVjdFNlbGVjdG9yKCkgCi0JCQkJewotCi0JCQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikKLQkJCQkJewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfX07Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJdGFyZ2V0LmxvYWQobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGFyZ2V0LmdldERPTSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhcmdldC5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5zaXplKCkpOwotCX0KLQkKLQlwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgY3JlYXRlSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShmaW5hbCBUZXN0UHJvamVjdCB0ZXN0UHJvamVjdCkKLQl7Ci0JCXJldHVybiBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwpIAotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJUHJvamVjdFNlbGVjdG9yW10gZ2V0UHJvamVjdFNlbGVjdG9ycygpIAotCQkJewotCQkJCXJldHVybiBuZXcgSVByb2plY3RTZWxlY3RvcltdIHtuZXcgSVByb2plY3RTZWxlY3RvcigpCi0JCQkJewotCQkJCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopIHsKLQkJCQkJCXJldHVybiBwcmouZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModGVzdFByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCQkJfQotCQkJCX19OwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgY2xhc3MgTG9hZExpc3RlbmVyIGltcGxlbWVudHMgSVdzRG9tTG9hZExpc3RlbmVyCi0JewotCQlib29sZWFuIHN0YXJ0Q2FsbGVkOwotCQlib29sZWFuIGZpbmlzaGVkQ2FsbGVkOwotCQkKLQkJcHVibGljIHZvaWQgZmluaXNoZWQoKSB7Ci0JCQlmaW5pc2hlZENhbGxlZCA9IHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydGVkKCkgewotCQkJc3RhcnRDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL0plZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDIwYmFmMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NEb21Mb2FkTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5JV2FpdENvbmRpdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLkFzc2VydGlvbnM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotDQotLyoqDQotICogVGVzdHMgZm9yIEplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb25UZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBKZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uIGV4dGVuc2lvbjsNCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlleHRlbnNpb24gPSBuZXcgSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbigpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RE9NQ3JlYXRlTm90Q2FsbGVkKCkgdGhyb3dzIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIA0KLQl7DQotCQlhc3NlcnROdWxsKGV4dGVuc2lvbi5nZXRET00oKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdExvYWRMaXN0ZW5lclN0YXJ0RmluaXNoQ2FsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgTW9jazxJV3NEb21Mb2FkTGlzdGVuZXI+IGxvYWRMaXN0ZW5lck1vY2sgPSBtb2NrKElXc0RvbUxvYWRMaXN0ZW5lci5jbGFzcyk7DQotCQlsb2FkTGlzdGVuZXJNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoInN0YXJ0ZWQiKTsNCi0JCWxvYWRMaXN0ZW5lck1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZmluaXNoZWQiKTsNCi0JCQ0KLQkJZXh0ZW5zaW9uLmFkZExvYWRMaXN0ZW5lcihsb2FkTGlzdGVuZXJNb2NrLnByb3h5KCkpOw0KLQkJZXh0ZW5zaW9uLmNyZWF0ZURPTShudWxsKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTG9hZExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVdzRG9tTG9hZExpc3RlbmVyIGxvYWRMaXN0ZW5lciA9IChJV3NEb21Mb2FkTGlzdGVuZXIpIG1vY2soSVdzRG9tTG9hZExpc3RlbmVyLmNsYXNzKS5wcm94eSgpOw0KLQkJZXh0ZW5zaW9uLmFkZExvYWRMaXN0ZW5lcihsb2FkTGlzdGVuZXIpOw0KLQkJZXh0ZW5zaW9uLnJlbW92ZUxvYWRMaXN0ZW5lcihsb2FkTGlzdGVuZXIpOw0KLQkJZXh0ZW5zaW9uLmNyZWF0ZURPTShudWxsKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdExvYWRDYW5jZWxlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCi0JCW1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7DQotCQkNCi0JCWZpbmFsIE1vY2s8SVdzRG9tTG9hZExpc3RlbmVyPiBsb2FkTGlzdGVuZXJNb2NrID0gbW9jayhJV3NEb21Mb2FkTGlzdGVuZXIuY2xhc3MpOw0KLQkJbG9hZExpc3RlbmVyTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJzdGFydGVkIik7DQotCQlsb2FkTGlzdGVuZXJNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImZpbmlzaGVkIik7DQotCQlleHRlbnNpb24gPSBuZXcgSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbigpIHsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpIHsgDQotCQkJCXJldHVybiBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwoKSkgew0KLQkJCQkJQE92ZXJyaWRlDQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDbmFjZWxlZCgpIHsNCi0JCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJCX0NCi0JCQkJCUBPdmVycmlkZQ0KLQkJCQkJcHVibGljIHZvaWQgc3RhcnRTeW5jaHJvbml6aW5nKCkgew0KLQkJCQkJCWZhaWwoInN0YXJ0U3luY2hyb25pemluZyBzaG91bGQgbm90IGJlIGNhbGxlZCBpbiB0aGlzIGNhc2UiKTsNCi0JCQkJCX0NCi0JCQkJfTsNCi0JCQl9DQotCQl9Ow0KLQkJZXh0ZW5zaW9uLmFkZExvYWRMaXN0ZW5lcihsb2FkTGlzdGVuZXJNb2NrLnByb3h5KCkpOw0KLQkJdHJ5IHsNCi0JCQlleHRlbnNpb24uY3JlYXRlRE9NKG1vbml0b3IpOwkJDQotCQkJZmFpbCgiV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gbm90IHRocm93biBheiBleHBlY3RlZCIpOw0KLQkJfSBjYXRjaCAoV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gXykgew0KLQkJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhcnRTeW5jaHJvbml6aW5nQ2FsbGVkSWZMb2FkTm90Q2FuY2VsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCWZpbmFsIGJvb2xlYW5bXSBzdGFydFN5bmNDYWxsZWQgPSB7IGZhbHNlIH07DQotCQlleHRlbnNpb24gPSBuZXcgSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbigpIHsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpIHsgDQotCQkJCXJldHVybiBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwoKSkgew0KLQkJCQkJQE92ZXJyaWRlDQotCQkJCQlwdWJsaWMgdm9pZCBzdGFydFN5bmNocm9uaXppbmcoKSB7DQotCQkJCQkJc3RhcnRTeW5jQ2FsbGVkWzBdID0gdHJ1ZTsNCi0JCQkJCX0NCi0JCQkJfTsNCi0JCQl9DQotCQl9Ow0KLQkJZXh0ZW5zaW9uLmNyZWF0ZURPTShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JCWFzc2VydFRydWUoIlN0YXJ0IHN5bmNyb25pemF0aW9uIHdhcyBub3Qgc3RhcnRlZCBldmVuIHRoZSBsb2FkIHdhc2Egbm90IGNhbmNlbGVkIiwgc3RhcnRTeW5jQ2FsbGVkWzBdKTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVET01CbG9ja3NXaGVuQ2FsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgYm9vbGVhbltdIGRvTG9hZFN0YXJ0ZWQgPSB7IGZhbHNlIH07DQotCQlmaW5hbCBib29sZWFuW10gZG9Mb2FkRmluaXNoZWQgPSB7IGZhbHNlIH07DQotCQlleHRlbnNpb24gPSBuZXcgSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbigpIHsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpIHsgDQotCQkJCXJldHVybiBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwoKSkgew0KLQkJCQkJQE92ZXJyaWRlDQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0xvYWQoZmluYWwgTWFwPD8sID8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQkJCQkJZG9Mb2FkU3RhcnRlZFswXSA9IHRydWU7DQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJVGhyZWFkLnNsZWVwKDQwMCk7DQotCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLQkJCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOw0KLQkJCQkJCX0NCi0JCQkJCQlzdXBlci5kb0xvYWQob3B0aW9ucyk7DQotCQkJCQkJZG9Mb2FkRmluaXNoZWRbMF0gPSB0cnVlOw0KLQkJCQkJfQ0KLQkJCQl9Ow0KLQkJCX0NCi0JCX07DQotCQluZXcgVGhyZWFkKCl7DQotCQkJQE92ZXJyaWRlDQotCQkgICAgcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQl0cnkgew0KLQkJCQkJZXh0ZW5zaW9uLmNyZWF0ZURPTShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7DQotCQkJCX0gY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsNCi0JCQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOw0KLQkJCQl9DQotCQkgICAgfQ0KLQkJfS5zdGFydCgpOw0KLQkJQXNzZXJ0aW9ucy53YWl0QXNzZXJ0KG5ldyBJV2FpdENvbmRpdGlvbigpIHtwdWJsaWMgYm9vbGVhbiBjaGVja0NvbmRpdGlvbigpIHsNCi0JCQlyZXR1cm4gZG9Mb2FkU3RhcnRlZFswXTsNCi0JCX19LCAiTG9hZGluZyBmcm9tIGFub3RoZXIgdGhyZWFkIG5vdCBzdGFydGVkIik7DQotCQkNCi0JCWV4dGVuc2lvbi5jcmVhdGVET00obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCQlhc3NlcnRUcnVlKCJTdGFydCBzeW5jcm9uaXphdGlvbiB3YXMgbm90IHN0YXJ0ZWQgZXZlbiB0aGUgbG9hZCB3YXMgbm90IGNhbmNlbGVkIiwgZG9Mb2FkRmluaXNoZWRbMF0pOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Qcm9qZWN0QWRkaW5nVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Qcm9qZWN0QWRkaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGU5ODBlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvUHJvamVjdEFkZGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RFamIzUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOw0KLQ0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0QWRkaW5nVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotCQ0KLQlwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0Ow0KLQlwcml2YXRlIElKYXZhTW9kZWwgamF2YU1vZGVsOw0KLQlwcml2YXRlIERvbVV0aWwgdXRpbDsNCi0JcHJpdmF0ZSBUZXN0UHJvamVjdCB0ZXN0UHJqMzs7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJdXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCQlqYXZhTW9kZWwgPSBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7DQotCQl0YXJnZXQgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwpOw0KLQkJdGFyZ2V0LmxvYWQobnVsbCk7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQkNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0b3BTeW5jaHJvbml6aW5nKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfbmV3V3NQcm9qZWN0U3luY2hlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGVzdFByajMgPSBuZXcgVGVzdFByb2plY3QobmV3IFRlc3RFamIzUHJvamVjdCgiVGVzdEVKQlByb2plY3QzIikuZ2V0UHJvamVjdCgpKTsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByajMgPSB1dGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajMuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKCJOZXdseSBhZGRlZCBwcm9qZWN0IG5vdCBpbiBkb20iLHdzUHJqMyk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfbmV3Tm9uV3NQcm9qZWN0Tm90QWRkZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRlc3RQcmozID0gbmV3IFRlc3RQcm9qZWN0KCJUZXN0UHJvamVjdDMiKTsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByajMgPSB1dGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajMuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQlhc3NlcnROdWxsKCJOZXdseSBhZGRlZCBwcm9qZWN0IGluIGRvbSIsd3NQcmozKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9Ob25Xc1Byb2plY3RJZ25vcnJlZFdoZW5DbG9zZWRPclJlbW92ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0ZXN0UHJqMyA9IG5ldyBUZXN0UHJvamVjdCgiVGVzdFByb2plY3QzIik7DQotCQl0ZXN0UHJqMy5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZiA9IHRlc3RQcmozLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5ub253c3Byb2plY3QiKTsNCi0JCWZpbmFsIElUeXBlIHR5cGUgPSB0ZXN0UHJqMy5jcmVhdGVUeXBlKHBmLCAiU29tZUNsYXNzLmphdmEiLCAicHVibGljIGNsYXNzIFNvbWVDbGFzcyB7fSIpOw0KLQkJZmluYWwgSUZpbGUgZmlsZSA9IHRlc3RQcmozLmdldEphdmFQcm9qZWN0KCkuZ2V0SmF2YU1vZGVsKCkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUodHlwZS5nZXRQYXRoKCkpOw0KLQkJSURFLm9wZW5FZGl0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCksIGZpbGUpOw0KLQkJdGVzdFByajMuZ2V0UHJvamVjdCgpLmNsb3NlKG51bGwpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X29wZW5lZE5vbldzUHJvamVjdE5vdEFkZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0ZXN0UHJqMyA9IG5ldyBUZXN0UHJvamVjdCgiVGVzdEVKQlByb2plY3QzIik7DQotCQl0ZXN0UHJqMy5nZXRQcm9qZWN0KCkuY2xvc2UobnVsbCk7DQotCQl0ZXN0UHJqMy5nZXRQcm9qZWN0KCkub3BlbihudWxsKTsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByajMgPSB1dGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajMuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQlhc3NlcnROdWxsKCJOZXdseSBhZGRlZCBwcm9qZWN0IG5vdCBpbiBkb20iLHdzUHJqMyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL1dvcmtzcGFjZUNVRmluZGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL1dvcmtzcGFjZUNVRmluZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MWE4MjRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Xb3Jrc3BhY2VDVUZpbmRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQ29tcGlsYXRpb25Vbml0RmluZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JUHJvamVjdFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV29ya3NwYWNlQ1VGaW5kZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VDVUZpbmRlclRlc3QgZXh0ZW5kcyBDb21waWxhdGlvblVuaXRGaW5kZXJDb250cmFjdFRlc3QNCi17DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdEZpbmRlciBjcmVhdGVUYXJnZXQoKQ0KLQl7DQotCQlmaW5hbCBJUHJvamVjdFNlbGVjdG9yW10gcHMgPSBuZXcgSVByb2plY3RTZWxlY3Rvcltwcm9qZWN0U2VsZWN0b3JzKCkuc2l6ZSgpXTsNCi0JCXByb2plY3RTZWxlY3RvcnMoKS50b0FycmF5KHBzKTsNCi0JCXJldHVybiBuZXcgV29ya3NwYWNlQ1VGaW5kZXIoamF2YU1vZGVsKCksIHBzKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFByb2dyZXNzTW9uaXRvclVwZGF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJTW9jazxJUHJvZ3Jlc3NNb25pdG9yPiBtb25pdG9yID0gbW9jayhJUHJvZ3Jlc3NNb25pdG9yLmNsYXNzKTsNCi0JCW1vbml0b3Iuc3R1YnMoKS5tZXRob2QoImlzQ2FuY2VsZWQiKS53aWxsKHJldHVyblZhbHVlKGZhbHNlKSk7DQotCQltb25pdG9yLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImJlZ2luVGFzayIpOw0KLQkJbW9uaXRvci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJkb25lIik7DQotCQltb25pdG9yLmV4cGVjdHMoZXhhY3RseSgyKSkubWV0aG9kKCJ3b3JrZWQiKTsNCi0JCQ0KLQkJSUNvbXBpbGF0aW9uVW5pdEZpbmRlciBjdUZpbmRlciA9IHNldFVwRm9yUHJvZ3Jlc3NNb25pdG9yVGVzdHMoKTsNCi0JCU1vY2s8SUNvbXBpbGF0aW9uVW5pdEhhbmRsZXI+IGN1SGFuZGxlciA9IG1vY2soSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIuY2xhc3MpOw0KLQkJY3VIYW5kbGVyLnN0dWJzKCkubWV0aG9kKCJoYW5kbGUiKTsNCi0JCWN1SGFuZGxlci5zdHVicygpLm1ldGhvZCgic3RhcnRlZCIpOw0KLQkJY3VIYW5kbGVyLnN0dWJzKCkubWV0aG9kKCJmaW5pc2hlZCIpOw0KLQkJDQotCQljdUZpbmRlci5maW5kKG1vbml0b3IucHJveHkoKSwgY3VIYW5kbGVyLnByb3h5KCkpOwkJDQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q25hY2VsYXRpb25SZXF1ZXN0c1Byb2Nlc3NlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCU1vY2s8SVByb2dyZXNzTW9uaXRvcj4gbW9uaXRvciA9IG1vY2soSVByb2dyZXNzTW9uaXRvci5jbGFzcyk7DQotCQltb25pdG9yLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImJlZ2luVGFzayIpOw0KLQkJbW9uaXRvci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJkb25lIik7CQkNCi0JCW1vbml0b3IuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiaXNDYW5jZWxlZCIpLndpbGwocmV0dXJuVmFsdWUodHJ1ZSkpOw0KLQkJDQotCQlJQ29tcGlsYXRpb25Vbml0RmluZGVyIGN1RmluZGVyID0gc2V0VXBGb3JQcm9ncmVzc01vbml0b3JUZXN0cygpOw0KLQkJTW9jazxJQ29tcGlsYXRpb25Vbml0SGFuZGxlcj4gY3VIYW5kbGVyID0gbW9jayhJQ29tcGlsYXRpb25Vbml0SGFuZGxlci5jbGFzcyk7DQotCQljdUhhbmRsZXIuc3R1YnMoKS5tZXRob2QoImhhbmRsZSIpOw0KLQkJY3VIYW5kbGVyLnN0dWJzKCkubWV0aG9kKCJzdGFydGVkIik7DQotCQkNCi0JCXRyeSB7DQotCQkJY3VGaW5kZXIuZmluZChtb25pdG9yLnByb3h5KCksIGN1SGFuZGxlci5wcm94eSgpKTsNCi0JCQlmYWlsKCJTeW5jaHJvbml6YXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBlKSB7DQotCQkJLy8gZXhwZWN0ZWQNCi0JCX0JDQotCX0NCi0JDQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdEZpbmRlciBzZXRVcEZvclByb2dyZXNzTW9uaXRvclRlc3RzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgVGVzdFByb2plY3QgcHJvamVjdDEgPSBuZXcgVGVzdFByb2plY3QoKTsNCi0JCXByb2plY3QxLmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IHBmMSA9IHByb2plY3QxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdCIpOw0KLQkJcHJvamVjdDEuY3JlYXRlVHlwZShwZjEsICJDdTEuamF2YSIsICJjbGFzcyBDdTEge30iKTsNCi0JCXByb2plY3QxLmNyZWF0ZVR5cGUocGYxLCAiQ3UyLmphdmEiLCAiY2xhc3MgQ3UyIHt9Iik7DQotCQkNCi0JCUlQcm9qZWN0U2VsZWN0b3IgW10gc2xlY3RvcnMgPSBuZXcgSVByb2plY3RTZWxlY3RvcltdIHsNCi0JCQkJbmV3IElQcm9qZWN0U2VsZWN0b3IoKSB7DQotCQkJCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopIHsNCi0JCQkJCQlyZXR1cm4gcHJvamVjdDEuZ2V0UHJvamVjdCgpLmdldE5hbWUoKS5lcXVhbHMocHJqLmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQl9Ow0KLQkJCQkNCi0JCXJldHVybiBuZXcgV29ya3NwYWNlQ1VGaW5kZXIoamF2YU1vZGVsKCksIHNsZWN0b3JzKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uQWRhcHRlckZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzZTU2OTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmFubm90YXRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLklBbm5vdGF0aW9uQWRhcHRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHVibGljIHZvaWQgdGVzdElzRmFjdG9yeUZvclR5cGVPYmplY3QoKSANCi0Jew0KLQkJYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuaXNGYWN0b3J5Rm9yVHlwZShJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQWRhcHRlcigpIA0KLQl7DQotCQlJV2ViU2VydmljZSB3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQlBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod3MsIElBbm5vdGF0aW9uQWRhcHRlci5jbGFzcyk7DQotCQlBZGFwdGVyIGFkYXB0ZXIgPSB3cy5lQWRhcHRlcnMoKS5nZXQoMCk7DQotCQlhc3NlcnROb3ROdWxsKGFkYXB0ZXIpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyIGluc3RhbmNlb2YgSUFubm90YXRpb25BZGFwdGVyKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdzLCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzLmVBZGFwdGVycygpLnNpemUoKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9BYnN0cmFjdExvY2F0b3JzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9BYnN0cmFjdExvY2F0b3JzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNWUxOTZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL2ltcGwvQWJzdHJhY3RMb2NhdG9yc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLmltcGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIEFic3RyYWN0TG9jYXRvcnNUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIA0KLXsNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfT0ZGU0VUID0gMTA7DQotCQ0KLQlwcm90ZWN0ZWQgTW9jazxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb247DQotCXByb3RlY3RlZCBJUGFyYW1WYWx1ZVBhaXIgcGFyYW0xOw0KLQlwcm90ZWN0ZWQgSVBhcmFtVmFsdWVQYWlyIHBhcmFtMjsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCWFubm90YXRpb24gPSBtb2NrKElBbm5vdGF0aW9uLmNsYXNzKTsNCi0JCWFubm90YXRpb24uc3R1YnMoKS5tZXRob2QoImdldExvY2F0b3IiKS53aWxsKHJldHVyblZhbHVlKGNyZWF0ZUxvY2F0b3IoMSwgMTEpKSk7DQotCQkNCi0JCXBhcmFtMSA9IGNyZWF0ZVBhcmFtVmFsdWUoInBhcmFtMSIsIDIxLCAzMSk7DQotCQlwYXJhbTIgPSBjcmVhdGVQYXJhbVZhbHVlKCJwYXJhbTIiLCAyMiwgMzIpOw0KLQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYWlycyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhaXJzLmFkZChwYXJhbTEpOw0KLQkJcGFpcnMuYWRkKHBhcmFtMik7DQotCQlhbm5vdGF0aW9uLnN0dWJzKCkubWV0aG9kKCJnZXRQYXJhbVZhbHVlUGFpcnMiKS53aWxsKHJldHVyblZhbHVlKHBhaXJzKSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJUGFyYW1WYWx1ZVBhaXIgY3JlYXRlUGFyYW1WYWx1ZShTdHJpbmcgbmFtZSwgaW50IHN0YXJ0UG9zLCBpbnQgbGVuZ2h0KQ0KLQl7DQotCQlNb2NrPElQYXJhbVZhbHVlUGFpcj4gcGFyYW0gPSBtb2NrKElQYXJhbVZhbHVlUGFpci5jbGFzcyk7DQotCQlwYXJhbS5zdHVicygpLm1ldGhvZCgiZ2V0UGFyYW0iKS53aWxsKHJldHVyblZhbHVlKG5hbWUpKTsNCi0JCXBhcmFtLnN0dWJzKCkubWV0aG9kKCJnZXRMb2NhdG9yIikud2lsbChyZXR1cm5WYWx1ZShjcmVhdGVMb2NhdG9yKHN0YXJ0UG9zLCBsZW5naHQpKSk7DQotCQlNb2NrPElWYWx1ZT4gdmFsdWUgPSBtb2NrKElWYWx1ZS5jbGFzcyk7DQotCQl2YWx1ZS5zdHVicygpLm1ldGhvZCgiZ2V0TG9jYXRvciIpLndpbGwocmV0dXJuVmFsdWUoY3JlYXRlTG9jYXRvcihzdGFydFBvcyArIFZBTFVFX09GRlNFVCwgbGVuZ2h0ICsgVkFMVUVfT0ZGU0VUKSkpOw0KLQkJcGFyYW0uc3R1YnMoKS5tZXRob2QoImdldFZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSh2YWx1ZS5wcm94eSgpKSk7CQkNCi0JCQ0KLQkJcmV0dXJuIHBhcmFtLnByb3h5KCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIElMb2NhdG9yIGNyZWF0ZUxvY2F0b3IoaW50IHN0YXJ0UG9zLCBpbnQgbGVuZ3RoKQ0KLQl7DQotCQlNb2NrPElMb2NhdG9yPiBsb2NhdG9yID0gbW9jayhJTG9jYXRvci5jbGFzcyk7DQotCQlsb2NhdG9yLnN0dWJzKCkubWV0aG9kKCJnZXRMZW5ndGgiKS53aWxsKHJldHVyblZhbHVlKGxlbmd0aCkpOw0KLQkJbG9jYXRvci5zdHVicygpLm1ldGhvZCgiZ2V0U3RhcnRQb3NpdGlvbiIpLndpbGwocmV0dXJuVmFsdWUoc3RhcnRQb3MpKTsNCi0JCQ0KLQkJcmV0dXJuIGxvY2F0b3IucHJveHkoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9pbXBsL0Fubm90YXRpb25BZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9Bbm5vdGF0aW9uQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmU1MTk3My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9pbXBsL0Fubm90YXRpb25BZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmFubm90YXRpb24uaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLmltcGwuQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5TQkFubm90YXRpb25GZWF0dXJlcy5TQl9BTk5PVEFUSU9OOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotDQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25BZGFwdGVyVGVzdCBleHRlbmRzIEFic3RyYWN0TG9jYXRvcnNUZXN0IA0KLXsNCi0NCi0JcHJpdmF0ZSBBbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0Jew0KLQkJc3VwZXIuc2V0VXAoKTsNCi0JCWFkYXB0ZXIgPSBuZXcgQW5ub3RhdGlvbkFkYXB0ZXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkR2V0QW5ub3RhdGlvbkxvY2F0aW9ucygpIA0KLQl7DQotCQlhZGFwdGVyLmFkZEFubm90YXRpb24oV1NfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5wcm94eSgpKTsNCi0JCWFubm90YXRpb24uc3R1YnMoKS5tZXRob2QoImdldExvY2F0b3IiKS53aWxsKHJldHVyblZhbHVlKGNyZWF0ZUxvY2F0b3IoMTAwLCAxMTApKSk7DQotCQlhZGFwdGVyLmFkZEFubm90YXRpb24oU0JfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5wcm94eSgpKTsNCi0JCUlBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oV1NfQU5OT1RBVElPTik7DQotCQlhc3NlcnROb3ROdWxsKCJBbm5vdGF0aW9uIGFkYXB0ZXIgbm90IGFkZGVkIiwgYW5ub3RhdGlvbik7DQotCQlhc3NlcnRFcXVhbHMoMTAwLCBhbm5vdGF0aW9uLmdldExvY2F0b3IoKS5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJDQotCQlhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKFNCX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0Tm90TnVsbCgiQW5ub3RhdGlvbiBhZGFwdGVyIG5vdCBhZGRlZCIsIGFubm90YXRpb24pOw0KLQkJYXNzZXJ0RXF1YWxzKDEwMCwgYW5ub3RhdGlvbi5nZXRMb2NhdG9yKCkuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJDQotCQlhZGFwdGVyLmFkZEFubm90YXRpb24oV1NfQU5OT1RBVElPTiwgbnVsbCk7DQotCQlhbm5vdGF0aW9uPSBhZGFwdGVyLmdldEFubm90YXRpb24oV1NfQU5OT1RBVElPTik7DQotCQlhc3NlcnROdWxsKCJBbm5vdGF0aW9uIGFkYXB0ZXIgbm90IGNsZWFyZWQiLCBhbm5vdGF0aW9uKTsJCQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJc0FkYXB0ZXJGb3JUeXBlKCkgDQotCXsNCi0JCWFzc2VydFRydWUoIkFkYXB0ZXIgcmVwb3J0cyB0aGF0IGl0IGlzIG5vdCBmb3IgSUxvY2F0b3JBZGFwdGVyIiwgYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKElBbm5vdGF0aW9uQWRhcHRlci5jbGFzcykpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9NZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9NZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzhmNzFlOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvZGVmYXVsdHMvTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHMuTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5Qcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3Rvcnk7DQotDQotLyoqDQotICogVGVzdHMgZm9yIG1ldGhvZCBkZWZhdWx0IHZhbHVlcyBhZGFwdGVyDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgSVdlYk1ldGhvZCB3ZWJNZXRob2Q7DQotCXByaXZhdGUgSVByb3BlcnR5RGVmYXVsdHMgZGVmYXVsdHM7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIA0KLQl7DQotCQl3ZWJNZXRob2QgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCk7DQotCQl3ZWJNZXRob2QuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAibXlNZXRob2QoKSIpOw0KLQkJZGVmYXVsdHMgPSAoSVByb3BlcnR5RGVmYXVsdHMpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdlYk1ldGhvZCwgSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kTmFtZSgpIA0KLQl7DQotCQlhc3NlcnRFcXVhbHMoIm15TWV0aG9kIiwgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFkYXB0ZWRPbmNlKCkNCi0Jew0KLQkJSVByb3BlcnR5RGVmYXVsdHMgYWRhcHRlciA9IChJUHJvcGVydHlEZWZhdWx0cylQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod2ViTWV0aG9kLCBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIgaW5zdGFuY2VvZiBNZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlcik7DQotCQlhc3NlcnRFcXVhbHMoMSwgd2ViTWV0aG9kLmVBZGFwdGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdHMsIGFkYXB0ZXIpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9QYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9QYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWEyNjdmOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvZGVmYXVsdHMvUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHMuUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5Qcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3Rvcnk7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBJV2ViUGFyYW19IHByb3BlcnRpZXMgZGVmYXVsdCB2YWx1ZXMNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIHdlYk1ldGhvZDsNCi0JcHJpdmF0ZSBJV2ViUGFyYW0gd2ViUGFyYW07DQotCXByaXZhdGUgSVByb3BlcnR5RGVmYXVsdHMgZGVmYXVsdHM7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIA0KLQl7DQotCQl3ZWJNZXRob2QgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCk7DQotCQl3ZWJNZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZS5MSVRFUkFMKTsNCi0JCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7DQotCQkNCi0JCXdlYlBhcmFtID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlBhcmFtKCk7DQotCQl3ZWJQYXJhbS5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sICJteVBhcmFtIik7DQotCQkNCi0JCUlXZWJQYXJhbSBkdW1teSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJQYXJhbSgpOw0KLQkJZHVtbXkuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAiZHVtbXkiKTsNCi0JCQ0KLQkJd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQoZHVtbXkpOw0KLQkJd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQod2ViUGFyYW0pOw0KLQkJDQotCQlkZWZhdWx0cyA9IChJUHJvcGVydHlEZWZhdWx0cylQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod2ViUGFyYW0sIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE5hbWVEZWZhdWx0VmFsdWUoKSANCi0Jew0KLQkJd2ViUGFyYW0uc2V0TmFtZSgidGVzdCIpOw0KLQkJYXNzZXJ0RXF1YWxzKCJhcmcxIiwgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFBhcnROYW1lRGVmYXVsdFZhbHVlKCkNCi0Jew0KLQkJd2ViUGFyYW0uc2V0UGFydE5hbWUoInRlc3QiKTsNCi0JCWFzc2VydEVxdWFscygiYXJnMSIsIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19QQVJUX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFBhcnROYW1lTWV0aG9kUGFyYW1TdHlsZUJhcmUoKQ0KLQl7DQotCQl3ZWJNZXRob2Quc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpOw0KLQkJd2ViTWV0aG9kLnNldE5hbWUoInRlc3QiKTsNCi0JCWFzc2VydEVxdWFscygidGVzdCIsIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXROU0RlZmF1bHRWYWx1ZSgpDQotCXsNCi0JCXdlYlBhcmFtLnNldFRhcmdldE5hbWVzcGFjZSgidGVzdCIpOw0KLQkJYXNzZXJ0RXF1YWxzKCIiLCBkZWZhdWx0cy5nZXREZWZhdWx0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0TlNQYXJhbUluSGVhZGVyRGVmYXVsdFZhbHVlKCkNCi0Jew0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQlzZWkuc2V0VGFyZ2V0TmFtZXNwYWNlKCJodHRwOi8vdGVzdCIpOw0KLQkJDQotCQlzZWkuZ2V0V2ViTWV0aG9kcygpLmFkZCh3ZWJNZXRob2QpOw0KLQkJDQotCQl3ZWJQYXJhbS5zZXRIZWFkZXIodHJ1ZSk7DQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0IiwgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RIZWFkZXJEZWZhdWx0VmFsdWUoKQ0KLQl7DQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19IRUFERVIpKTsJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RLaW5kRGVmYXVsdFZhbHVlKCkgDQotCXsNCi0JCWFzc2VydEVxdWFscyhXZWJQYXJhbUtpbmQuSU4sIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19LSU5EKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RBZGFwdGVkT25jZSgpDQotCXsNCi0JCUlQcm9wZXJ0eURlZmF1bHRzIGFkYXB0ZXIgPSAoSVByb3BlcnR5RGVmYXVsdHMpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdlYlBhcmFtLCBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIgaW5zdGFuY2VvZiBQYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlcik7DQotCQkNCi0JCWFzc2VydEVxdWFscygxLCB3ZWJQYXJhbS5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHRzLCBhZGFwdGVyKTsNCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1NlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1NlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjQ5YTk5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5kZWZhdWx0czsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5Qcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2V9IGRlZmF1bHQgcHJvcGVydGllcyB2YWx1ZXMgDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7DQotCXByaXZhdGUgSVByb3BlcnR5RGVmYXVsdHMgZGVmYXVsdHM7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCXNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCXNlaS5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sICJjb20uc2FwLnRlc3QuU2VpIik7DQotCQlkZWZhdWx0cyA9IChJUHJvcGVydHlEZWZhdWx0cylQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQoc2VpLCBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE5hbWVEZWZhdWx0VmFsdWUoKQ0KLQl7DQotCQlzZWkuc2V0TmFtZSgiVGVzdCIpOw0KLQkJYXNzZXJ0RXF1YWxzKCJTZWkiLCBkZWZhdWx0cy5nZXREZWZhdWx0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOwkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldE5hbWVzcGFjZURlZmF1bHRWYWx1ZSgpDQotCXsNCi0JCXNlaS5zZXRUYXJnZXROYW1lc3BhY2UoInRlc3QiKTsNCi0JCWFzc2VydEVxdWFscygiaHR0cDovL3NhcC5jb20vdGVzdC8iLCAgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRhcHRlZE9uY2UoKQ0KLQl7DQotCQlJUHJvcGVydHlEZWZhdWx0cyBhZGFwdGVyID0gKElQcm9wZXJ0eURlZmF1bHRzKVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChzZWksIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlciBpbnN0YW5jZW9mIFNlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyKTsNCi0JCWFzc2VydEVxdWFscygxLCBzZWkuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscyhkZWZhdWx0cywgYWRhcHRlcik7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1dzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0ODJmNDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1dzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzLlByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzLldzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXI7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBJV2ViU2VydmljZX0gZGVmYXVsdCB2YWx1ZXMgY2FsY3VsYXRpb24NCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFdzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByaXZhdGUgSVdlYlNlcnZpY2Ugd2ViU2VydmljZTsNCi0JcHJpdmF0ZSBJUHJvcGVydHlEZWZhdWx0cyBkZWZhdWx0czsNCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgew0KLQkJd2ViU2VydmljZSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQl3ZWJTZXJ2aWNlLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwgImNvbS5zYXAudGVzdC5NeVdzIik7DQotCQlkZWZhdWx0cyA9IChJUHJvcGVydHlEZWZhdWx0cylQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod2ViU2VydmljZSwgSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lRGVmYXVsdFZhbHVlKCkNCi0Jew0KLQkJd2ViU2VydmljZS5zZXROYW1lKCJUZXN0Iik7DQotCQlhc3NlcnRFcXVhbHMoIk15V3NTZXJ2aWNlIiwgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFBvcnROYW1lRGVmYXVsdFZhbHVlKCkNCi0Jew0KLQkJd2ViU2VydmljZS5zZXRQb3J0TmFtZSgiVGVzdFBvcnROYW1lIik7DQotCQlhc3NlcnRFcXVhbHMoIk15V3NQb3J0IiwgIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0TmFtZXNwYWNlRGVmYXVsdFZhbHVlKCkNCi0Jew0KLQkJd2ViU2VydmljZS5zZXRUYXJnZXROYW1lc3BhY2UoInRlc3QiKTsNCi0JCWFzc2VydEVxdWFscygiaHR0cDovL3NhcC5jb20vdGVzdC8iLCAgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRhcHRlZE9uY2UoKQ0KLQl7DQotCQlJUHJvcGVydHlEZWZhdWx0cyBhZGFwdGVyID0gKElQcm9wZXJ0eURlZmF1bHRzKVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3ZWJTZXJ2aWNlLCBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIgaW5zdGFuY2VvZiBXc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyKTsNCi0JCWFzc2VydEVxdWFscygxLCB3ZWJTZXJ2aWNlLmVBZGFwdGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdHMsIGFkYXB0ZXIpOw0KLQl9CQkNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL0Fic3RyYWN0U2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3YTMwYmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5BYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5Xc1NlcmlhbGl6ZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgV3NTZXJpYWxpemVyQWRhcHRlcn0gY2xhc3MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgVGVzdFdzU2VyaWFsaXplckFkYXB0ZXIgYWRhcHRlcjsNCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOyANCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCU1vY2s8SUphdmFNb2RlbD4gamF2YU1vZGVsTW9jayA9IG1vY2soSUphdmFNb2RlbC5jbGFzcyk7DQotCQlyZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbE1vY2sucHJveHkoKSk7DQotCQlhZGFwdGVyID0gbmV3IFRlc3RXc1NlcmlhbGl6ZXJBZGFwdGVyKG51bGwsIGZhbHNlKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFdzU2VyaWFsaXplckFkYXB0ZXIoKSANCi0Jew0KLQkJdHJ5IHsNCi0JCQluZXcgV3NTZXJpYWxpemVyQWRhcHRlcihudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKSB7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnlDaGFuZ2VkTm90aWZpY2F0aW9uRWRpdEVuYWJsZWRPblNldCgpIA0KLQl7DQotCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RXZlbnRUeXBlIikud2lsbChyZXR1cm5WYWx1ZShOb3RpZmljYXRpb24uU0VUKSk7DQotCQkNCi0JCWFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25Nb2NrLnByb3h5KCkpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLnNhdmVDYWxsZWQpOwkJDQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90aWZ5Q2hhbmdlZE5vdGlmaWNhdGlvbkVkaXRFbmFibGVkT25VbnNldCgpIA0KLQl7DQotCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RXZlbnRUeXBlIikud2lsbChyZXR1cm5WYWx1ZShOb3RpZmljYXRpb24uVU5TRVQpKTsNCi0JCQ0KLQkJYWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbk1vY2sucHJveHkoKSk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuc2F2ZUNhbGxlZCk7CQkNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnlDaGFuZ2VkTm90aWZpY2F0aW9uRWRpdEVuYWJsZWRPbkFkZCgpIA0KLQl7DQotCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RXZlbnRUeXBlIikud2lsbChyZXR1cm5WYWx1ZShOb3RpZmljYXRpb24uQUREKSk7DQotCQkNCi0JCWFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25Nb2NrLnByb3h5KCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5zYXZlQ2FsbGVkKTsJCQ0KLQl9CQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnlDaGFuZ2VkTm90aWZpY2F0aW9uT2JqZWN0VG91Y2hlZCgpIA0KLQl7DQotCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZSh0cnVlKSk7DQotCQlhZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uTW9jay5wcm94eSgpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuc2F2ZUNhbGxlZCk7CQkNCi0JfQkJDQotDQotCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnlDaGFuZ2VkTm90aWZpY2F0aW9uRWRpdERpc2FibGVkKCkgDQotCXsNCi0JCXJlc291cmNlLmRpc2FibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJYWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbk1vY2sucHJveHkoKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLnNhdmVDYWxsZWQpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDaGVja1N0cmluZ1ZhbHVlKCkNCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJVGVzdFdzU2VyaWFsaXplckFkYXB0ZXIgYWRhcHRlciA9IG5ldyBUZXN0V3NTZXJpYWxpemVyQWRhcHRlcih3cywgdHJ1ZSk7DQotCQkNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBtc2cgPSBtb2NrKE5vdGlmaWNhdGlvbi5jbGFzcyk7DQotCQltc2cuc3R1YnMoKS5tZXRob2QoImdldEZlYXR1cmUiKS53aWxsKHJldHVyblZhbHVlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJbXNnLnN0dWJzKCkubWV0aG9kKCJnZXRPbGRTdHJpbmdWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIm9sZFZhbHVlIikpOw0KLQkJbXNnLnN0dWJzKCkubWV0aG9kKCJnZXROZXdTdHJpbmdWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIm5ld1ZhbHVlIikpOwkJDQotCQkNCi0JCWFzc2VydFRydWUoYWRhcHRlci5jaGVja1ZhbHVlKG1zZy5wcm94eSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoIm5ld1ZhbHVlIiwgd3MuZ2V0TmFtZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENoZWNrU3RyaW5nVmFsdWVJbnZhbGlkVmFsdWVzKCkNCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJVGVzdFdzU2VyaWFsaXplckFkYXB0ZXIgYWRhcHRlciA9IG5ldyBUZXN0V3NTZXJpYWxpemVyQWRhcHRlcih3cywgdHJ1ZSk7DQotCQkNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBtc2cgPSBtb2NrKE5vdGlmaWNhdGlvbi5jbGFzcyk7DQotCQltc2cuc3R1YnMoKS5tZXRob2QoImdldEZlYXR1cmUiKS53aWxsKHJldHVyblZhbHVlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJbXNnLnN0dWJzKCkubWV0aG9kKCJnZXRPbGRWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIm9sZFZhbHVlIikpOw0KLQkJDQotCQltc2cuc3R1YnMoKS5tZXRob2QoImdldE5ld1N0cmluZ1ZhbHVlIikud2lsbChyZXR1cm5WYWx1ZShudWxsKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmNoZWNrVmFsdWUobXNnLnByb3h5KCkpKTsNCi0JCWFzc2VydEVxdWFscygib2xkVmFsdWUiLCB3cy5nZXROYW1lKCkpOw0KLQkJbXNnLnN0dWJzKCkubWV0aG9kKCJnZXROZXdTdHJpbmdWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIiIpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuY2hlY2tWYWx1ZShtc2cucHJveHkoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJvbGRWYWx1ZSIsIHdzLmdldE5hbWUoKSk7DQotCQltc2cuc3R1YnMoKS5tZXRob2QoImdldE5ld1N0cmluZ1ZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiICIpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuY2hlY2tWYWx1ZShtc2cucHJveHkoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJvbGRWYWx1ZSIsIHdzLmdldE5hbWUoKSk7CQkNCi0JCW1zZy5zdHVicygpLm1ldGhvZCgiZ2V0TmV3U3RyaW5nVmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCIgb2xkVmFsdWUgIikpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmNoZWNrVmFsdWUobXNnLnByb3h5KCkpKTsNCi0JCWFzc2VydEVxdWFscygib2xkVmFsdWUiLCB3cy5nZXROYW1lKCkpOwkJCQkNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNBZGFwdGVyRm9yVHlwZU9iamVjdCgpIA0KLQl7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZShJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZShOb3RpZmljYXRpb24uY2xhc3MpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhbGxlZEZvclJlcXVpcmVkQW5ub3RhdGlvbigpDQotCXsNCi0JCXJlc291cmNlLmVuYWJsZVNhdmluZygpOw0KLQkJTW9jazxOb3RpZmljYXRpb24+IG5vdGlmaWNhdGlvbk1vY2sgPSBtb2NrKE5vdGlmaWNhdGlvbi5jbGFzcyk7DQotCQlub3RpZmljYXRpb25Nb2NrLnN0dWJzKCkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RXZlbnRUeXBlIikud2lsbChyZXR1cm5WYWx1ZShOb3RpZmljYXRpb24uVU5TRVQpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldE5ld1N0cmluZ1ZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgidGVzdCIpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldE9sZFZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgib2xkVmFsdWUiKSk7CQ0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RmVhdHVyZSIpLndpbGwocmV0dXJuVmFsdWUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFBhcmFtVmFsdWVQYWlycyIpLndpbGwocmV0dXJuVmFsdWUobmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKSk7DQotCQkNCi0JCVRlc3RTYXZpbmdXc1NlcmlhbGl6ZXJBZGFwdGVyIHNhdmVBZGFwdGVyID0gbmV3IFRlc3RTYXZpbmdXc1NlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlLCB0cnVlLCBhbm4ucHJveHkoKSk7DQotCQlzYXZlQWRhcHRlci5zZXRUYXJnZXQoRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKSk7DQotCQlzYXZlQWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbk1vY2sucHJveHkoKSk7DQotCQlhc3NlcnRUcnVlKHNhdmVBZGFwdGVyLmFubldyaXRlci51cGRhdGVDYWxsZWQpOw0KLQkJYXNzZXJ0RmFsc2Uoc2F2ZUFkYXB0ZXIuYW5uV3JpdGVyLnJlbW92ZUNhbGxlZCk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhbGxlZEZvck5vbkVtcHR5QW5ub3RhdGlvbigpDQotCXsNCi0JCXJlc291cmNlLmVuYWJsZVNhdmluZygpOw0KLQkJTW9jazxOb3RpZmljYXRpb24+IG5vdGlmaWNhdGlvbk1vY2sgPSBtb2NrKE5vdGlmaWNhdGlvbi5jbGFzcyk7DQotCQlub3RpZmljYXRpb25Nb2NrLnN0dWJzKCkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RXZlbnRUeXBlIikud2lsbChyZXR1cm5WYWx1ZShOb3RpZmljYXRpb24uVU5TRVQpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldE5ld1N0cmluZ1ZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgidGVzdCIpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldE9sZFZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgib2xkVmFsdWUiKSk7CQ0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RmVhdHVyZSIpLndpbGwocmV0dXJuVmFsdWUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlNb2NrPElQYXJhbVZhbHVlUGFpcj4gcGFyYW0gPSBtb2NrKElQYXJhbVZhbHVlUGFpci5jbGFzcyk7DQotCQlwYXJhbXMuYWRkKHBhcmFtLnByb3h5KCkpOw0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQYXJhbVZhbHVlUGFpcnMiKS53aWxsKHJldHVyblZhbHVlKHBhcmFtcykpOw0KLQkJDQotCQlUZXN0U2F2aW5nV3NTZXJpYWxpemVyQWRhcHRlciBzYXZlQWRhcHRlciA9IG5ldyBUZXN0U2F2aW5nV3NTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSwgZmFsc2UsIGFubi5wcm94eSgpKTsNCi0JCXNhdmVBZGFwdGVyLnNldFRhcmdldChEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpKTsNCi0JCXNhdmVBZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uTW9jay5wcm94eSgpKTsNCi0JCWFzc2VydFRydWUoc2F2ZUFkYXB0ZXIuYW5uV3JpdGVyLnVwZGF0ZUNhbGxlZCk7DQotCQlhc3NlcnRGYWxzZShzYXZlQWRhcHRlci5hbm5Xcml0ZXIucmVtb3ZlQ2FsbGVkKTsJCQ0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNhbGxlZEZvck5vdFJlcXVpcmVkQW5ub3RhdGlvbigpDQotCXsNCi0JCXJlc291cmNlLmVuYWJsZVNhdmluZygpOw0KLQkJTW9jazxOb3RpZmljYXRpb24+IG5vdGlmaWNhdGlvbk1vY2sgPSBtb2NrKE5vdGlmaWNhdGlvbi5jbGFzcyk7DQotCQlub3RpZmljYXRpb25Nb2NrLnN0dWJzKCkubWV0aG9kKCJpc1RvdWNoIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RXZlbnRUeXBlIikud2lsbChyZXR1cm5WYWx1ZShOb3RpZmljYXRpb24uVU5TRVQpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldE5ld1N0cmluZ1ZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgidGVzdCIpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldE9sZFZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgib2xkVmFsdWUiKSk7CQ0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0RmVhdHVyZSIpLndpbGwocmV0dXJuVmFsdWUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFBhcmFtVmFsdWVQYWlycyIpLndpbGwocmV0dXJuVmFsdWUobmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKSk7DQotCQkNCi0JCVRlc3RTYXZpbmdXc1NlcmlhbGl6ZXJBZGFwdGVyIHNhdmVBZGFwdGVyID0gbmV3IFRlc3RTYXZpbmdXc1NlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlLCBmYWxzZSwgYW5uLnByb3h5KCkpOw0KLQkJc2F2ZUFkYXB0ZXIuc2V0VGFyZ2V0KERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCkpOw0KLQkJc2F2ZUFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25Nb2NrLnByb3h5KCkpOw0KLQkJYXNzZXJ0RmFsc2Uoc2F2ZUFkYXB0ZXIuYW5uV3JpdGVyLnVwZGF0ZUNhbGxlZCk7DQotCQlhc3NlcnRUcnVlKHNhdmVBZGFwdGVyLmFubldyaXRlci5yZW1vdmVDYWxsZWQpOwkJDQotCX0NCi0JCQ0KLQkNCi0JcHJvdGVjdGVkIGNsYXNzIFRlc3RXc1NlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcg0KLQl7DQotCQlwdWJsaWMgYm9vbGVhbiBzYXZlQ2FsbGVkOw0KLQkJDQotCQlwcml2YXRlIGJvb2xlYW4gZG9DaGVjazsNCi0JCQ0KLQkJcHJpdmF0ZSBJV2ViU2VydmljZSB3czsNCi0JCQkNCi0JCXB1YmxpYyBUZXN0V3NTZXJpYWxpemVyQWRhcHRlcihmaW5hbCBJV2ViU2VydmljZSB3cywgYm9vbGVhbiBkb0NoZWNrKSB7DQotCQkJc3VwZXIocmVzb3VyY2UpOw0KLQkJCXRoaXMud3MgPSB3czsNCi0JCQl0aGlzLmRvQ2hlY2sgPSBkb0NoZWNrOw0KLQkJfQkJDQotDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyB2b2lkIHNhdmUoTm90aWZpY2F0aW9uIG1zZykgew0KLQkJCXNhdmVDYWxsZWQgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwdWJsaWMgYm9vbGVhbiBjaGVja1ZhbHVlKE5vdGlmaWNhdGlvbiBtc2cpIA0KLQkJew0KLQkJCWlmKCFkb0NoZWNrKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gc3VwZXIuY2hlY2tWYWx1ZShtc2cpOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyBFT2JqZWN0IGdldFRhcmdldCgpIHsNCi0JCQlyZXR1cm4gd3M7DQotCQl9DQotDQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblJlcXVpcmVkKCkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgVGVzdFNhdmluZ1dzU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyDQotCXsNCi0JCWJvb2xlYW4gYW5uUmVxdWlyZWQ7DQotCQlNeUFubm90YXRpb25Xcml0ZXIgYW5uV3JpdGVyID0gbmV3IE15QW5ub3RhdGlvbldyaXRlcigpOw0KLQkJSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5uOw0KLQkJDQotCQlwdWJsaWMgVGVzdFNhdmluZ1dzU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBhbm5SZXF1aXJlZCwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5uKSB7DQotCQkJc3VwZXIocmVzb3VyY2UpOw0KLQkJCXRoaXMuYW5uUmVxdWlyZWQgPSBhbm5SZXF1aXJlZDsNCi0JCQl0aGlzLmFubiA9IGFubjsNCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gYW5uOw0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25SZXF1aXJlZCgpIHsNCi0JCQlyZXR1cm4gYW5uUmVxdWlyZWQ7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIEFubm90YXRpb25Xcml0ZXIgZ2V0QW5ub3RhdGlvbldyaXRlcigpIHsNCi0JCQlyZXR1cm4gYW5uV3JpdGVyOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlBbm5vdGF0aW9uV3JpdGVyIGV4dGVuZHMgQW5ub3RhdGlvbldyaXRlcg0KLQl7DQotCQlib29sZWFuIHJlbW92ZUNhbGxlZDsNCi0JCWJvb2xlYW4gdXBkYXRlQ2FsbGVkOw0KLQkJDQotCQlwdWJsaWMgdm9pZCBjbGVhcigpDQotCQl7DQotCQkJcmVtb3ZlQ2FsbGVkID0gZmFsc2U7DQotCQkJdXBkYXRlQ2FsbGVkID0gZmFsc2U7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHVwZGF0ZShmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uKSB7DQotCQkJdXBkYXRlQ2FsbGVkID0gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwdWJsaWMgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgcmVtb3ZlKGZpbmFsIElBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24pIHsNCi0JCQlyZW1vdmVDYWxsZWQgPSB0cnVlOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL01ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvTWV0aG9kU2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkM2M0OWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvTWV0aG9kU2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuTWV0aG9kU2VyaWFsaXplckFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fQU5OT1RBVElPTjsNCi0NCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VyaWFsaXplckFkYXB0ZXJUZXN0IGV4dGVuZHMgU2VyaWFsaXplckFkYXB0ZXJUZXN0Rml4dHVyZSANCi17DQotCXByaXZhdGUgSVdlYk1ldGhvZCB3ZWJNZXRob2QxOw0KLQlwcml2YXRlIElNZXRob2QgbWV0aG9kMTsNCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzdXBlci5zZXRVcCgpOw0KLQkNCi0JCXJlc291cmNlLnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJbWV0aG9kMSA9IHNlaVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCB0ZXN0MSgpOyIsIG51bGwsIHRydWUsIG51bGwpOw0KLQkJd2ViTWV0aG9kMSA9IHNlaS5nZXRXZWJNZXRob2RzKCkuZ2V0KDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uRGVmYXVsdFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJTXlNZXRob2RTZXJpYWxpemVyQWRhcHRlciBhZGFwdGVyID0gbmV3IE15TWV0aG9kU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UsIHdlYk1ldGhvZDEpOw0KLQkJSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURSkpOw0KLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fRVhDTFVERURfQVRUUklCVVRFKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uTm9uRGVmYXVsdFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24NCi0JewkJDQotCQlyZXNvdXJjZS5kaXNhYmxlU2F2aW5nKCk7DQotCQl3ZWJNZXRob2QxLnNldE5hbWUoImNoYW5nZWQiKTsNCi0JCXdlYk1ldGhvZDEuc2V0RXhjbHVkZWQodHJ1ZSk7DQotCQlNeU1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgTXlNZXRob2RTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSwgd2ViTWV0aG9kMSk7DQotCQlJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOw0KLQkJYXNzZXJ0RXF1YWxzKDIsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygiY2hhbmdlZCIsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURSkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0VYQ0xVREVEX0FUVFJJQlVURSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJd2ViTWV0aG9kMS5zZXROYW1lKCJjaGFuZ2VkT3BlcmF0aW9uIik7DQotCQlmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKHNlaVR5cGUpOw0KLQkJZmluYWwgSUFubm90YXRpb248SU1ldGhvZD4gYW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG1ldGhvZDEsIFdNX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscygiY2hhbmdlZE9wZXJhdGlvbiIsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURSkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlQW5ub3RhdGlvbkVtcHR5TmFtZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJd2ViTWV0aG9kMS5zZXROYW1lKCJtZXRob2QxIik7DQotCQl3ZWJNZXRob2QxLnNldE5hbWUobnVsbCk7DQotCQlmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKHNlaVR5cGUpOw0KLQkJZmluYWwgSUFubm90YXRpb248SU1ldGhvZD4gYW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG1ldGhvZDEsIFdNX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscygibWV0aG9kMSIsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURSkpOwkJCQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlNZXRob2RTZXJpYWxpemVyQWRhcHRlciBleHRlbmRzIE1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyDQotCXsNCi0JCXB1YmxpYyBNeU1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UsIElXZWJNZXRob2Qgd2ViTWV0aG9kKSB7DQotCQkJc3VwZXIocmVzb3VyY2UpOw0KLQkJCXNldFRhcmdldCh3ZWJNZXRob2QpOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCQl7DQotCQkJcmV0dXJuIHN1cGVyLmdldEFubm90YXRpb24oKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1BhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NTk5ZTlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1BhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT047DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyVGVzdCBleHRlbmRzIFNlcmlhbGl6ZXJBZGFwdGVyVGVzdEZpeHR1cmUNCi17DQotCXByaXZhdGUgTXlQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlciBhZGFwdGVyOw0KLQlwcml2YXRlIElNZXRob2QgbWV0aG9kOyANCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIHdzTWV0aG9kOw0KLQlwcml2YXRlIElXZWJQYXJhbSB3ZWJQYXJhbTsgDQotCXByaXZhdGUgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yOw0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXN1cGVyLnNldFVwKCk7DQotCQlyZXNvdXJjZS5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWFkYXB0ZXIgPSBuZXcgTXlQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSk7DQotCQltZXRob2QgPSBzZWlUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgbWV0aG9kKGludCBwYXJhbTEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQl3ZWJQYXJhbSA9IHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCk7DQotCQlhZGFwdGVyLnNldFRhcmdldCh3ZWJQYXJhbSk7DQotCQlyZXNvdXJjZS5kaXNhYmxlU2F2aW5nKCk7DQotCQlpbnNwZWN0b3IgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKHNlaVR5cGUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbktpbmQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCS8vIElOIGNhc2UNCi0JCXdlYlBhcmFtLnNldEtpbmQoV2ViUGFyYW1LaW5kLklOKTsNCi0JCUlBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhXUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJLy8gSU5PVVQgY2FzZQ0KLQkJd2ViUGFyYW0uc2V0S2luZChXZWJQYXJhbUtpbmQuSU5PVVQpOw0KLQkJYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0RXF1YWxzKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT04sIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWUgPSBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKCJtb2RlIiwgcGFyYW1WYWx1ZS5nZXRQYXJhbSgpKTsNCi0JCWFzc2VydFRydWUoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV0VCX1BBUkFNX01PREVfSU5PVVQuZW5kc1dpdGgocGFyYW1WYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpKTsNCi0JCQ0KLQkJLy8gT1VUIGNhc2UNCi0JCXdlYlBhcmFtLnNldEtpbmQoV2ViUGFyYW1LaW5kLk9VVCk7DQotCQlhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnRFcXVhbHMoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygxLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQlwYXJhbVZhbHVlID0gYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscygibW9kZSIsIHBhcmFtVmFsdWUuZ2V0UGFyYW0oKSk7DQotCQlhc3NlcnRUcnVlKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldFQl9QQVJBTV9NT0RFX09VVC5lbmRzV2l0aChwYXJhbVZhbHVlLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbkhlYWRlcigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJLy8gbm90IGluIGhlYWRlciBjYXNlDQotCQl3ZWJQYXJhbS5zZXRIZWFkZXIoZmFsc2UpOw0KLQkJSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0RXF1YWxzKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT04sIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJDQotCQkvLyBpbiBoZWFkZXIgY2FzZQ0KLQkJd2ViUGFyYW0uc2V0SGVhZGVyKHRydWUpOw0KLQkJYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0RXF1YWxzKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT04sIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWUgPSBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKCJoZWFkZXIiLCBwYXJhbVZhbHVlLmdldFBhcmFtKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcGFyYW1WYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl3ZWJQYXJhbS5zZXROYW1lKCJhcmcwIik7DQotCQlJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnRFcXVhbHMoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQkNCi0JCS8vIGluIGhlYWRlciBjYXNlDQotCQl3ZWJQYXJhbS5zZXROYW1lKCJjaGFuZ2VkIik7DQotCQlhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnRFcXVhbHMoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygxLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQlJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZSA9IGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBwYXJhbVZhbHVlLmdldFBhcmFtKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJjaGFuZ2VkIiwgcGFyYW1WYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwkJDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25QYXJ0TmFtZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJd3NNZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLlJQQyk7DQotCQl3ZWJQYXJhbS5zZXRQYXJ0TmFtZSgiYXJnMCIpOw0KLQkJSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0RXF1YWxzKFdQX0FOTk9UQVRJT04sIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJDQotCQkvLyBpbiBoZWFkZXIgY2FzZQ0KLQkJd2ViUGFyYW0uc2V0UGFydE5hbWUoImNoYW5nZWQiKTsNCi0JCWFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhXUF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlID0gYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscygicGFydE5hbWUiLCBwYXJhbVZhbHVlLmdldFBhcmFtKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJjaGFuZ2VkIiwgcGFyYW1WYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwkJDQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlTmFtZUNoYW5nZXNQYXJ0TmFtZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJcmVzb3VyY2UuZW5hYmxlU2F2aW5nKCk7DQotCQl3ZWJQYXJhbS5zZXROYW1lKCJjaGFuZ2VkIik7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RQYXJhbShtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcih3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKSwgV1BfQU5OT1RBVElPTik7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOw0KLQkJYXNzZXJ0RXF1YWxzKCJjaGFuZ2VkIiwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIikpOw0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgicGFydE5hbWUiKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VOYW1lRG9lc05vdENoYW5nZVBhcnROYW1lSWZQYXJ0TmFtZUluQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJbWV0aG9kID0gc2VpVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIG1ldGhvZDEoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW0xXCIsIHBhcnROYW1lPVwicGFyYW0xUGFydFwiKSBpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3c01ldGhvZCA9IHRlc3RVdGlsLmZpbmRXZWJNZXRob2RCeU5hbWUoc2VpLCAibWV0aG9kMSIpOw0KLQkJd2ViUGFyYW0gPSB0ZXN0VXRpbC5maW5kUGFyYW0od3NNZXRob2QsICJwYXJhbTEiKTsNCi0JCXdzTWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJcmVzb3VyY2UuZW5hYmxlU2F2aW5nKCk7DQotCQl3ZWJQYXJhbS5zZXROYW1lKCJ0ZXN0Iik7DQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0UGFyYW0obWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSksIFdQX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscygicGFyYW0xUGFydCIsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgicGFydE5hbWUiKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25UYXJnZXROUygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJd3NNZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLlJQQyk7DQotCQl3ZWJQYXJhbS5zZXRUYXJnZXROYW1lc3BhY2UoImh0dHA6Ly9jb20uc2FwL3Rlc3QiKTsNCi0JCUlBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhXUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJLy8gY2hhbmdlZCB0YXJnZXQgbmFtZXNwYWNlIGNhc2UNCi0JCXdlYlBhcmFtLnNldFRhcmdldE5hbWVzcGFjZSgiaHR0cDovL2NoYW5nZWQiKTsNCi0JCWFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhXUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlID0gYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscygidGFyZ2V0TmFtZXNwYWNlIiwgcGFyYW1WYWx1ZS5nZXRQYXJhbSgpKTsNCi0JCWFzc2VydEVxdWFscygiaHR0cDovL2NoYW5nZWQiLCBwYXJhbVZhbHVlLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7CQkNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJd3NNZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCXdlYlBhcmFtLnNldE5hbWUoImNoYW5nZWQiKTsNCi0JCXdlYlBhcmFtLnNldEtpbmQoV2ViUGFyYW1LaW5kLklOT1VUKTsNCi0JCXdlYlBhcmFtLnNldFBhcnROYW1lKCJkaWZmZXJlbnQiKTsNCi0JCXdlYlBhcmFtLnNldEhlYWRlcih0cnVlKTsNCi0JCXJlc291cmNlLmVuYWJsZVNhdmluZygpOw0KLQkJd2ViUGFyYW0uc2V0VGFyZ2V0TmFtZXNwYWNlKCJodHRwOi8vY2hhbmdlZC90ZXJnZXQvbnMiKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubm90YXRpb24gPSBpbnNwZWN0b3IuaW5zcGVjdFBhcmFtKG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpLCBXUF9BTk5PVEFUSU9OKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7DQotCQlhc3NlcnRFcXVhbHMoNCwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJjaGFuZ2VkIiwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIikpOw0KLQkJYXNzZXJ0VHJ1ZShXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9JTk9VVC5lbmRzV2l0aChhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm1vZGUiKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vY2hhbmdlZC90ZXJnZXQvbnMiLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInRhcmdldE5hbWVzcGFjZSIpKTsNCi0NCi0JCXdzTWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJd2ViUGFyYW0uc2V0UGFydE5hbWUoImRpZmZlcmVudCIpOw0KLQkJLy8gY3JlYXRlIG5ldyBpbnNwZWN0b3IgY2F1c2Ugc291cmNlIGhhcyBiZWVuIGNoYW5nZWQNCi0JCWluc3BlY3RvciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3Ioc2VpVHlwZSk7DQotCQlhbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RQYXJhbShtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcih3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKSwgV1BfQU5OT1RBVElPTik7DQotCQlhc3NlcnRFcXVhbHMoNSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJkaWZmZXJlbnQiLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBhcnROYW1lIikpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlBbm5vdGF0aW9uUmVtb3ZlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJbWV0aG9kID0gc2VpVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIG1ldGhvZDEoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW0xXCIpIGludCBwYXJhbTEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdzTWV0aG9kID0gdGVzdFV0aWwuZmluZFdlYk1ldGhvZEJ5TmFtZShzZWksICJtZXRob2QxIik7DQotCQl3ZWJQYXJhbSA9IHRlc3RVdGlsLmZpbmRQYXJhbSh3c01ldGhvZCwgInBhcmFtMSIpOw0KLQkJcmVzb3VyY2UuZW5hYmxlU2F2aW5nKCk7DQotCQl3ZWJQYXJhbS5zZXROYW1lKCJhcmcwIik7DQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj5hbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RQYXJhbShtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcih3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKSwgV1BfQU5OT1RBVElPTik7DQotCQlhc3NlcnROdWxsKCJFbXB0eSBhbm5vdGF0aW9uIGhhcyBub3QgYmVlbiByZW1vdmVkIiwgYW5ub3RhdGlvbik7DQotCX0NCi0NCi0JcHJvdGVjdGVkIGNsYXNzIE15UGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlcg0KLQl7DQotCQlwdWJsaWMgTXlQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSB7DQotCQkJc3VwZXIocmVzb3VyY2UpOw0KLQkJfQ0KLQ0KLQkJcHVibGljIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gc3VwZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlaVNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VpU2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzODQxZDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VpU2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLlNlaVNlcmlhbGl6ZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgU2VpU2VyaWFsaXplckFkYXB0ZXJ9IGNsYXNzOw0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpU2VyaWFsaXplckFkYXB0ZXJUZXN0IGV4dGVuZHMgU2VyaWFsaXplckFkYXB0ZXJUZXN0Rml4dHVyZSANCi17DQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVJQW5ub3RhdGlvbklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRyeSB7DQotCQkJbmV3IE15U2VpU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKW51bGwsIHByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhTW9kZWwoKSk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gXykge30NCi0JCQ0KLQkJdHJ5IHsNCi0JCQluZXcgTXlTZWlTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSkuY3JlYXRlSUFubm90YXRpb24oc2VpLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKSB7fQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVJQW5ub3RhdGlvbkV4cGxpY2l0U2VpKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9ICBuZXcgTXlTZWlTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSkuY3JlYXRlSUFubm90YXRpb24oc2VpLCBwcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuZ2V0SmF2YU1vZGVsKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDIsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscyhUQVJHRVRfTkFNRVNQQUNFLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUpKTsNCi0JCWFzc2VydEVxdWFscyhQT1JUX1RZUEVfTkFNRSwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKSk7DQotCQlhc3NlcnRFcXVhbHMoc2VpVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgKChJVHlwZSlhbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUlBbm5vdGF0aW9uSW1wbGljaXRTZWkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gbmV3IE15U2VpU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKHdzSW1wbGljaXQuZ2V0U2VydmljZUVuZHBvaW50KCksIHByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhTW9kZWwoKSk7DQotCQlhc3NlcnRFcXVhbHMoNSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJV3NTZXJpYWxpemVyQWRhcHRlclRlc3QuY2hlY2tJV2ViU2VydmljZUlBbm5vdGF0aW9uKGFubm90YXRpb24pOw0KLQkJYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdE5hbWUiLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEUpKTsNCi0JCWFzc2VydEVxdWFscyhpbXBsQmVhbkltcGxpY2l0LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCAoKElUeXBlKWFubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUlBbm5vdGF0aW9uRGVmYXVsdFZhbHVlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJc2VpLnNldE5hbWUoIlNFSSIpOw0KLQkJc2VpLnNldFRhcmdldE5hbWVzcGFjZSgiaHR0cDovL3Rlc3QvIik7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gbmV3IE15U2VpU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKHNlaSwgcHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFNb2RlbCgpKTsNCi0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmVzb3VyY2UuZ2V0U2VyaWFsaXplckZhY3RvcnkoKS5hZGFwdChzZWksIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7DQotCQlzZWkuc2V0TmFtZSgiQ2hhbmdlZFNlaU5hbWUiKTsNCi0JCQ0KLQkJSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihzZWlUeXBlKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBmb3VuZCA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShXU19BTk5PVEFUSU9OKTsNCi0JCWFzc2VydE5vdE51bGwoZm91bmQpOw0KLQkJYXNzZXJ0RXF1YWxzKCJDaGFuZ2VkU2VpTmFtZSIsIGZvdW5kLmdldFByb3BlcnR5VmFsdWUoTkFNRV9BVFRSSUJVVEUpKTsNCi0JCWFzc2VydEVxdWFscyhUQVJHRVRfTkFNRVNQQUNFLCBmb3VuZC5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBjbGFzcyBNeVNlaVNlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgU2VpU2VyaWFsaXplckFkYXB0ZXINCi0Jew0KLQkJcHVibGljIE15U2VpU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgew0KLQkJCXN1cGVyKHJlc291cmNlKTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gY3JlYXRlSUFubm90YXRpb24oZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQkJew0KLQkJCXJldHVybiBzdXBlci5jcmVhdGVJQW5ub3RhdGlvbihzZWksIGphdmFNb2RlbCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjUzMzk0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgV3NTZXJpYWxpemVyQWRhcHRlckZhY3Rvcnl9IGNsYXNzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5VGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZTsNCi0JcHJpdmF0ZSBTZXJpYWxpemVyQWRhcHRlckZhY3RvcnkgZmFjdG9yeTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCU1vY2s8SUphdmFNb2RlbD4gamF2YU1vZGVsTW9jayA9IG1vY2soSUphdmFNb2RlbC5jbGFzcyk7DQotCQlyZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbE1vY2sucHJveHkoKSk7DQotCQlmYWN0b3J5ID0gcmVzb3VyY2UuZ2V0U2VyaWFsaXplckZhY3RvcnkoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNGYWN0b3J5Rm9yVHlwZSgpCQ0KLQl7CQkNCi0JCWFzc2VydFRydWUoZmFjdG9yeS5pc0ZhY3RvcnlGb3JUeXBlKElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcykpOw0KLQkJYXNzZXJ0RmFsc2UoZmFjdG9yeS5pc0ZhY3RvcnlGb3JUeXBlKE5vdGlmaWNhdGlvbi5jbGFzcykpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RBZGFwdFdlYlNlcnZpY2UoKQ0KLQl7DQotCQlJV2ViU2VydmljZSB3ZWJTZXJ2aWNlID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCUFkYXB0ZXIgYWRhcHRlcjEgPSBmYWN0b3J5LmFkYXB0KHdlYlNlcnZpY2UsIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd2ViU2VydmljZS5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQkJDQotCQlBZGFwdGVyIGFkYXB0ZXIyID0gZmFjdG9yeS5hZGFwdCh3ZWJTZXJ2aWNlLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdlYlNlcnZpY2UuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyMT09YWRhcHRlcjIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRhcHRTZWkoKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCUFkYXB0ZXIgYWRhcHRlcjEgPSBmYWN0b3J5LmFkYXB0KHNlaSwgSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzKTsNCi0JCWFzc2VydEVxdWFscygxLCBzZWkuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJQWRhcHRlciBhZGFwdGVyMiA9IGZhY3RvcnkuYWRhcHQoc2VpLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHNlaS5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIxPT1hZGFwdGVyMik7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlcmlhbGl6ZXJBZGFwdGVyVGVzdEZpeHR1cmUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlcmlhbGl6ZXJBZGFwdGVyVGVzdEZpeHR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDBmY2ZmMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZXJpYWxpemVyQWRhcHRlclRlc3RGaXh0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuRG9tVGVzdFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcmlhbGl6ZXJBZGFwdGVyVGVzdEZpeHR1cmUgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTX0FOTk9UQVRJT04gPSAiamF2YXguandzLldlYlNlcnZpY2UiOwkNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FID0gIk15U2VydmljZSI7DQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfVFlQRV9OQU1FID0gIk15UG9ydFR5cGUiOw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUUgPSAiTXlQb3J0IjsNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRSA9ICJodHRwOi8vY29tLnNhcC90ZXN0IjsNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9MT0NBVElPTiA9ICJDOi90ZXN0L3dzZGwvbG9jYXRpb24iOw0KLQkNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlIHdzOw0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2Ugd3NJbXBsaWNpdDsNCi0JDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTsNCi0JcHJvdGVjdGVkIFRlc3RQcm9qZWN0IHByb2plY3Q7DQotCXByb3RlY3RlZCBJVHlwZSBpbXBsQmVhblR5cGU7DQotCXByb3RlY3RlZCBJVHlwZSBpbXBsQmVhbkltcGxpY2l0Ow0KLQlwcm90ZWN0ZWQgSVR5cGUgc2VpVHlwZTsNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3Q7DQotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOw0KLQlwcm90ZWN0ZWQgRG9tVGVzdFV0aWxzIHRlc3RVdGlsID0gbmV3IERvbVRlc3RVdGlscygpOw0KLQlwcm90ZWN0ZWQgRG9tVXRpbCBkb21VdGlsID0gbmV3IERvbVV0aWwoKTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJcHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdCgpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gcHJvamVjdC5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudCgidGVzdCIsIHRydWUsIG51bGwpOw0KLQkJc2VpVHlwZSA9IHByb2plY3QuY3JlYXRlVHlwZShwYWNrLCAiU0VJLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJNeVBvcnRUeXBlXCIsIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9jb20uc2FwL3Rlc3RcIilcbiIgKw0KLQkJCQkicHVibGljIGludGVyZmFjZSBTRUkge30iKTsNCi0JCWltcGxCZWFuVHlwZSA9IHByb2plY3QuY3JlYXRlVHlwZShwYWNrLCAiSW1wbEJlYW4uamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2U9XCJ0ZXN0LlNFSVwiLCAiICsNCi0JCQkJInNlcnZpY2VOYW1lPVwiTXlTZXJ2aWNlXCIsIHBvcnROYW1lPVwiTXlQb3J0XCIsIHdzZGxMb2NhdGlvbj1cIkM6L3Rlc3Qvd3NkbC9sb2NhdGlvblwiLCB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vY29tLnNhcC90ZXN0XCIpIiArDQotCQkJCSJwdWJsaWMgY2xhc3MgSW1wbEJlYW4ge30iKTsNCi0JCQ0KLQkJaW1wbEJlYW5JbXBsaWNpdCA9IHByb2plY3QuY3JlYXRlVHlwZShwYWNrLCAiSW1wbGljaXRJbXBsQmVhbi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXROYW1lXCIsICIgKw0KLQkJCQkic2VydmljZU5hbWU9XCJNeVNlcnZpY2VcIiwgcG9ydE5hbWU9XCJNeVBvcnRcIiwgd3NkbExvY2F0aW9uPVwiQzovdGVzdC93c2RsL2xvY2F0aW9uXCIsIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9jb20uc2FwL3Rlc3RcIikiICsNCi0JCSJwdWJsaWMgY2xhc3MgSW1wbGljaXRJbXBsQmVhbiB7fSIpOwkJDQotCQkNCi0JCWFzc2VydE5vdE51bGwoc2VpVHlwZSk7DQotCQlhc3NlcnROb3ROdWxsKGltcGxCZWFuVHlwZSk7DQotCQlyZXNvdXJjZSA9IGNyZWF0ZVRhcmdldCgpOwkNCi0JCXJlc291cmNlLmxvYWQobnVsbCk7DQotCQkNCi0JCXdzUHJvamVjdCA9IHJlc291cmNlLmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLmdldCgwKTsNCi0JCXNlaSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcm9qZWN0LCAidGVzdC5TRUkiKTsNCi0JCXdzID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJvamVjdCwgInRlc3QuSW1wbEJlYW4iKTsNCi0JCXdzSW1wbGljaXQgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcm9qZWN0LCAidGVzdC5JbXBsaWNpdEltcGxCZWFuIik7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpDQotCXsNCi0JCXRyeSB7DQotCQkJcHJvamVjdC5kaXNwb3NlKCk7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gXykgew0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgY3JlYXRlVGFyZ2V0KCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKHByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhTW9kZWwoKSkgDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZVByb2plY3QoSUphdmFQcm9qZWN0IHByaikgDQotCQkJew0KLQkJCQlpZiAocHJqLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCX0NCi0NCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX07DQotCX0JCQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9Xc1NlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvV3NTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjNlYTBlZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9Xc1NlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlBPUlRfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuU0VSVklDRV9OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU0RMX0xPQ0FUSU9OX0FUVFJJQlVURTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5Xc1NlcmlhbGl6ZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgV3NTZXJpYWxpemVyQWRhcHRlcn0gY2xhc3MuIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV3NTZXJpYWxpemVyQWRhcHRlclRlc3QgZXh0ZW5kcyBTZXJpYWxpemVyQWRhcHRlclRlc3RGaXh0dXJlDQotew0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSUFubm90YXRpb25JV2ViU2VydmljZU5wZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdHJ5IHsNCi0JCQluZXcgTXlXc1NlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKS5jcmVhdGVJQW5ub3RhdGlvbigoSVdlYlNlcnZpY2UpbnVsbCwgcHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFNb2RlbCgpKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKSB7fQ0KLQkJDQotCQl0cnkgew0KLQkJCW5ldyBNeVdzU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKHdzLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKSB7fQkJDQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSUFubm90YXRpb25JV2ViU2VydmljZUV4cGxpY2l0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IG5ldyBNeVdzU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKHdzLCBwcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuZ2V0SmF2YU1vZGVsKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDUsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCWNoZWNrSVdlYlNlcnZpY2VJQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLkVORFBPSU5UX0lOVEVSRkFDRV9BVFRSSUJVVEUpKTsNCi0JCWFzc2VydEVxdWFscyhpbXBsQmVhblR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksICgoSVR5cGUpYW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVJQW5ub3RhdGlvbklXZWJTZXJ2aWNlSW1wbGljaXQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gbmV3IE15V3NTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSkuY3JlYXRlSUFubm90YXRpb24od3NJbXBsaWNpdCwgcHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFNb2RlbCgpKTsNCi0JCWFzc2VydEVxdWFscyg1LCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQljaGVja0lXZWJTZXJ2aWNlSUFubm90YXRpb24oYW5ub3RhdGlvbik7DQotCQkNCi0JCWFzc2VydEVxdWFscygiSW1wbGljaXROYW1lIiwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFKSk7CQkNCi0JCWFzc2VydEVxdWFscyhpbXBsQmVhbkltcGxpY2l0LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCAoKElUeXBlKWFubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSUFubm90YXRpb25JV2ViU2VydmljZURlZmF1bHQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJlc291cmNlLmRpc2FibGVTYXZpbmcoKTsNCi0JCXdzSW1wbGljaXQuZ2V0U2VydmljZUVuZHBvaW50KCkuc2V0TmFtZSgiSW1wbGljaXRJbXBsQmVhbiIpOw0KLQkJd3NJbXBsaWNpdC5zZXROYW1lKCJJbXBsaWNpdEltcGxCZWFuU2VydmljZSIpOw0KLQkJd3NJbXBsaWNpdC5zZXRQb3J0TmFtZSgiSW1wbGljaXRJbXBsQmVhblBvcnQiKTsNCi0JCXdzSW1wbGljaXQuc2V0VGFyZ2V0TmFtZXNwYWNlKCJodHRwOi8vdGVzdC8iKTsNCi0JCXdzSW1wbGljaXQuc2V0V3NkbExvY2F0aW9uKG51bGwpOw0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9bmV3IE15V3NTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSkuY3JlYXRlSUFubm90YXRpb24od3NJbXBsaWNpdCwgcHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFNb2RlbCgpKTsNCi0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmVzb3VyY2UuZ2V0U2VyaWFsaXplckZhY3RvcnkoKS5hZGFwdCh3cywgSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzKTsNCi0JCXdzLnNldE5hbWUoIkNoYW5nZWRTZXJ2aWNlIik7DQotCQkNCi0JCUlBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoaW1wbEJlYW5UeXBlKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBmb3VuZCA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShXU19BTk5PVEFUSU9OKTsNCi0JCWFzc2VydE5vdE51bGwoZm91bmQpOw0KLQkJYXNzZXJ0RXF1YWxzKCJDaGFuZ2VkU2VydmljZSIsIGZvdW5kLmdldFByb3BlcnR5VmFsdWUoU0VSVklDRV9OQU1FX0FUVFJJQlVURSkpOw0KLQkJYXNzZXJ0RXF1YWxzKFBPUlRfTkFNRSwgZm91bmQuZ2V0UHJvcGVydHlWYWx1ZShQT1JUX05BTUVfQVRUUklCVVRFKSk7DQotCQlhc3NlcnRFcXVhbHMoVEFSR0VUX05BTUVTUEFDRSwgZm91bmQuZ2V0UHJvcGVydHlWYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSkpOw0KLQkJYXNzZXJ0RXF1YWxzKFdTRExfTE9DQVRJT04sIGZvdW5kLmdldFByb3BlcnR5VmFsdWUoV1NETF9MT0NBVElPTl9BVFRSSUJVVEUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrSVdlYlNlcnZpY2VJQW5ub3RhdGlvbihJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uKQ0KLQl7DQotCQlib29sZWFuIFtdIGZvdW5kID0ge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlfTsNCi0JCVN0cmluZyBbXSBwYXJhbXMgPSB7InNlcnZpY2VOYW1lIiwgInBvcnROYW1lIiwgInRhcmdldE5hbWVzcGFjZSIsICJ3c2RsTG9jYXRpb24iIH07DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkpIA0KLQkJew0KLQkJCVN0cmluZyBwYXJhbSA9IHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCk7DQotCQkJaWYgKHBhcmFtLmVxdWFscyhXU0Fubm90YXRpb25GZWF0dXJlcy5TRVJWSUNFX05BTUVfQVRUUklCVVRFKSkgew0KLQkJCQlhc3NlcnRFcXVhbHMoU0VSVklDRV9OQU1FLCBwYXJhbVZhbHVlUGFpci5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOw0KLQkJCQlmb3VuZFswXSA9IHRydWU7DQotCQkJfQ0KLQkJCWlmIChwYXJhbS5lcXVhbHMoV1NBbm5vdGF0aW9uRmVhdHVyZXMuUE9SVF9OQU1FX0FUVFJJQlVURSkpIHsNCi0JCQkJYXNzZXJ0RXF1YWxzKFBPUlRfTkFNRSwgcGFyYW1WYWx1ZVBhaXIuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsNCi0JCQkJZm91bmRbMV0gPSB0cnVlOw0KLQkJCX0NCi0JCQlpZiAocGFyYW0uZXF1YWxzKFdTQW5ub3RhdGlvbkZlYXR1cmVzLlRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKSkgew0KLQkJCQlhc3NlcnRFcXVhbHMoVEFSR0VUX05BTUVTUEFDRSwgcGFyYW1WYWx1ZVBhaXIuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsNCi0JCQkJZm91bmRbMl0gPSB0cnVlOw0KLQkJCX0NCi0JCQlpZiAocGFyYW0uZXF1YWxzKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTRExfTE9DQVRJT05fQVRUUklCVVRFKSkgew0KLQkJCQlhc3NlcnRFcXVhbHMoV1NETF9MT0NBVElPTiwgcGFyYW1WYWx1ZVBhaXIuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsNCi0JCQkJZm91bmRbM10gPSB0cnVlOw0KLQkJCX0JCQkNCi0JCX0NCi0JCQ0KLQkJZm9yIChpbnQgaT0wOyBpIDwgZm91bmQubGVuZ3RoOyBpKyspIA0KLQkJew0KLQkJCWFzc2VydFRydWUoIkFubm90YXRpb24gcGFyYW0gIiArIHBhcmFtc1tpXSArICIgbm90IGZvdW5kIiwgZm91bmRbaV0pOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlXc1NlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgV3NTZXJpYWxpemVyQWRhcHRlcg0KLQl7DQotCQlwdWJsaWMgTXlXc1NlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UpIHsNCi0JCQlzdXBlcihyZXNvdXJjZSk7DQotCQl9DQotDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBjcmVhdGVJQW5ub3RhdGlvbihmaW5hbCBJV2ViU2VydmljZSB3cywgZmluYWwgSUphdmFNb2RlbCBqYXZhTW9kZWwpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JCXsNCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlSUFubm90YXRpb24od3MsIGphdmFNb2RlbCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL01ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL01ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTg1YWRiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9NZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLk1ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUuUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIENsYXNzIGNvbnRhaW5pbmcgdGVzdHMgZm9yIHtAbGluayBNZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlcn0NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIHdtOw0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIHdzOw0KLQlwcml2YXRlIElQcm9wZXJ0eVN0YXRlIGFkYXB0ZXI7IA0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKQkNCi0Jew0KLQkJd20gPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCk7DQotCQl3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQkNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOw0KLQkJc2VpLmdldFdlYk1ldGhvZHMoKS5hZGQod20pOw0KLQkJc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuYWRkKHdzKTsNCi0JCWFkYXB0ZXIgPSAoSVByb3BlcnR5U3RhdGUpUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdtLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlhc3NlcnROb3ROdWxsKGFkYXB0ZXIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFuZ2VibGVPdXRzaWRlSW5XcygpIA0KLQl7DQotCQl3cy5zZXRXc2RsTG9jYXRpb24oIkM6L3Rlc3Qvd3NkbC9sb2NhdGlvbiIpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19FWENMVURFRCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYW5nYWJsZSgpDQotCXsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19FWENMVURFRCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1BhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1BhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyODQyMjA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3RhdGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZS5QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByaXZhdGUgUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXIgYWRhcHRlcjs7DQotCXByaXZhdGUgSVdlYlBhcmFtIHBhcmFtOw0KLQlwcml2YXRlIElXZWJNZXRob2QgbWV0aG9kOw0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0JewkJDQotCQlzZWkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQltZXRob2QgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCk7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZS5MSVRFUkFMKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7DQotCQlzZWkuZ2V0V2ViTWV0aG9kcygpLmFkZChtZXRob2QpOw0KLQkJDQotCQlwYXJhbSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJQYXJhbSgpOw0KLQkJcGFyYW0uZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAidGVzdFBhcmFtIik7DQotCQlwYXJhbS5zZXROYW1lKCJ0ZXN0UGFyYW0iKTsNCi0JCW1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuYWRkKHBhcmFtKTsNCi0JCQ0KLQkJYWRhcHRlciA9IG5ldyBQYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlcigpOw0KLQkJYWRhcHRlci5zZXRUYXJnZXQocGFyYW0pOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFnZWJsZU5hbWVDb3JyZWN0U29hcEJpbmRpbmcoKQ0KLQl7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFnZWJsZU5hbWVJbmNvcnJlY3RTb2FwQmluZGluZygpDQotCXsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJDQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZS5FTkNPREVEKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJDQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UuTElURVJBTCk7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFnZWJsZU5hbWVQYXJhbUluSGVhZGVyKCkNCi0Jew0KLQkJcGFyYW0uc2V0SGVhZGVyKHRydWUpOw0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsJCQ0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhZ2VibGVUYXJnZXROU0NvcnJlY3RTb2FwQmluZGluZygpDQotCXsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYWdlYmxlVGFyZ2V0TlNJbmNvcnJlY3RTb2FwQmluZGluZygpDQotCXsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQkJDQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZS5FTkNPREVEKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQkJDQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UuTElURVJBTCk7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYWdlYmxlVGFyZ2V0TlNQYXJhbUluSGVhZGVyKCkNCi0Jew0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCQlwYXJhbS5zZXRIZWFkZXIodHJ1ZSk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhZ2VibGVQYXJ0TmFtZUNvcnJlY3RTb2FwQmluZGluZygpDQotCXsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsJCQ0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1BBUlRfTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFnZWJsZVBhcnROYW1lSW5jb3JyZWN0U29hcEJpbmRpbmcoKQ0KLQl7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1BBUlRfTkFNRSkpOw0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19QQVJUX05BTUUpKTsNCi0JCQ0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwpOw0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYWdlYmxlVGFyZ2V0TlNIZWFkZXIoKSANCi0Jew0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19IRUFERVIpKTsNCi0NCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fSEVBREVSKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5QYXJhbU5vdEVkaXRhYmxlKCkNCi0Jew0KLQkJcGFyYW0uZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAicmV0dXJuIik7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JCQ0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOwkJDQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE91dHNpZGVJbldlYlNlcnZpY2UoKQ0KLQl7DQotCQlJV2ViU2VydmljZSB3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQl3cy5zZXRXc2RsTG9jYXRpb24oIkM6L3Rlc3Qvd3NkbC9sb2NhdGlvbiIpOw0KLQkJc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuYWRkKHdzKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19QQVJUX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQkJDQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLlJQQyk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1Byb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWJjYmZjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLlByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLlNlaVByb3BlcnR5U3RhdGVBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUuV3NQcm9wZXJ0eVN0YXRlQWRhcHRlcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeX0gY2xhc3MNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNGYWN0b3J5Rm9yVHlwZSgpCQ0KLQl7CQkNCi0JCWFzc2VydFRydWUoUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmlzRmFjdG9yeUZvclR5cGUoSVByb3BlcnR5U3RhdGUuY2xhc3MpKTsNCi0JCWFzc2VydEZhbHNlKFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5pc0ZhY3RvcnlGb3JUeXBlKE5vdGlmaWNhdGlvbi5jbGFzcykpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RBZGFwdFdlYlNlcnZpY2UoKQ0KLQl7DQotCQlJV2ViU2VydmljZSB3ZWJTZXJ2aWNlID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCUFkYXB0ZXIgYWRhcHRlcjEgPSBQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod2ViU2VydmljZSwgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdlYlNlcnZpY2UuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlcjEgaW5zdGFuY2VvZiBXc1Byb3BlcnR5U3RhdGVBZGFwdGVyKTsNCi0JCQ0KLQkJQWRhcHRlciBhZGFwdGVyMiA9IFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3ZWJTZXJ2aWNlLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd2ViU2VydmljZS5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIxPT1hZGFwdGVyMik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RBZGFwdFNlaSgpDQotCXsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOw0KLQkJQWRhcHRlciBhZGFwdGVyMSA9IFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChzZWksIElQcm9wZXJ0eVN0YXRlLmNsYXNzKTsNCi0JCWFzc2VydEVxdWFscygxLCBzZWkuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlcjEgaW5zdGFuY2VvZiBTZWlQcm9wZXJ0eVN0YXRlQWRhcHRlcik7DQotCQkNCi0JCUFkYXB0ZXIgYWRhcHRlcjIgPSBQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQoc2VpLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgc2VpLmVBZGFwdGVycygpLnNpemUoKSk7DQotCQkNCi0JCWFzc2VydFRydWUoYWRhcHRlcjE9PWFkYXB0ZXIyKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3OTU2NTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1NlaVByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlTdGF0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLlByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBUZXN0IGZvciB7QCBTZWlQcm9wZXJ0eVN0YXRlQWRhcHRlcn0gY2xhc3MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7DQotCXByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7IA0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlzZWkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQl3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQlzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5hZGQod3MpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQWRhcHRlZCgpDQotCXsNCi0JCUlQcm9wZXJ0eVN0YXRlIGFkYXB0ZXIgPSAoSVByb3BlcnR5U3RhdGUpUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHNlaSwgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFuZ2VhYmxlT3V0c2lkZUluKCkgDQotCXsNCi0JCXdzLnNldFdzZGxMb2NhdGlvbigiQzovdGVzdCIpOw0KLQkJSVByb3BlcnR5U3RhdGUgYWRhcHRlciA9IChJUHJvcGVydHlTdGF0ZSlQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQoc2VpLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhbmdlYWxiZUluT3V0SW1wbGljaXRJbnRlcmZhY2UoKQ0KLQl7DQotCQlzZWkuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQsIEJvb2xlYW4uVFJVRSk7DQotCQkNCi0JCUlQcm9wZXJ0eVN0YXRlIGFkYXB0ZXIgPSAoSVByb3BlcnR5U3RhdGUpUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHNlaSwgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhbmdlYWJsZUluT3V0RXhwbGljaXRJbnRlcmZhY2UoKQ0KLQl7DQotCQlJUHJvcGVydHlTdGF0ZSBhZGFwdGVyID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChzZWksIElQcm9wZXJ0eVN0YXRlLmNsYXNzKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvV3NQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMTE5Njg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlTdGF0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLlByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLldzUHJvcGVydHlTdGF0ZUFkYXB0ZXI7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBXc1Byb3BlcnR5U3RhdGVBZGFwdGVyfSBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFdzUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpCXsNCi0JCXdzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQWRhcHRlZCgpIA0KLQl7DQotCQlJUHJvcGVydHlTdGF0ZSBhZGFwdGVyID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3cywgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFuZ2VibGVPdXRzaWRlSW5XcygpIA0KLQl7DQotCQl3cy5zZXRXc2RsTG9jYXRpb24oIkM6L3Rlc3QiKTsNCi0JCUlQcm9wZXJ0eVN0YXRlIGFkYXB0ZXIgPSAoSVByb3BlcnR5U3RhdGUpUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdzLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotDQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19QT1JUX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04pKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhbmdhYmxlSW5PdXQoKQ0KLQl7DQotCQlJUHJvcGVydHlTdGF0ZSBhZGFwdGVyID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3cywgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYW5nZWJsZU5vbldzSW5zdGFuY2UoKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCUlQcm9wZXJ0eVN0YXRlIGFkYXB0ZXIgPSAoSVByb3BlcnR5U3RhdGUpUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdzLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQkoKEFkYXB0ZXIpYWRhcHRlcikuc2V0VGFyZ2V0KHNlaSk7DQotDQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsJCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1vZGVsU3luY2hyb25pemVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZjhmZmJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlLlNlcnZpY2VNb2RlbERhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jLkFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyfSBjbGFzcywgbWV0aG9kcyBub3QgY292ZXJlZCBpbiB0aGlzIHRlc3QNCi0gKiBhcmUgY292ZXJlZCBpbXBsaWNpdGx5IGJ5IHtAbGluayBNb2RlbFN5bmNocm9uaXphdGlvblRlc3RzfS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotew0KLQlwcml2YXRlIEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0ZXIgbW9kZWxTeW5jOw0KLQlwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2U7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlNb2NrPElKYXZhTW9kZWw+IGphdmFNb2RlbE1vY2sgPSBtb2NrKElKYXZhTW9kZWwuY2xhc3MpOw0KLQkJcmVzb3VyY2UgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWxNb2NrLnByb3h5KCkpOw0KLQkJDQotCQltb2RlbFN5bmMgPSBuZXcgQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplclRlc3RlcihyZXNvdXJjZSwgcmVzb3VyY2UubmV3IFNlcnZpY2VNb2RlbERhdGEoKSl7fTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFByb2Nlc3NDb21waWxhdGlvblVuaXRFZGl0RW5hYmxlZERlc3BpdGVOUEUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlhc3NlcnRUcnVlKHJlc291cmNlLmlzU2F2ZUVuYWJsZWQoKSk7DQotCQl0cnkgew0KLQkJCW1vZGVsU3luYy5wcm9jZXNzQ29tcGlsYXRpb25Vbml0KG51bGwsIG51bGwpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gXykgew0KLQkJfQ0KLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5pc1NhdmVFbmFibGVkKCkpOw0KLQl9CQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzQ29tcGlsYXRpb25Vbml0RWRpdEVuYWJsZWROb3JtYWxFeGVjdXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlhc3NlcnRUcnVlKHJlc291cmNlLmlzU2F2ZUVuYWJsZWQoKSk7DQotCQlNb2NrPElDb21waWxhdGlvblVuaXQ+IGN1TW9jayA9IG1vY2soSUNvbXBpbGF0aW9uVW5pdC5jbGFzcyk7DQotCQljdU1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZmluZFByaW1hcnlUeXBlIikud2lsbChyZXR1cm5WYWx1ZShudWxsKSk7CQkJDQotCQltb2RlbFN5bmMucHJvY2Vzc0NvbXBpbGF0aW9uVW5pdChudWxsLCBjdU1vY2sucHJveHkoKSk7DQotCQlhc3NlcnRUcnVlKHJlc291cmNlLmlzU2F2ZUVuYWJsZWQoKSk7DQotCX0JCQkNCi0JDQotCXB1YmxpYyBjbGFzcyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyVGVzdGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplcg0KLQl7DQotCQlwdWJsaWMgQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplclRlc3RlcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlLCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKSB7DQotCQkJc3VwZXIocmVzb3VyY2UsIHNlcnZpY2VEYXRhKTsNCi0JCX0NCi0JCQ0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbXBpbGF0aW9uVW5pdChmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCQl7DQotCQkJc3VwZXIucHJvY2Vzc0NvbXBpbGF0aW9uVW5pdCh3c1Byb2plY3QsIGN1KTsNCi0JCX0JCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL0ltcGxpY2l0U2VpTWV0aG9kU3luY2hyb25pemF0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL0ltcGxpY2l0U2VpTWV0aG9kU3luY2hyb25pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWU5NzMzNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9JbXBsaWNpdFNlaU1ldGhvZFN5bmNocm9uaXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JUHJvamVjdFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5Eb21UZXN0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icy5Kb2JVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBJbXBsaWNpdFNlaU1ldGhvZFN5bmNocm9uaXphdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UNCi17DQotDQotCXByaXZhdGUgVGVzdFByb2plY3QgdGVzdFByajE7DQotDQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXQ7DQotDQotCXByaXZhdGUgSUphdmFNb2RlbCBqYXZhTW9kZWw7DQotDQotCXByaXZhdGUgSVR5cGUgYmFzZUNsYXNzV2l0aFdzQW5ub3Q7DQotDQotCXByaXZhdGUgSVR5cGUgYmFzZUNsYXNzV2l0aG91dFdzQW5ub3Q7DQotDQotCXByaXZhdGUgSVR5cGUgd3NDbGFzczsNCi0NCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcmoxOw0KLQ0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIHdzMTsNCi0NCi0JcHJpdmF0ZSBEb21UZXN0VXRpbHMgdXRpbCA9IG5ldyBEb21UZXN0VXRpbHMoKTsNCi0JcHJpdmF0ZSBEb21VdGlsIGRvbVV0aWwgPSBuZXcgRG9tVXRpbCgpOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgd3MxSW1wbE5hbWUgPSAiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuV1MxIjsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JCXRhcmdldCA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbCkNCi0JCXsNCi0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgSVByb2plY3RTZWxlY3RvcltdIGdldFByb2plY3RTZWxlY3RvcnMoKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIG5ldyBJUHJvamVjdFNlbGVjdG9yW10geyBuZXcgSVByb2plY3RTZWxlY3RvcigpDQotCQkJCXsNCi0NCi0JCQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikNCi0JCQkJCXsNCi0JCQkJCQlyZXR1cm4gcHJqLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJCQl9DQotCQkJCX0gfTsNCi0JCQl9DQotDQotCQl9Ow0KLQkJdGVzdFByajEgPSBuZXcgVGVzdFByb2plY3QoIlRlc3RQcm9qZWN0MSIpOw0KLQkJdGVzdFByajEuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxIik7DQotDQotCQliYXNlQ2xhc3NXaXRob3V0V3NBbm5vdCA9IHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIkJhc2VDbGFzc1dpdGhvdXRXc0Fubm90LmphdmEiLCAicHVibGljIGNsYXNzIEJhc2VDbGFzc1dpdGhvdXRXc0Fubm90IHtcbiINCi0JCQkJCQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2QgcHVibGljIHZvaWQgYW5ub3RhdGlvbkluQmFzZU5vV1NDbGFzcygpe31cbiINCi0JCQkJCQkJCQkJKyAicHVibGljIHZvaWQgbm9Bbm5vdGF0aW9uSW5CYXNlTm9XU0NsYXNzKCl7fVxuIiArICJ2b2lkIG5vblB1YmxpY0luQmFzZU5vV1NDbGFzcygpIHt9XG4iDQotCQkJCQkJCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kIHB1YmxpYyB2b2lkIHRvT3ZlcnJpZGUoKSB7fVxuIg0KLQkJCQkJCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIGV4Y2x1ZGVkUHVibGljSW5CYXNlTm9XU0NsYXNzKCkge31cbiIgKyAifSIpOw0KLQ0KLQkJYmFzZUNsYXNzV2l0aFdzQW5ub3QgPSB0ZXN0UHJqMQ0KLQkJCQkJCQkJCQkuY3JlYXRlVHlwZSgNCi0JCQkJCQkJCQkJCQkJCQkJCQltb2RlbFN5bmMxLA0KLQkJCQkJCQkJCQkJCQkJCQkJCSJCYXNlQ2xhc3NXaXRoV3NBbm5vdC5qYXZhIiwNCi0JCQkJCQkJCQkJCQkJCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIHB1YmxpYyBjbGFzcyBCYXNlQ2xhc3NXaXRoV3NBbm5vdCBleHRlbmRzIEJhc2VDbGFzc1dpdGhvdXRXc0Fubm90IHtcbiINCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSsgInB1YmxpYyB2b2lkIG5vV01Bbm5vYXRpb25JbkJhc2VXU0NsYXNzKCkge31cbiINCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSsgInZvaWQgbm9uUHVibGljSW5CYXNlV1NDbGFzcygpIHt9XG4iDQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwibmFtZUluQmFzZUNsYXNzV2l0aEFubm90XCIpIHB1YmxpYyB2b2lkIHRvT3ZlcnJpZGUoKSB7fVxuIg0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2QoZXhjbHVkZT10cnVlKSBwdWJsaWMgdm9pZCBleGNsdWRlZFB1YmxpY0luQmFzZVdTQ2xhc3MoKSB7fVxuIg0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKyAifSIpOw0KLQ0KLQkJd3NDbGFzcyA9IHRlc3RQcmoxDQotCQkJCQkJCQkJCS5jcmVhdGVUeXBlKA0KLQkJCQkJCQkJCQkJCQkJCQkJCW1vZGVsU3luYzEsDQotCQkJCQkJCQkJCQkJCQkJCQkJIldTMS5qYXZhIiwNCi0JCQkJCQkJCQkJCQkJCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJJbXBsaWNpdFNlaTFOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzEgZXh0ZW5kcyBCYXNlQ2xhc3NXaXRoV3NBbm5vdCB7XG4iDQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkrICJwdWJsaWMgdm9pZCBub1dNQW5ub3RhdGlvbkluV1NDbGFzcygpO1xuIg0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKyAidm9pZCBub25QdWJsaWNJbldTQ2xhc3MoKSB7fVxuIg0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIm5hbWVJbldzQ2xhc3NcIikgcHVibGljIHZvaWQgdG9PdmVycmlkZSgpIHt9XG4iDQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIGV4Y2x1ZGVkUHVibGljSW5XU0NsYXNzKCkge31cbiINCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJOYW1lXCIsIGV4Y2x1ZGU9dHJ1ZSkgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NXaXRoQW5ub3RhdGlvbigpe31cbiINCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSsgIn0iKTsNCi0JCQ0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJdGFyZ2V0LmxvYWQobnVsbCk7DQotCQlhc3NlcnRFcXVhbHMoIk9uZSBwcm9qZWN0cyB3ZXJlIGRlZmluZWQgYnV0IGEgZGlmZmVyZW50IG51bWJlciB3ZXJlIGZvdW5kIGluIHRoZSBET00iLCAxLCB0YXJnZXQuZ2V0RE9NKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygyLCB0YXJnZXQuZ2V0RE9NKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkuZ2V0KDApLmdldFdlYlNlcnZpY2VzKCkuc2l6ZSgpKTsNCi0JCXdzUHJqMSA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c1ByajEpOw0KLQkJd3MxID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3MxSW1wbE5hbWUpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3czEpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kTm9Bbm5vdGF0aW9uU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZCh3c0NsYXNzLCAibm9XTUFubm90YXRpb25JbldTQ2xhc3MiKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSBmaW5kV2ViTWV0aG9kQnlJbXBsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pKTsNCi0JCWFzc2VydE5vdE51bGwod20pOw0KLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZEVsZW0uZ2V0RWxlbWVudE5hbWUoKSwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod20uZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7DQotCQlhc3NlcnRFcXVhbHMoY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pLCB3bS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydEZhbHNlKHdtLmlzRXhjbHVkZWQoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9tZXRob2ROb0Fubm90YXRpb25JblBhcmVudFdpdGhXU0Fubm90YXRpb25TeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW0gPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKGJhc2VDbGFzc1dpdGhXc0Fubm90LCAibm9XTUFubm9hdGlvbkluQmFzZVdTQ2xhc3MiKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSBmaW5kV2ViTWV0aG9kQnlJbXBsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pKTsNCi0JCWFzc2VydE5vdE51bGwod20pOw0KLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZEVsZW0uZ2V0RWxlbWVudE5hbWUoKSwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod20uZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7DQotCQlhc3NlcnRFcXVhbHMoY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pLCB3bS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydEZhbHNlKHdtLmlzRXhjbHVkZWQoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9tZXRob2ROb0Fubm90YXRpb25JblBhcmVudFdpdGhvdXRXc0Fubm90YXRpb25Ob3RTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW0gPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKGJhc2VDbGFzc1dpdGhvdXRXc0Fubm90LCAibm9Bbm5vdGF0aW9uSW5CYXNlTm9XU0NsYXNzIik7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSk7DQotCQlhc3NlcnROdWxsKHdtKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZFdpdGhBbm5vdGF0aW9uSW5QYXJlbnRXaXRob3V0V3NBbm5vdGF0aW9uU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtQmFzZU5vV3NDbGFzcyA9IHV0aWwuZ2V0RXhpc3RpbmdNZXRob2QoYmFzZUNsYXNzV2l0aG91dFdzQW5ub3QsICJhbm5vdGF0aW9uSW5CYXNlTm9XU0NsYXNzIik7DQotCQlhc3NlcnROb3ROdWxsKGZpbmRXZWJNZXRob2RCeUltcGwod3MxLmdldFNlcnZpY2VFbmRwb2ludCgpLCBjYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbUJhc2VOb1dzQ2xhc3MpKSk7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9ub25QdWJsaWNNZXRob2RUcm91Z2hIaWVyYXJjaHlOb3RTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW1CYXNlTm9Xc0NsYXNzID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZChiYXNlQ2xhc3NXaXRob3V0V3NBbm5vdCwgIm5vblB1YmxpY0luQmFzZU5vV1NDbGFzcyIpOw0KLQkJYXNzZXJ0RmFsc2UoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kRWxlbUJhc2VOb1dzQ2xhc3MuZ2V0RmxhZ3MoKSkpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtQmFzZVdzQ2xhc3MgPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKGJhc2VDbGFzc1dpdGhXc0Fubm90LCAibm9uUHVibGljSW5CYXNlV1NDbGFzcyIpOw0KLQkJYXNzZXJ0RmFsc2UoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kRWxlbUJhc2VXc0NsYXNzLmdldEZsYWdzKCkpKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kRWxlbVdzQ2xhc3MgPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKHdzQ2xhc3MsICJub25QdWJsaWNJbldTQ2xhc3MiKTsNCi0JCWFzc2VydEZhbHNlKE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZEVsZW1Xc0NsYXNzLmdldEZsYWdzKCkpKTsNCi0NCi0JCWFzc2VydE51bGwoZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtQmFzZU5vV3NDbGFzcykpKTsNCi0JCWFzc2VydE51bGwoZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtQmFzZVdzQ2xhc3MpKSk7DQotCQlhc3NlcnROdWxsKGZpbmRXZWJNZXRob2RCeUltcGwod3MxLmdldFNlcnZpY2VFbmRwb2ludCgpLCBjYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbVdzQ2xhc3MpKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9leGNsdWRlZE1ldGhvZFRyb3VnaEhpZXJhcmNoeU5vdFN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kRWxlbUJhc2VOb1dzQ2xhc3MgPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKGJhc2VDbGFzc1dpdGhvdXRXc0Fubm90LCAiZXhjbHVkZWRQdWJsaWNJbkJhc2VOb1dTQ2xhc3MiKTsNCi0JCWFzc2VydFRydWUoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kRWxlbUJhc2VOb1dzQ2xhc3MuZ2V0RmxhZ3MoKSkpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtQmFzZVdzQ2xhc3MgPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKGJhc2VDbGFzc1dpdGhXc0Fubm90LCAiZXhjbHVkZWRQdWJsaWNJbkJhc2VXU0NsYXNzIik7DQotCQlhc3NlcnRUcnVlKE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZEVsZW1CYXNlV3NDbGFzcy5nZXRGbGFncygpKSk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW1Xc0NsYXNzID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZCh3c0NsYXNzLCAiZXhjbHVkZWRQdWJsaWNJbldTQ2xhc3MiKTsNCi0JCWFzc2VydFRydWUoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kRWxlbVdzQ2xhc3MuZ2V0RmxhZ3MoKSkpOw0KLQ0KLQkJYXNzZXJ0TnVsbChmaW5kV2ViTWV0aG9kQnlJbXBsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW1CYXNlTm9Xc0NsYXNzKSkpOw0KLQkJYXNzZXJ0TnVsbChmaW5kV2ViTWV0aG9kQnlJbXBsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW1CYXNlV3NDbGFzcykpKTsNCi0JCWFzc2VydE51bGwoZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtV3NDbGFzcykpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X292ZXJyaWRlTWV0aG9kc0xvYWRlZFByb3Blcmx5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW1CYXNlTm9Xc0NsYXNzID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZChiYXNlQ2xhc3NXaXRob3V0V3NBbm5vdCwgInRvT3ZlcnJpZGUiKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSBmaW5kV2ViTWV0aG9kQnlJbXBsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW1CYXNlTm9Xc0NsYXNzKSk7DQotCQlhc3NlcnROb3ROdWxsKHdtKTsNCi0JCWFzc2VydEVxdWFscygibmFtZUluV3NDbGFzcyIsIHdtLmdldE5hbWUoKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIGZpbmRXZWJNZXRob2RCeUltcGwoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIFN0cmluZyBpbXBsKQ0KLQl7DQotCQlmb3IgKElXZWJNZXRob2Qgd20gOiBzZWkuZ2V0V2ViTWV0aG9kcygpKQ0KLQkJew0KLQkJCWlmICh3bS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsKSkNCi0JCQl7DQotCQkJCXJldHVybiB3bTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBjYWxjSW1wbGVtZW50YXRpb24oSU1ldGhvZCBtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBtLmdldEVsZW1lbnROYW1lKCkgKyBtLmdldFNpZ25hdHVyZSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL01ldGhvZFBhcmFtc1N5bmNocm9uaXphdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9NZXRob2RQYXJhbXNTeW5jaHJvbml6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YzNiMzE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL01ldGhvZFBhcmFtc1N5bmNocm9uaXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklQcm9qZWN0U2VsZWN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYy5QYXJhbWV0ZXJTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuRG9tVGVzdFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLklXYWl0Q29uZGl0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmFzc2VydGlvbnMuQXNzZXJ0aW9uczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdEVqYjNQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpDQotcHVibGljIGNsYXNzIE1ldGhvZFBhcmFtc1N5bmNocm9uaXphdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByaXZhdGUgVGVzdEVqYjNQcm9qZWN0IHRlc3RFamJQcmoxOw0KLQlwcml2YXRlIElKYXZhUHJvamVjdCB0ZXN0UHJqMTsNCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHRhcmdldDsNCi0JcHJpdmF0ZSBJSmF2YU1vZGVsIGphdmFNb2RlbDsNCi0JcHJpdmF0ZSBJVHlwZSBzZWkxVHlwZTsNCi0NCi0JcHJpdmF0ZSBJV2ViU2VydmljZVByb2plY3Qgd3NQcmoxOw0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpMTsNCi0NCi0JcHJpdmF0ZSBEb21VdGlsIGRvbVV0aWwgPSBuZXcgRG9tVXRpbCgpOw0KLQlwcml2YXRlIERvbVRlc3RVdGlscyB0ZXN0VXRpbCA9IG5ldyBEb21UZXN0VXRpbHMoKTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNlaTFJbXBsTmFtZSA9ICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxIjsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JCXRhcmdldCA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbCkgDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIElQcm9qZWN0U2VsZWN0b3JbXSBnZXRQcm9qZWN0U2VsZWN0b3JzKCkNCi0JCQl7DQotCQkJCXJldHVybiBuZXcgSVByb2plY3RTZWxlY3RvcltdIHsgbmV3IElQcm9qZWN0U2VsZWN0b3IoKSANCi0JCQkJew0KLQkJCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZShJSmF2YVByb2plY3QgcHJqKSB7DQotCQkJCQkJcmV0dXJuIHByai5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0ZXN0UHJqMS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQkJCX0NCi0JCQkJfX07DQotCQkJfQ0KLQkJCQ0KLQkJfTsNCi0JCXRlc3RFamJQcmoxID0gbmV3IFRlc3RFamIzUHJvamVjdCgiVGVzdFByb2plY3QxIik7DQotCQl0ZXN0UHJqMSA9IEphdmFDb3JlLmNyZWF0ZSh0ZXN0RWpiUHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMxID0gdGVzdFByajEuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QodGVzdEVqYlByajEuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkuYXBwZW5kKCJlamJNb2R1bGUiKSkuY3JlYXRlUGFja2FnZUZyYWdtZW50KCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMSIsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQlhc3NlcnRUcnVlKG1vZGVsU3luYzEuZXhpc3RzKCkpOw0KLQkJDQotCQlmaW5hbCBTdHJpbmcgY29udGVudHMgPSAiaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nO1xuaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7XG5AamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7fSI7DQotCQlzZWkxVHlwZSA9IGNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTEuamF2YSIsIGNvbnRlbnRzKTsNCi0JCWNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIkNsYXNzMS5qYXZhIiwgInB1YmxpYyBjbGFzcyBDbGFzczEge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCXRhcmdldC5sb2FkKG51bGwpOw0KLQkJYXNzZXJ0RXF1YWxzKCJPbmUgcHJvamVjdHMgd2VyZSBkZWZpbmVkIGJ1dCBhIGRpZmZlcmVudCBudW1iZXIgd2VyZSBmb3VuZCBpbiB0aGUgRE9NIiwgMSwgdGFyZ2V0LmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgdGFyZ2V0LmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLmdldCgwKS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuc2l6ZSgpKTsNCi0JCXdzUHJqMSA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c1ByajEpOw0KLQkJc2VpMSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCBzZWkxSW1wbE5hbWUpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWkxKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJVHlwZSBjcmVhdGVUeXBlKElQYWNrYWdlRnJhZ21lbnQgcGFjaywgU3RyaW5nIGNvbXBVbml0LCBTdHJpbmcgY29udGVudHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JCWJ1Zi5hcHBlbmQoInBhY2thZ2UgIiArIHBhY2suZ2V0RWxlbWVudE5hbWUoKSArICI7XG4iKTsNCi0JCWJ1Zi5hcHBlbmQoIlxuIik7DQotCQlidWYuYXBwZW5kKGNvbnRlbnRzKTsNCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBwYWNrLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjb21wVW5pdCwgYnVmLnRvU3RyaW5nKCksIGZhbHNlLCBudWxsKTsNCi0JCXJldHVybiBjdS5nZXRUeXBlcygpWzBdOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RvcFN5bmNocm9uaXppbmcoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF92b2lkTWV0aG9kV2l0aE5vQXJnc1N5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElNZXRob2Qgdm9pZE5vQXJncyA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb24oKTtcbiIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdhaXRNZXRob2RMb2FkZWRJbkRvbShzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbih2b2lkTm9BcmdzKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24odm9pZE5vQXJncykpOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X25vblZvaWRNZXRob2RXaXRoTm9BcmdzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG5vblZvaWROb0FyZ3MgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyBDbGFzczEgbm9uVm9pZE1ldGhvZFdpdGhOb0FyZ3MoKTtcbiIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdhaXRNZXRob2RMb2FkZWRJbkRvbShzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihub25Wb2lkTm9BcmdzKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obm9uVm9pZE5vQXJncykpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoV2ViUGFyYW1LaW5kLk9VVCwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRLaW5kKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJRQ2xhc3MxOyIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VHlwZU5hbWUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF92b2lkTWV0aG9kV2l0aFByaW1pdGl2ZUFyZygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoUHJpbWl0aXZlQXJnKGludCBwYXJhbTEpO1xuIiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJhcmcwIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFdlYlBhcmFtS2luZC5JTiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRLaW5kKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJJIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRUeXBlTmFtZSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3ZvaWRNZXRob2RXaXRoTm9uUGFyYW1ldGVyaXplZEhvbGRlclBhcmFtKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhQYXJhbWV0ZXJpemVkSG9sZGVyUGFyYW0oSG9sZGVyIHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJhcmcwIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJLy9GSVhNRSBjb21tZW50aW5nIG91dCBmb3IgYnVpbGQgaW50ZWdyYXRpb24uIFRocm93aW5nIGFuIGFzc2VydGlvbiBlcnJvcjogZXhwZWN0ZWQgSU5PVVQgYnV0IHdhcyBJTg0KLQkJLy9hc3NlcnRFcXVhbHMoV2ViUGFyYW1LaW5kLklOT1VULCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldEtpbmQoKSk7DQotCQlhc3NlcnRFcXVhbHMoIlFIb2xkZXI7Iiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRUeXBlTmFtZSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3ZvaWRNZXRob2RXaXRoUGFyYW1ldGVyaXplZEhvbGRlclBhcmFtKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhQYXJhbWV0ZXJpemVkSG9sZGVyUGFyYW0oamF2YXgueG1sLndzLkhvbGRlcjxDbGFzczE+IHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJhcmcwIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJLy9GSVhNRSBjb21tZW50aW5nIG91dCBmb3IgYnVpbGQgaW50ZWdyYXRpb24uIFRocm93aW5nIGFuIGFzc2VydGlvbiBlcnJvcjogZXhwZWN0ZWQgSU5PVVQgYnV0IHdhcyBJTg0KLQkJLy9hc3NlcnRFcXVhbHMoV2ViUGFyYW1LaW5kLklOT1VULCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldEtpbmQoKSk7DQotCQlhc3NlcnRFcXVhbHMoIlFqYXZheC54bWwud3MuSG9sZGVyPFFDbGFzczE7PjsiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFR5cGVOYW1lKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1OYW1lRGVmYXVsdFN1bmNocm9uaXplZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIG1ldGhvZDEoaW50IHBhcmFtKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoImFyZzAiLCB0ZXN0VXRpbC5maW5kUGFyYW0od3NNZXRob2QsICJwYXJhbSIpLmdldE5hbWUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1OYW1lU3VuY2hyb25pemVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIGludCBtZXRob2QyKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtXCIsIGhlYWRlcj10cnVlKSBpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoInBhcmFtIiwgdGVzdFV0aWwuZmluZFBhcmFtKHdzTWV0aG9kLCAicGFyYW0xIikuZ2V0TmFtZSgpKTsJCQ0KLQkJYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCB0ZXN0VXRpbC5maW5kUGFyYW0od3NNZXRob2QsICJyZXR1cm4iKS5nZXROYW1lKCkpOwkJDQotDQotCQkvLyBvcGVyYXRpb24gaXMgRG9jdW1lbnQvQmFyZSAtIHRoZSBwYXJhbWV0ZXJzIHVzZSBtZXRob2QgbmFtZQ0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QyID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJAU09BUEJpbmRpbmcoc3R5bGU9U09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIHBhcmFtZXRlclN0eWxlPVNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpXG4iICsNCi0JCQkJInB1YmxpYyBpbnQgbWV0aG9kMyhpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMikpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kMiA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QyKSk7DQotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDNSZXNwb25zZSIsIHRlc3RVdGlsLmZpbmRQYXJhbSh3c01ldGhvZDIsICJyZXR1cm4iKS5nZXROYW1lKCkpOwkNCi0JCWFzc2VydEVxdWFscygibWV0aG9kMyIsIHRlc3RVdGlsLmZpbmRQYXJhbSh3c01ldGhvZDIsICJwYXJhbTEiKS5nZXROYW1lKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3BhcmFtSGVhZGVyRGVmYXVsdFN5bmNyb21pemVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZDEgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIG1ldGhvZDIoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW0xXCIpIGludCBwYXJhbTEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMSkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kMSA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QxKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd3NNZXRob2QxLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJwYXJhbTEiLCB3c01ldGhvZDEuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0RmFsc2Uod3NNZXRob2QxLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuaXNIZWFkZXIoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9wYXJhbUhlYWRlckZhbHNlU3luY3JvbWl6ZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kMiA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgbWV0aG9kMihAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbTFcIiwgaGVhZGVyPWZhbHNlKSBpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMikpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kMiA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QyKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd3NNZXRob2QyLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJwYXJhbTEiLCB3c01ldGhvZDIuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0RmFsc2Uod3NNZXRob2QyLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuaXNIZWFkZXIoKSk7CQkNCi0JfQkNCi0NCi0JcHVibGljIHZvaWQgdGVzdF9wYXJhbUhlYWRlclRydWVTeW5jcm9taXplZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QyID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCBtZXRob2QyKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtMVwiLCBoZWFkZXI9dHJ1ZSkgaW50IHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZDIpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZDIgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMikpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kMi5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygicGFyYW0xIiwgd3NNZXRob2QyLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod3NNZXRob2QyLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuaXNIZWFkZXIoKSk7CQkNCi0JfQkJDQotDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1QYXJ0TmFtZURlZmF1bHQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCB2b2lkTWV0aG9kRXhjbHVkZWQoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW1BXCIpIGludCBhKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoV2ViUGFyYW1LaW5kLklOLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldEtpbmQoKSk7DQotCQlhc3NlcnRFcXVhbHMoIkkiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFR5cGVOYW1lKCkpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoInBhcmFtQSIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygicGFyYW1BIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRQYXJ0TmFtZSgpKTsJCQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1QYXJ0TmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIHZvaWRNZXRob2RFeGNsdWRlZChAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbUFcIiwgcGFydE5hbWU9XCJwYXJ0TmFtZUFcIikgaW50IGEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdhaXRNZXRob2RMb2FkZWRJbkRvbShzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZCA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCWFzc2VydEVxdWFscygxLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscyhXZWJQYXJhbUtpbmQuSU4sIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0S2luZCgpKTsNCi0JCWFzc2VydEVxdWFscygiSSIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VHlwZU5hbWUoKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscygicGFyYW1BIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJwYXJ0TmFtZUEiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFBhcnROYW1lKCkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1UYXJnZXROYW1lc3BhY2VEZWZhdWx0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7CQkNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCB2b2lkTWV0aG9kRXhjbHVkZWQoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW1BXCIpIGludCBhKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoV2ViUGFyYW1LaW5kLklOLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldEtpbmQoKSk7DQotCQlhc3NlcnRFcXVhbHMoIkkiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFR5cGVOYW1lKCkpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoInBhcmFtQSIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygiIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9wYXJhbVRhcmdldE5hbWVzcGFjZUVtcHR5TnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsJCQ0KLQkJLy8gcGFyYW1ldGVyIGlzIG5vdCBpbiB0aGUgaGVhZGVyDQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgiQFNPQVBCaW5kaW5nKHN0eWxlPVNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULCBwYXJhbWV0ZXJTdHlsZT1TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKSAiICsNCi0JCQkJInB1YmxpYyB2b2lkIG1ldGhvZDMoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW1cIiwgaGVhZGVyPWZhbHNlKSBpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoIiIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOw0KLQkJDQotCQkvLyBwYXJhbWV0ZXIgaXMgaW4gaGVhZGVyDQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZDIgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoIkBTT0FQQmluZGluZyhzdHlsZT1TT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwgcGFyYW1ldGVyU3R5bGU9U09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRClcbiIgKw0KLQkJCQkicHVibGljIHZvaWQgbWV0aG9kNChAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbVwiLCBoZWFkZXI9dHJ1ZSkgaW50IHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZDIpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZDIgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMikpOw0KLQkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vc2FwLmNvbS90ZXN0L21vZGVsc3luYzEvIiwgd3NNZXRob2QyLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1UYXJnZXROYW1lc3BhY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsJCQ0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIHZvaWRNZXRob2RFeGNsdWRlZChAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbUFcIiwgdGFyZ2V0TmFtZXNwYWNlPVwiaHR0cDovL3RhcmdldE5zL1wiKSBpbnQgYSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFdlYlBhcmFtS2luZC5JTiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRLaW5kKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJJIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRUeXBlTmFtZSgpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJwYXJhbUEiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly90YXJnZXROcy8iLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFRhcmdldE5hbWVzcGFjZSgpKTsJCQ0KLQl9CQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHdhaXRNZXRob2RMb2FkZWRJbkRvbShmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgZmluYWwgU3RyaW5nIGltcGxlbWVudGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBJV2FpdENvbmRpdGlvbiBjb25kaXRpb24gPSBuZXcgSVdhaXRDb25kaXRpb24oKXsNCi0JCQlwdWJsaWMgYm9vbGVhbiBjaGVja0NvbmRpdGlvbigpDQotCQkJew0KLQkJCQlyZXR1cm4gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaSwgaW1wbGVtZW50YXRpb24pICE9IG51bGw7DQotCQkJfX07DQotCQlBc3NlcnRpb25zLndhaXRBc3NlcnQoY29uZGl0aW9uLCAiTWV0aG9kICIgKyBpbXBsZW1lbnRhdGlvbiArICIgbm90IGZvdW5kIik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1UeXBlUmVzb2x2ZWRGb3JOb25RdWFsaWZpZWRIb2xkZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBQYXJhbWV0ZXJTeW5jaHJvbml6ZXJGb3JQYXJhbVR5cGVzVGVzdHMgc3luY3Jvbml6ZXIgPSBuZXcgUGFyYW1ldGVyU3luY2hyb25pemVyRm9yUGFyYW1UeXBlc1Rlc3RzKG51bGwpOw0KLQkJc3luY3Jvbml6ZXIuY2FsY0tpbmQobnVsbCwgbnVsbCwgIlFIb2xkZXI7Iik7DQotCQlhc3NlcnRUcnVlKCJyZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lIHNob3VsZCBiZSBjYWxsZWQgZm9yIG5vbiBxdWFsaWZpZWQgSG9sZGVyIHR5cGUiLCBzeW5jcm9uaXplci5jYWxsZWQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3BhcmFtVHlwZVJlc29sdmVkRm9yUXVhbGlmaWVkSG9sZGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgUGFyYW1ldGVyU3luY2hyb25pemVyRm9yUGFyYW1UeXBlc1Rlc3RzIHN5bmNyb25pemVyID0gbmV3IFBhcmFtZXRlclN5bmNocm9uaXplckZvclBhcmFtVHlwZXNUZXN0cyhudWxsKTsNCi0JCXN5bmNyb25pemVyLmNhbGNLaW5kKG51bGwsIG51bGwsICJRamF2YXgueG1sLndzLkhvbGRlcjxRQ2xhc3MxOz47Iik7DQotCQlhc3NlcnRUcnVlKCJyZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lIHNob3VsZCBiZSBjYWxsZWQgZm9yIHF1YWxpZmllZCBIb2xkZXIgdHlwZSIsIHN5bmNyb25pemVyLmNhbGxlZCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1UeXBlTm90UmVzb2x2ZWRGb3JOb25Ib2xkZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBQYXJhbWV0ZXJTeW5jaHJvbml6ZXJGb3JQYXJhbVR5cGVzVGVzdHMgc3luY3Jvbml6ZXIgPSBuZXcgUGFyYW1ldGVyU3luY2hyb25pemVyRm9yUGFyYW1UeXBlc1Rlc3RzKG51bGwpOw0KLQkJc3luY3Jvbml6ZXIuY2FsY0tpbmQobnVsbCwgbnVsbCwgIlFTdHJpbmc7Iik7DQotCQlhc3NlcnRGYWxzZSgicmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3Igbm9uIEhvbGRlciB0eXBlIiwgc3luY3Jvbml6ZXIuY2FsbGVkKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBjbGFzcyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXJGb3JQYXJhbVR5cGVzVGVzdHMgZXh0ZW5kcyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXINCi0Jew0KLQkJcHVibGljIFBhcmFtZXRlclN5bmNocm9uaXplckZvclBhcmFtVHlwZXNUZXN0cyhJTW9kZWxFbGVtZW50U3luY2hyb25pemVyIHBhcmVudCkgew0KLQkJCXN1cGVyKHBhcmVudCk7DQotCQl9DQotDQotCQlwdWJsaWMgYm9vbGVhbiBjYWxsZWQgPSBmYWxzZTsNCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgV2ViUGFyYW1LaW5kIGNhbGNLaW5kKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBwYXJtQW5ub3RhdGlvbiwgZmluYWwgSU1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gew0KLQkJCXJldHVybiBzdXBlci5jYWxjS2luZChwYXJtQW5ub3RhdGlvbiwgbWV0aG9kLCB0eXBlU2lnbmF0dXJlKTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUoZmluYWwgSU1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7DQotCQkJY2FsbGVkID0gdHJ1ZTsNCi0JCQlyZXR1cm4gIiI7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvTW9kZWxTeW5jaHJvbml6YXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvTW9kZWxTeW5jaHJvbml6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MmNhNzc3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL01vZGVsU3luY2hyb25pemF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZU1hbmlwdWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0RWpiM1Byb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdHNVdGlsczsKLQotcHVibGljIGNsYXNzIE1vZGVsU3luY2hyb25pemF0aW9uVGVzdHMgZXh0ZW5kcyBTeW5jaHJvbml6YXRpb25UZXN0Rml4dHVyZQotewotCXByaXZhdGUgdm9pZCBhc3NlcnRCZWZvcmVBZnRlckFyZVRoZVNhbWUoKQotCXsJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IG5ld1JlZldzUHJqMSA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMod3NQcmoxLCBuZXdSZWZXc1ByajEpOwotCQlhc3NlcnRFcXVhbHMod3MxLCBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUobmV3UmVmV3NQcmoxLCB3czFJbXBsTmFtZSkpOwotCQlhc3NlcnRFcXVhbHMoc2VpMSwgZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZShuZXdSZWZXc1ByajEsIHNlaTFJbXBsTmFtZSkpOwotCQkKLQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IG5ld1JlZldzUHJqMiA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMi5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMod3NQcmoyLCBuZXdSZWZXc1ByajIpOwotCQlhc3NlcnRFcXVhbHMod3MyLCBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUobmV3UmVmV3NQcmoyLCB3czJJbXBsTmFtZSkpOwotCQlhc3NlcnRFcXVhbHMoc2VpMiwgZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZShuZXdSZWZXc1ByajIsIHNlaTJJbXBsTmFtZSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X29wZW5lZFdzUHJvamVjdFN5bmNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlmaW5hbCBUZXN0UHJvamVjdCB0ZXN0UHJqMyA9IG5ldyBUZXN0UHJvamVjdChuZXcgVGVzdEVqYjNQcm9qZWN0KCJUZXN0RUpCUHJvamVjdDMiKS5nZXRQcm9qZWN0KCkpOwotCQl0cnkgewotCQkJYWxsb3dlZFByb2plY3RzLmFkZCh0ZXN0UHJqMy5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOwotCQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMzID0gdGVzdFByajMuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzMiKTsKLQkJCXRlc3RQcmozLmNyZWF0ZVR5cGUobW9kZWxTeW5jMywgIlNlaTMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTNOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMyB7fSIpOwotCQkJdGVzdFByajMuY3JlYXRlVHlwZShtb2RlbFN5bmMzLCAiV1MzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MzTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLlNlaTNOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzMge30iKTsKLQkJCXRlc3RQcmozLmdldFByb2plY3QoKS5jbG9zZShudWxsKTsKLQkJCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQkKLQkJCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsKLQkJCXRlc3RQcmozLmdldFByb2plY3QoKS5vcGVuKG51bGwpOwotCQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCQotCQkJYXNzZXJ0QmVmb3JlQWZ0ZXJBcmVUaGVTYW1lKCk7Ci0JCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmozID0gZG9tVXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmozLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJXZWIgU2VydmljZSBQcm9qZWN0IG5vdCBzeW5jaHJvbml6ZWQgYWZ0ZXIgb3BlbmVkIix3c1ByajMpOwotCQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MzID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMywgImNvbS5zYXAudGVzdC5tb2RlbHN5bmMzLldTMyIpOwotCQkJYXNzZXJ0Tm90TnVsbCgiV2ViIFNlcnZpY2Ugbm90IHN5bmNocm9uaXplZCBhZnRlciBjb250YWluaW5nIHByb2plY3Qgd2FzIG9wcGVuZWQiLCB3czMpOwotCQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkzID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajMsICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMy5TZWkzIik7Ci0JCQlhc3NlcnROb3ROdWxsKCJTZXJ2aWNlIEVuZHBvaW50IGludGVyZmFjZSBub3Qgc3luY2hyb25pemVkIGFmdGVyIGNvbnRhaW5pbmcgcHJvamVjdCB3YXMgb3BwZW5lZCIsIHNlaTMpOwotCQl9IGZpbmFsbHkKLQkJewotCQkJdGVzdFByajMuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0X29wZW5lZFByb2plY3RXaXRoRW51bXNJbml0aWFseVN5bmNoZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgRXhjZXB0aW9uCi0JewotCQlmaW5hbCBUZXN0UHJvamVjdCB0ZXN0UHJqMyA9IG5ldyBUZXN0UHJvamVjdChuZXcgVGVzdEVqYjNQcm9qZWN0KCJUZXN0RUpCUHJvamVjdDMiKS5nZXRQcm9qZWN0KCkpOwotCQl0cnkgewotCQkJYWxsb3dlZFByb2plY3RzLmFkZCh0ZXN0UHJqMy5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOwotCQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMzID0gdGVzdFByajMuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzMiKTsKLQkJCXRlc3RQcmozLmNyZWF0ZVR5cGUobW9kZWxTeW5jMywgIlRlc3RFbnVtLmphdmEiLCAicHVibGljIGVudW0gVGVzdEVudW0ge0EsIEIsIEN9Iik7Ci0JCQl0YXJnZXQgPSBjcmVhdGVUYXJnZXQoKTsKLQkJCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQkKLQkJCXRhcmdldC5sb2FkKG51bGwpOwotCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqMyA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMy5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOwotCQkJYXNzZXJ0Tm90TnVsbCgiV2ViIFNlcnZpY2UgUHJvamVjdCBub3Qgc3luY2hyb25pemVkIGFmdGVyIGNyZWF0ZWQiLHdzUHJqMyk7Ci0JCX0gZmluYWxseSAKLQkJewotCQkJdGVzdFByajMuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF9uZXdTZWlDb21waWxhdGlvblVuaXRzU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0JewotCQl2ZXJpZnlTZXRVcE1vZGVsRW50aXRlc05vdENoYW5nZWQoKTsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZiA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5uZXdzZWkiKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsKLQkJdGVzdFByajEuY3JlYXRlVHlwZShwZiwgIlNlaTMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTNOYW1lXCIsIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9jb20uc2FwLnRlc3QvXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMyB7fSIpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJYXNzZXJ0QmVmb3JlQWZ0ZXJBcmVUaGVTYW1lKCk7Ci0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByajEgPSBkb21VdGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkzID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsICJjb20uc2FwLnRlc3QubmV3c2VpLlNlaTMiKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTmV3bHkgYWRkZWQgU0VJIG5vdCBzeW5jaGVkIGludG8gdGhlIG1vZGVsIixzZWkzKTsKLQkJYXNzZXJ0RXF1YWxzKCJKYXZhIEludGYgZm9yIG5ld2x5IGFkZGVkIFNFSSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQiLCAiY29tLnNhcC50ZXN0Lm5ld3NlaS5TZWkzIiwgc2VpMy5nZXRJbXBsZW1lbnRhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUYXJnZXQgTlMgZm9yIG5ld2x5IGFkZGVkIFNFSSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQiLCAiaHR0cDovL2NvbS5zYXAudGVzdC8iLCBzZWkzLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBvZiB0aGUgbmV3bHkgYWRkZWQgc2VpIGRvZXNuJ3QgbWF0Y2giLCAiU2VpM05hbWUiLCBzZWkzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF91bnJlU29sdmVkU2VpUmVmR2V0c1Jlc29sdmVkQWZ0ZXJTZWlBZGRlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0JewotCQl2ZXJpZnlTZXRVcE1vZGVsRW50aXRlc05vdENoYW5nZWQoKTsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZiA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5uZXd3cyIpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkvL01ha2UgdGhlIFdTIGJlIGNyZWF0ZWQgd2l0aCBhIHJlZmVyZW5jZSB0byAiY29tLnNhcC50ZXN0Lm5ld3NlaS5TZWkzIiB3aGljaCBkb2Vzbid0IGV4aXN0IHlldC4gCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsKLQkJdGVzdFByajEuY3JlYXRlVHlwZShwZiwgIldTMy5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTM05hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubmV3c2VpLlNlaTNcIikgcHVibGljIGNsYXNzIFdTMyB7fSIpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJYXNzZXJ0QmVmb3JlQWZ0ZXJBcmVUaGVTYW1lKCk7Ci0JCQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmoxID0gZG9tVXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzMyA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsICJjb20uc2FwLnRlc3QubmV3d3MuV1MzIik7Ci0JCWFzc2VydE5vdE51bGwoIldlYiBTZXJ2aWNlIG5vdCBzeW5jaHJvbml6ZWQgYWZ0ZXIgbmV3IGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB3cyB3YXMgYWRkZWQiLCB3czMpOwotCQkvL2FkZCBhIG5ldyBzZWkgYW5kIHRlc3QgdGhhdCBpdCBoYXMgYmVlbiBzeW5jaGVkLgotCQl0ZXN0X25ld1NlaUNvbXBpbGF0aW9uVW5pdHNTeW5jaGVkKCk7Ci0JCS8vbm93IGNoZWNrIHRhaHQgdGhlIFNlaSByZWYgaW4gd3MzIGhhcyBiZWVuIHByb3Blcmx5IHJlc29sdmVkCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgbmV3bHlBZGRlZFNlaSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCAiY29tLnNhcC50ZXN0Lm5ld3NlaS5TZWkzIik7Ci0JCWFzc2VydE5vdE51bGwoIk5ld2x5IGFkZGVkIHNlaSBub3QgZm91bmQgaW4gdGhlIG1vZGVsLiBQcm9iYWJseSB0aGUgdGVzdF9uZXdTZWlDb21waWxhdGlvblVuaXRzU3luY2hlZCgpIHRlc3QgbWV0aG9kIGhhcyBjaGFuZ2VkIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgaXQgd29ya3Mgd2l0aCIsIG5ld2x5QWRkZWRTZWkpOwotCQlhc3NlcnRTYW1lKCJXZWIgU2VydmljZSBSZWZlcmVuY2Ugbm90IHJlc29sdmVkIHByb3Blcmx5IiwgbmV3bHlBZGRlZFNlaSwgd3MzLmdldFNlcnZpY2VFbmRwb2ludCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9uZXdTb3VyY2VGb2xkZXJXaXRoSmF2YUNvbnRlbnRTeW5jaGVkV2hlbkFkZGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQl7Ci0JLy8JdmVyaWZ5U2V0VXBNb2RlbEVudGl0ZXNOb3RDaGFuZ2VkKCk7Ci0JCS8vY3JlYXRlIG5ldyBmb2xkZXIsIHdoaWNoIHdpbGwgbGF0ZXIgb24gYmUgbWFkZSBhIHNvdXJlIGZvbGRlcgotCQlJRm9sZGVyIGZvbGRlciA9IHRlc3RQcmoxLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYzEiKTsKLQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJLy9tYWtlIHRoZSBmb2xkZXIgYSBzb3VyY2UgZm9sZGVyIG5vdyBpbiBvcmRlciB0byBjcmVhdGUgdGhlIHR5cGUgaW4gdGhlcmUuCi0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldFJhd0NsYXNzcGF0aCgpOwotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRFbnRyaWVzLmxlbmd0aCArIDFdOwotCQkvL2NyZWF0ZSBhIG5ldyBwYWNrYWdlIGZyYWdtZW50IGZvbGRlci4gTm90ZSB0aGF0IGl0IGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSB0eXBlLCBhcyB0aGUgZm9sZGVyIGlzIG5vdCBzb3VyY2UgZm9sZGVyIHlldAotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudFJvb3QgbmV3U291cmNlRm9sZGVyID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGZvbGRlcik7Ci0JCW5ld0VudHJpZXNbb2xkRW50cmllcy5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3U291cmNlRm9sZGVyLmdldFBhdGgoKSk7Ci0JCXRlc3RQcmoxLnNldENsYXNzcGF0aChuZXdFbnRyaWVzKTsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZiA9IG5ld1NvdXJjZUZvbGRlci5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoImNvbS5zYXAudGVzdC5uZXd3cyIsIHRydWUsIG51bGwpOwotCQkvL25vdyBjcmVhdGUgdGhlIHR5cGVzCi0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUocGYsICJXUzMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzNOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC50ZXN0Lm5ld3NlaS5TZWkzXCIpIHB1YmxpYyBjbGFzcyBXUzMge30iKTsKLQkJdGVzdFByajEuY3JlYXRlVHlwZShwZiwgIlNlaTMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTNOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMyB7fSIpOwotCQkvL2FmdGVyIHRoZSB0eXBlIGlzIGNyZWF0ZWQgbWFrZSB0aGUgc291cmNlIGZvbGRlciBhbiBvcmRpbmFyeSBzb3VyY2UgYWdhaW4uCi0JCXRlc3RQcmoxLnNldENsYXNzcGF0aChvbGRFbnRyaWVzKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJLy90aGVuIHN0YXJ0IHN5bmNocm9uaXppbmcKLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwotCQkvL2ZpbmFsbHkgdGhlIHJlc291cmNlIGlzIHN5Y2hucm9uaXppbmcgYW5kIGluIHRoZSBzYW1lIHRpbWUgd2UgaGF2ZSBhIGZvbGRlciB3aXRoIHNvdXJjZSBjb250ZW50LiBTbyBqdXN0IG1ha2UgaXQgYSBzb3VyY2UgZm9sZGVyIGFnYWluLgotCQl0ZXN0UHJqMS5zZXRDbGFzc3BhdGgobmV3RW50cmllcyk7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmoxID0gZG9tVXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzMyA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsICJjb20uc2FwLnRlc3QubmV3d3MuV1MzIik7Ci0JCWFzc2VydE5vdE51bGwoIldlYiBTZXJ2aWNlIG5vdCBzeW5jaHJvbml6ZWQgYWZ0ZXIgYSBzb3VyY2UgZm9sZGVyIGluIHdoaWNoIGl0IHdhcyBjb250YWluZWQgd2FzIGFkZGVkIiwgd3MzKTsKLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkzID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsICJjb20uc2FwLnRlc3QubmV3d3MuU2VpMyIpOwotCQlhc3NlcnROb3ROdWxsKCJTZWkgbm90IHN5bmNoZWQgYWZ0ZXIgYSBzb3VyY2UgZm9sZGVyIGluIHdoaWNoIGl0IHdhcyBjb250YWluZWQgd2FzIGFkZGVkIiwgc2VpMyk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZWRTb3VyY2VGb2xkZXJTeWNoZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQl7Ci0JCXRlc3RfbmV3U291cmNlRm9sZGVyV2l0aEphdmFDb250ZW50U3luY2hlZFdoZW5BZGRlZCgpOwotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gIG5ld0VudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZEVudHJpZXMubGVuZ3RoIC0gMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob2xkRW50cmllcywgMCwgbmV3RW50cmllcywgMCwgbmV3RW50cmllcy5sZW5ndGgpOwotCQl0ZXN0UHJqMS5zZXRDbGFzc3BhdGgobmV3RW50cmllcyk7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlhc3NlcnROdWxsKGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsICJjb20uc2FwLnRlc3QubmV3d3MuV1MzIikpOwotCQlhc3NlcnROdWxsKGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCAiY29tLnNhcC50ZXN0Lm5ld3dzLlNlaTMiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlZE9yQ2xvc2VkUHJvamVjdFN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0JewotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxXzEiKTsKLQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiV1MzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MzTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMyXzEuU2VpM1wiKSBwdWJsaWMgY2xhc3MgV1MzIHt9Iik7Ci0JCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMiA9IHRlc3RQcmoyLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMyXzEiKTsKLQkJdGVzdFByajIuY3JlYXRlVHlwZShtb2RlbFN5bmMyLCAiU2VpMy5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpM05hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkzIHt9Iik7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQkKLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MzID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxXzEuV1MzIik7Ci0JCWFzc2VydE5vdE51bGwod3MzKTsKLQkJCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpMyA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoyLCAiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzJfMS5TZWkzIik7Ci0JCWFzc2VydE5vdE51bGwoc2VpMyk7Ci0JCWFzc2VydEVxdWFscyhzZWkzLCB3czMuZ2V0U2VydmljZUVuZHBvaW50KCkpOwotCQlmaW5hbCBTdHJpbmcgdGVzdFByajJOYW1lID0gdGVzdFByajIuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpOwotCQl0ZXN0UHJqMi5nZXRQcm9qZWN0KCkuY2xvc2UobnVsbCk7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCWFzc2VydE51bGwoZG9tVXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmoyTmFtZSkpOwotCQlhc3NlcnROdWxsKCJUaGUgd2ViIHNlcnZpY2UgcmV0dXJucyBhIHNlaSBpbnN0YW5jZSB3aGljaCBpcyBjb250YWluZWQgaW4gYSBjbG9zZWQgcHJvamVjdCIsIHdzMy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlZENVV2l0aFNlaVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0JewotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2VpMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxSW1wbE5hbWUpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlkZWxldGUoc2VpMUNVLCB0cnVlKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHdzUHJqMS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuY29udGFpbnMoc2VpMSkpOwotCQlhc3NlcnROdWxsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlZENVV2l0aFdTU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3czFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxSW1wbE5hbWUpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlkZWxldGUod3MxQ1UsIHRydWUpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJYXNzZXJ0RmFsc2Uod3NQcmoxLmdldFdlYlNlcnZpY2VzKCkuY29udGFpbnMod3MxKSk7Ci0JCWFzc2VydEZhbHNlKHNlaTEuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jb250YWlucyh3czEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X2RlbGV0ZWRDdUNvbnRlbnRXaXRoU2VpU3luY2hlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2VpMUN1ID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxSW1wbE5hbWUpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZWkxQ3UsICIiKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHdzUHJqMS5nZXRXZWJTZXJ2aWNlcygpLmNvbnRhaW5zKHNlaTEpKTsKLQkJYXNzZXJ0TnVsbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2RlbGV0ZWRDdUNvbnRlbnRXaXRoV3NTeW5jaGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3czFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxSW1wbE5hbWUpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3czFDVSwgIiIpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJYXNzZXJ0RmFsc2Uod3NQcmoxLmdldFdlYlNlcnZpY2VzKCkuY29udGFpbnMod3MxKSk7Ci0JCWFzc2VydEZhbHNlKHNlaTEuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jb250YWlucyh3czEpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RfbW92ZWRDVVdpdGhXU0luT3RoZXJQcm9qZWN0V2l0aFNhbWVKYXZhTmFtZVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0JewotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3MxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMUltcGxOYW1lKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb3ZlSW4gPSB0ZXN0UHJqMi5nZXRTb3VyY2VGb2xkZXIoKS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQod3MxQ1UuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKSwgdHJ1ZSwgbnVsbCk7Ci0JCXdzMUNVLm1vdmUobW92ZUluLCBudWxsLCBudWxsLCBmYWxzZSwgbnVsbCk7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZSh3c1ByajEuZ2V0V2ViU2VydmljZXMoKS5jb250YWlucyh3czEpKTsKLQkJYXNzZXJ0VHJ1ZSh3c1ByajIuZ2V0V2ViU2VydmljZXMoKS5jb250YWlucyh3czEpKTsKLQkJYXNzZXJ0VHJ1ZShzZWkxLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY29udGFpbnMod3MxKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfbW92ZWRDVVdpdGhTZWlJbk90aGVyUHJvamVjdFdpdGhTYW1lSmF2YU5hbWVTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHNlMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxSW1wbE5hbWUpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vdmVJbiA9IHRlc3RQcmoyLmdldFNvdXJjZUZvbGRlcigpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChzZTFDVS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpLCB0cnVlLCBudWxsKTsKLQkJc2UxQ1UubW92ZShtb3ZlSW4sIG51bGwsIG51bGwsIGZhbHNlLCBudWxsKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHdzUHJqMS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuY29udGFpbnMoc2VpMSkpOwotCQlhc3NlcnRUcnVlKHdzUHJqMi5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuY29udGFpbnMoc2VpMSkpOwotCQlhc3NlcnRTYW1lKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgc2VpMSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfcmVuYW1lZENVV2l0aFNlaVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0JewotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2UxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTFJbXBsTmFtZSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCXNlMUNVLmZpbmRQcmltYXJ5VHlwZSgpLnJlbmFtZSgiU2VpMU5ld05hbWUiLCBmYWxzZSwgbnVsbCk7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2UxQ1VSZW5hbWVkID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU2VpMU5ld05hbWUiKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiU2VpMU5ld05hbWUuamF2YSIsIHNlMUNVUmVuYW1lZC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSByZW5hbWVkU2VpMSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCBzZTFDVVJlbmFtZWQuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlbmFtZWRTZWkxKTsKLQkJYXNzZXJ0TnVsbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfcmVuYW1lZENVV2l0aFdTU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3czFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxSW1wbE5hbWUpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQl3czFDVS5maW5kUHJpbWFyeVR5cGUoKS5yZW5hbWUoIldTMU5ld05hbWUiLCBmYWxzZSwgbnVsbCk7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3MxQ1VSZW5hbWVkID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuV1MxTmV3TmFtZSIpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJXUzFOZXdOYW1lLmphdmEiLCB3czFDVVJlbmFtZWQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCUlXZWJTZXJ2aWNlIHJlbmFtZWRXUzEgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3czFDVVJlbmFtZWQuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlbmFtZWRXUzEpOwotCQlhc3NlcnRGYWxzZShzZWkxLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY29udGFpbnMod3MxKSk7Ci0JCWFzc2VydFRydWUoc2VpMS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmNvbnRhaW5zKHJlbmFtZWRXUzEpKTsKLQkJYXNzZXJ0U2FtZShzZWkxLCByZW5hbWVkV1MxLmdldFNlcnZpY2VFbmRwb2ludCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9yZW1vdmVkV1NBbm5vdGF0aW9uRnJvbVNlaVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0JewotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2UxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTFJbXBsTmFtZSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlMUNVLCAicHVibGljIGludGVyZmFjZSBTZWkxIHt9Iik7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCWFzc2VydE51bGwoZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHNlaTFJbXBsTmFtZSkpOwotCQlhc3NlcnROdWxsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlZFdTQW5ub3RhdGlvbkZyb21XU1N5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0JewotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2UxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMUltcGxOYW1lKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJdGVzdFV0aWwuc2V0Q29udGVudHMoc2UxQ1UsICJwdWJsaWMgY2xhc3MgV1MxIHt9Iik7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCWFzc2VydE51bGwoZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHdzMUltcGxOYW1lKSk7Ci0JCWFzc2VydFRydWUoc2VpMS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLnNpemUoKSA9PSAwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9hZGRlZFdTQW5ub3RhaW9uVG9DbGFzc1N5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0JewotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jNCA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmM0Iik7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3M0Q1UgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzQsICJXUzQuamF2YSIsICJwdWJsaWMgY2xhc3MgV1M0IHt9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzNENVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1M0TmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLlNlaTFcIiwgcG9ydE5hbWU9XCJUZXN0UG9ydE5hbWVcIiwgdGFyZ2V0TmFtZXNwYWNlPVwiaHR0cDovL2NvbS5zYXAvdGVzdFwiLCB3c2RsTG9jYXRpb249XCJDOi90ZXN0L3dzZGwvbG9jYXRpb25cIikgcHVibGljIGNsYXNzIFdTNCB7fSIpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJZmluYWwgSVdlYlNlcnZpY2UgYWRkZWRXUzQgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3czRDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoYWRkZWRXUzQpOwotCQlhc3NlcnRUcnVlKGFkZGVkV1M0LmdldFNlcnZpY2VFbmRwb2ludCgpID09IHNlaTEpOwotCQlhc3NlcnRFcXVhbHMoInBvcnROYW1lIG5vdCBzYW1lIiwgIlRlc3RQb3J0TmFtZSIsIGFkZGVkV1M0LmdldFBvcnROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInRhcmdldE5hbWVzcGFjZSBub3Qgc2FtZSIsICJodHRwOi8vY29tLnNhcC90ZXN0IiwgYWRkZWRXUzQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndzZGxMb2NhdGlvbiBub3Qgc2FtZSIsICJDOi90ZXN0L3dzZGwvbG9jYXRpb24iLCBhZGRlZFdTNC5nZXRXc2RsTG9jYXRpb24oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfYWRkZWRXU0Fubm90YXRpb25Ub1NlaVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0JewotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jNCA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmM0Iik7Ci0JCQotCQlmaW5hbCBJVHlwZSB3czRUeXBlID0gdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmM0LCAiV1M0LmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1M0TmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmM0LlNlaTRcIikgcHVibGljIGNsYXNzIFdTNCB7fSIpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3M0ID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3M0VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwod3M0KTsKLQkJYXNzZXJ0TnVsbCh3czQuZ2V0U2VydmljZUVuZHBvaW50KCkpOwotCQkKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzZWk0Q1UgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzQsICJTZWk0LmphdmEiLCAicHVibGljIGludGVyZmFjZSBTZWk0IHt9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTRDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpNE5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWk0IHt9Iik7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGFkZGVkV1M0ID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHNlaTRDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoYWRkZWRXUzQpOwotCQlhc3NlcnRTYW1lKHdzNC5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgYWRkZWRXUzQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRTZWlSZWZTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzMUNVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMyLlNlaTJcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJYXNzZXJ0U2FtZShzZWkyLCB3czEuZ2V0U2VydmljZUVuZHBvaW50KCkpOwotCQlhc3NlcnRTYW1lKHdzMSwgZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3MxLmdldEltcGxlbWVudGF0aW9uKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkU2VpUmVmV2l0aFVueGVzaXN0aW5nU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3czFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3czFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMi5TZWlVbmV4aXN0aW5nXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCWFzc2VydE51bGwod3MxLmdldFNlcnZpY2VFbmRwb2ludCgpKTsKLQkJYXNzZXJ0U2FtZSh3czEsIGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzMS5nZXRJbXBsZW1lbnRhdGlvbigpKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRGcm9tRXhwbGljaXRUb0ltcGxpY2l0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzMUNVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCBuYW1lPVwiSW1wbGljaXRJbnRlcmZhY2VOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUoc2VpMiwgd3MxLmdldFNlcnZpY2VFbmRwb2ludCgpKTsKLQkJYXNzZXJ0VHJ1ZSh3czEuZ2V0U2VydmljZUVuZHBvaW50KCkuaXNJbXBsaWNpdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdEludGVyZmFjZU5hbWUiLCB3czEuZ2V0U2VydmljZUVuZHBvaW50KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9kZWxldGVkUGFja2FnZVN5bmNoZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzMgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMyIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzMsICJXUzQuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU2VpMVwiKSBwdWJsaWMgY2xhc3MgV1M0IHt9Iik7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlmaW5hbCBJV2ViU2VydmljZSB3czQgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCAiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzMuV1M0Iik7Ci0JCWFzc2VydE5vdE51bGwod3M0KTsKLQkJYXNzZXJ0U2FtZShzZWkxLCB3czQuZ2V0U2VydmljZUVuZHBvaW50KCkpOwotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IHBmID0gdGVzdFByajEuZ2V0U291cmNlRm9sZGVyKCkuZ2V0UGFja2FnZUZyYWdtZW50KCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMSIpOwotCQlkZWxldGUocGYsIHRydWUpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJYXNzZXJ0TnVsbChkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgc2VpMUltcGxOYW1lKSk7Ci0JCWFzc2VydE51bGwoZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3MxSW1wbE5hbWUpKTsKLQkJYXNzZXJ0TnVsbCh3czQuZ2V0U2VydmljZUVuZHBvaW50KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2FkZGVkUGFja2FnZVdpdGhDb21waWxhdGlvblVuaXRzU3luY2hlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCXsKLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwotCQlmaW5hbCBGaWxlIGlvUGFja2FnZSA9IG5ldyBGaWxlKHRlc3RQcmoxLmdldFNvdXJjZUZvbGRlcigpLmdldFJlc291cmNlKCkuZ2V0UmF3TG9jYXRpb24oKS50b09TU3RyaW5nKCksICJjb20vc2FwL3Rlc3QvbW9kZWxzeW5jNCIpOwotCQlpb1BhY2thZ2UubWtkaXJzKCk7Ci0JCWZpbmFsIEZpbGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIobmV3IEZpbGUoaW9QYWNrYWdlLCAiV1M0LmphdmEiKSk7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoInBhY2thZ2UgY29tLnNhcC50ZXN0Lm1vZGVsc3luYzQ7XG4gQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLlNlaTFcIikgcHVibGljIGNsYXNzIFdTNCB7fSIpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCX0gZmluYWxseSAKLQkJewotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCX0KLQkJdGVzdFByajEuZ2V0U291cmNlRm9sZGVyKCkuZ2V0UmVzb3VyY2UoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLG51bGwpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCAiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzQuV1M0IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZENsYXNzVG9JbnRlcmZhY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYyA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmM0Iik7CQkKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0NVID0gdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMsICJXUzQuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgY2xhc3MgV1M0IHt9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCUlXZWJTZXJ2aWNlIHdzNCA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHdzNCk7Ci0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgaW50ZXJmYWNlIFdTNCB7fSIpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQl3czQgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3c0NVLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh3czQpOwotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCB3c0NVLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChzZWkpOwotCQlhc3NlcnRGYWxzZShzZWkuaXNJbXBsaWNpdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRJbnRlcmZhY2VUb0NsYXNzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jNCIpOwkJCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3NDVSA9IHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jLCAiV1M0LmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGludGVyZmFjZSBXUzQge30iKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHNlaSk7Ci0JCWFzc2VydEZhbHNlKHNlaS5pc0ltcGxpY2l0KCkpOwkJCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgY2xhc3MgV1M0IHt9Iik7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlzZWkgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgd3NDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoc2VpKTsKLQkJYXNzZXJ0VHJ1ZShzZWkuaXNJbXBsaWNpdCgpKTsKLQkJSVdlYlNlcnZpY2Ugd3M0ID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3NDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwod3M0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkSW50ZXJmYWNlQW5kQ2xhc3NXaXRoU2ltaWxhck5hbWVzTm90UmVtb3ZlZEZyb21Eb20oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYyA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmM1Iik7CQkKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0NVID0gdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMsICJUZXN0LmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGNsYXNzIFRlc3Qge30iKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3NDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpOwkJCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2VpQ1UgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYywgIlRlc3RTZWkuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgaW50ZXJmYWNlIFRlc3RTZWkge30iKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJYXNzZXJ0Tm90TnVsbChkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgc2VpQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKTsKLQkJCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzQ1UsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJUZXN0U2VydmljZVwiKSBwdWJsaWMgY2xhc3MgVGVzdCB7fSIpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQlhc3NlcnROb3ROdWxsKGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCBzZWlDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpOwotCQlhc3NlcnROb3ROdWxsKGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKTsJCQotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0X1dzQ2hhbmdlZFRvVXNlRXhwbGljaXRTRUkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYyA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmM0Iik7CQkKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0NVID0gdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMsICJXUzQuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgY2xhc3MgV1M0IHt9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHNlaSk7Ci0JCWFzc2VydFRydWUoc2VpLmlzSW1wbGljaXQoKSk7CQkKLQkJCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxXCIpIHB1YmxpYyBjbGFzcyBXUzQge30iKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJc2VpID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHNlaSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9Xc09wZW5lZEluV29ya2luZ0NvcHlDb250ZW50Q2hhbmdlZFJlY29uY2lsZUNhbGxlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewkKLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYyA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmM0Iik7CQkKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0N1ID0gdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMsICJXUzMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgY2xhc3MgV1MzIHt9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCUlXZWJTZXJ2aWNlIHdzMyA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzQ3UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHdzMy5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5nZXRXZWJNZXRob2RzKCkuc2l6ZSgpKTsKLQkJLy8gdXBkYXRlIGNvbXBpbGF0aW9uIHVuaXQgd2l0aG91dCB1cGRhdGluZyB0aGUgdW5kZXJseWluZyByZXNvdXJjZQotCQl3c0N1LmJlY29tZVdvcmtpbmdDb3B5KG51bGwpOwotCQl3c0N1LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKCJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGNsYXNzIFdTMyB7IiArCi0JCQkJInB1YmxpYyB2b2lkIHRlc3QoKSB7fSIgKwotCQkJCSJ9Iik7Ci0JCXdzQ3UucmVjb25jaWxlKElDb21waWxhdGlvblVuaXQuTk9fQVNULCBmYWxzZSwgbnVsbCwgbnVsbCk7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgd3MzLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldFdlYk1ldGhvZHMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X1dzT3BlbmVkSW5Xb3JraW5nQ29weUNvbnRlbnRDaGFuZ2VkUmVjb25jaWxlQ2FsbGVkT25Ob25KYXZhQ1UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsJCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsKLQkJCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3QodGVzdFByajEuZ2V0UHJvamVjdCgpKTsKLQkJSVBhY2thZ2VGcmFnbWVudCBwZiA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCIiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHBmLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiTm90V1MuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGNsYXNzIE5vdFdTIHt9IiwgdHJ1ZSwgbnVsbCk7Ci0JCWN1LmJlY29tZVdvcmtpbmdDb3B5KG51bGwpOwotCQljdS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cygiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiTmV3Tm90V3NcIikgcHVibGljIGNsYXNzIE5vdFdTIHt9Iik7Ci0JCWN1LnJlY29uY2lsZShJQ29tcGlsYXRpb25Vbml0Lk5PX0FTVCwgZmFsc2UsIG51bGwsIG51bGwpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJZm9yIChJV2ViU2VydmljZSB3cyA6IHdzUHJqMS5nZXRXZWJTZXJ2aWNlcygpKSB7Ci0JCQlpZiAod3MuZ2V0TmFtZSgpLmVxdWFscygiTmV3Tm90V3MiKSkgewotCQkJCWZhaWwoInJlY29uY2lsZSBvbiBqYXZhIGZpbGUgd2hpY2ggaXMgbm90IG9uIHByb2plY3QncyBidWlsZCBwYXRoIHByb2Nlc3NlZCBpbmNvcnJlY3RseSIpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBjcmVhdGVUYXJnZXQoKQotCXsKLQkJcmV0dXJuIG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbCkgCi0JCXsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlUHJvamVjdChJSmF2YVByb2plY3QgcHJqKSB7Ci0JCQkJZm9yIChTdHJpbmcgYWxsb3dlZFByaiA6IGFsbG93ZWRQcm9qZWN0cykKLQkJCQl7Ci0JCQkJCWlmIChwcmouZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoYWxsb3dlZFByaikpCi0JCQkJCXsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2V0VXBNb2RlbEVudGl0ZXNOb3RDaGFuZ2VkKCkKLQl7Ci0JCWZpbmFsIEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBBZGFwdGVySW1wbCgpCi0JCXsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0JCQl7Ci0JCQkJZmFpbCgic2hvdWxkIG5vdCBiZSBjYWxsZWQsIGJlY2F1c2UgdGhlIG9iamVjdHMgY3JlYXRlZCBpbiB0aGUgc2V0dXAgc2hvdWxkIG5vdCBoYXZlIGJlZW4gY2hhbmdlZCBkdXJpbmcgdGhpcyB0ZXN0Iik7Ci0JCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCQkJfQotCQkJCi0JCX07Ci0JCXRoaXMud3MxLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJdGhpcy5zZWkxLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJdGhpcy53czIuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQl0aGlzLnNlaTIuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVsZXRlKGZpbmFsIElTb3VyY2VNYW5pcHVsYXRpb24gc291cmNlLCBmaW5hbCBib29sZWFuIGZvcmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIGRlbGV0ZVJ1bmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkKLQkJewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJCXsKLQkJCQlzb3VyY2UuZGVsZXRlKGZvcmNlLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQkJCi0JCVRlc3RQcm9qZWN0c1V0aWxzLmV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShkZWxldGVSdW5hYmxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9PbkV2ZW50TW9kZWxTeW5jcm9uaXplclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL09uRXZlbnRNb2RlbFN5bmNyb25pemVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDQ3NmNjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL09uRXZlbnRNb2RlbFN5bmNyb25pemVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMuT25FdmVudE1vZGVsU3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBPbkV2ZW50TW9kZWxTeW5jcm9uaXplclRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UgDQotew0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudENoYW5nZWRSZXNvdXJjZUxvYWRDaGFuZ2VkKCkNCi0Jew0KLQkJSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKG51bGwpIHsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDbmFjZWxlZCgpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfSA7DQotCQkNCi0JCU9uRXZlbnRNb2RlbFN5bmNocm9uaXplciBzeW5jID0gbmV3IE9uRXZlbnRNb2RlbFN5bmNocm9uaXplcihyZXNvdXJjZSwgbnVsbCk7DQotCQkvLyBpbiBjYXNlIHJlc291cmNlIGxvYWQgY2FuY2VsIGlzIG5vdCBwcm9jZXNzZWQgY2FsbCB0byBlbGVtZW50IGRlbHRhIHdpbGwgZmFpbCB3aXRoIE5QRQ0KLQkJc3luYy5lbGVtZW50Q2hhbmdlZChudWxsKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R3Vlc3NQcmltYXJ5VHlwZU5hbWVDdUluRGVmYXVsdFBhY2thZ2UoKQ0KLQl7DQotCQlmaW5hbCBNb2NrPElKYXZhTW9kZWw+IGphdmFNb2RlbCA9IG1vY2soSUphdmFNb2RlbC5jbGFzcyk7DQotCQlmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsLnByb3h5KCkpOw0KLQkJDQotCQlmaW5hbCBNb2NrPElKYXZhRWxlbWVudD4gcGFyZW50ID0gbW9jayhJSmF2YUVsZW1lbnQuY2xhc3MpOw0KLQkJcGFyZW50LmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldEVsZW1lbnROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiIikpOw0KLQkJDQotCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gIk15VGVzdCI7DQotCQlmaW5hbCBNb2NrPElDb21waWxhdGlvblVuaXQ+IGN1ID0gbW9jayhJQ29tcGlsYXRpb25Vbml0LmNsYXNzKTsNCi0JCWN1LmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldFBhcmVudCIpLndpbGwocmV0dXJuVmFsdWUocGFyZW50LnByb3h5KCkpKTsNCi0JCWN1LmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldEVsZW1lbnROYW1lIikud2lsbChyZXR1cm5WYWx1ZShjbGFzc05hbWUgKyAiLmphdmEiKSk7DQotDQotCQlmaW5hbCBNeU9uRXZlbnRNb2RlbFN5bmNocm9uaXplciBzeW5jID0gbmV3IE15T25FdmVudE1vZGVsU3luY2hyb25pemVyKHJlc291cmNlLCBudWxsKTsNCi0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IG5hbWUgZ3Vlc3NlZCIsIGNsYXNzTmFtZSwgc3luYy5ndWVzc1ByaW1hcnlUeXBlTmFtZShjdS5wcm94eSgpKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHdWVzc1ByaW1hcnlUeXBlTmFtZUN1SW5Tb21lUGFja2FnZSgpDQotCXsNCi0JCWZpbmFsIE1vY2s8SUphdmFNb2RlbD4gamF2YU1vZGVsID0gbW9jayhJSmF2YU1vZGVsLmNsYXNzKTsNCi0JCWZpbmFsIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwucHJveHkoKSk7DQotCQkNCi0JCWZpbmFsIFN0cmluZyBwYWNrID0gImNvbS5zYXAuZGVtbyI7DQotCQlmaW5hbCBNb2NrPElKYXZhRWxlbWVudD4gcGFyZW50ID0gbW9jayhJSmF2YUVsZW1lbnQuY2xhc3MpOw0KLQkJcGFyZW50LmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldEVsZW1lbnROYW1lIikud2lsbChyZXR1cm5WYWx1ZShwYWNrKSk7DQotCQkNCi0JCWZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSAiTXlUZXN0IjsNCi0JCWZpbmFsIE1vY2s8SUNvbXBpbGF0aW9uVW5pdD4gY3UgPSBtb2NrKElDb21waWxhdGlvblVuaXQuY2xhc3MpOw0KLQkJY3UuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZ2V0UGFyZW50Iikud2lsbChyZXR1cm5WYWx1ZShwYXJlbnQucHJveHkoKSkpOw0KLQkJY3UuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZ2V0RWxlbWVudE5hbWUiKS53aWxsKHJldHVyblZhbHVlKGNsYXNzTmFtZSArICIuamF2YSIpKTsNCi0NCi0JCWZpbmFsIE15T25FdmVudE1vZGVsU3luY2hyb25pemVyIHN5bmMgPSBuZXcgTXlPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIocmVzb3VyY2UsIG51bGwpOw0KLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbmFtZSBndWVzc2VkIiwgcGFjayArICIuIiArIGNsYXNzTmFtZSwgc3luYy5ndWVzc1ByaW1hcnlUeXBlTmFtZShjdS5wcm94eSgpKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RSZWN1cnNldmlseUhhbmRsZUFkZGVkUGFja2FnZXNEb2VzTm90UHJvY2Vzc05vbldzUHJvamVjdHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIE1vY2s8SUphdmFNb2RlbD4gamF2YU1vZGVsID0gbW9jayhJSmF2YU1vZGVsLmNsYXNzKTsNCi0JCWZpbmFsIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwucHJveHkoKSk7DQotCQlmaW5hbCBNeU9uRXZlbnRNb2RlbFN5bmNocm9uaXplciBzeW5jID0gbmV3IE15T25FdmVudE1vZGVsU3luY2hyb25pemVyKHJlc291cmNlLCBudWxsKTsNCi0JCWZpbmFsIE1vY2s8SUphdmFFbGVtZW50RGVsdGE+IGRlbHRhID0gbW9jayhJSmF2YUVsZW1lbnREZWx0YS5jbGFzcyk7DQotCQkvLyBpdCBpcyBleHBlY3RlZCB0aGF0IElKYXZhRWxlbWVudERlbHRhI2dldEFmZmVjdGVkQ2hpbGRyZW4oKSBtZXRob2Qgd2lsbCBub3QgYmUgY2FsbGVkDQotCQlzeW5jLnJlY3Vyc2V2aWx5SGFuZGxlQWRkZWRQYWNrYWdlcyhkZWx0YS5wcm94eSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIGNsYXNzIE15T25FdmVudE1vZGVsU3luY2hyb25pemVyIGV4dGVuZHMgT25FdmVudE1vZGVsU3luY2hyb25pemVyDQotCXsNCi0JCXB1YmxpYyBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0Ow0KLQkJDQotCQlwdWJsaWMgTXlPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSwgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSkgew0KLQkJCXN1cGVyKHJlc291cmNlLCBzZXJ2aWNlRGF0YSk7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIFN0cmluZyBndWVzc1ByaW1hcnlUeXBlTmFtZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7DQotCQkJcmV0dXJuIHN1cGVyLmd1ZXNzUHJpbWFyeVR5cGVOYW1lKGN1KTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgdm9pZCByZWN1cnNldmlseUhhbmRsZUFkZGVkUGFja2FnZXMoSUphdmFFbGVtZW50RGVsdGEgcm9vdERlbHRhKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCQlzdXBlci5yZWN1cnNldmlseUhhbmRsZUFkZGVkUGFja2FnZXMocm9vdERlbHRhKTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGZpbmRQcm9qZWN0QnlEZWx0YShJSmF2YUVsZW1lbnREZWx0YSByb290RGVsdGEpIHsNCi0JCQlyZXR1cm4gd3NQcm9qZWN0Ow0KLQkJfQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1ldGhvZFN5bmNyb25pemF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvU2VpTWV0aG9kU3luY3Jvbml6YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2NGYxNGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvU2VpTWV0aG9kU3luY3Jvbml6YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5Eb21UZXN0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icy5Kb2JVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLkZpbGVVdGlsczsNCi0NCi1wdWJsaWMgY2xhc3MgU2VpTWV0aG9kU3luY3Jvbml6YXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KLQ0KLQlwcml2YXRlIFRlc3RQcm9qZWN0IHRlc3RQcmoxOyANCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHRhcmdldDsNCi0JcHJpdmF0ZSBJSmF2YU1vZGVsIGphdmFNb2RlbDsNCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IHNlaTFDVTsNCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IHNvbWVJbnRmQ1U7DQotCQ0KLQlwcml2YXRlIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByajE7DQotCXByaXZhdGUgSVdlYlNlcnZpY2Ugd3MxOw0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpMTsNCi0JDQotCXByaXZhdGUgRG9tVGVzdFV0aWxzIHRlc3RVdGlsID0gbmV3IERvbVRlc3RVdGlscygpOw0KLQlwcml2YXRlIERvbVV0aWwgZG9tVXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHdzMUltcGxOYW1lID0gImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLldTMSI7DQotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNvbWVJbnRmSW1wbE5hbWUgPSAiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU29tZUludGYiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2VpMUltcGxOYW1lID0gImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLlNlaTEiOw0KLQkNCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlqYXZhTW9kZWwgPSBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7DQotCQl0YXJnZXQgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwpIA0KLQkJew0KLQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmVQcm9qZWN0KElKYXZhUHJvamVjdCBwcmopIHsNCi0JCQkJcmV0dXJuIHByai5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCX0NCi0JCX07DQotCQl0ZXN0UHJqMSA9IG5ldyBUZXN0UHJvamVjdCgiVGVzdFByb2plY3QxIik7DQotCQl0ZXN0UHJqMS5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMxID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEiKTsNCi0JCQ0KLQkJc29tZUludGZDVSA9IHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNvbWVJbnRmLmphdmEiLCAicHVibGljIGludGVyZmFjZSBTb21lSW50ZntcbiIgKw0KLQkJCQkicHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb25JblBhcmVudCgpO1xuIiArDQotCQkJCSJ9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkNCi0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSBleHRlbmRzIFNvbWVJbnRmIHtcbiIgKw0KLQkJCQkicHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb24oKTtcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIndlYk5hbWVcIiwgZXhjbHVkZT10cnVlKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc1dpdGhBbm5vdGF0aW9uKCk7XG4iICsNCi0JCQkJIn0iKTsNCi0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCXRhcmdldC5sb2FkKG51bGwpOw0KLQkJYXNzZXJ0RXF1YWxzKCJPbmUgcHJvamVjdHMgd2VyZSBkZWZpbmVkIGJ1dCBhIGRpZmZlcmVudCBudW1iZXIgd2VyZSBmb3VuZCBpbiB0aGUgRE9NIiwgMSwgdGFyZ2V0LmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgdGFyZ2V0LmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLmdldCgwKS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygxLCB0YXJnZXQuZ2V0RE9NKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkuZ2V0KDApLmdldFdlYlNlcnZpY2VzKCkuc2l6ZSgpKTsNCi0JCXdzUHJqMSA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c1ByajEpOw0KLQkJd3MxID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3MxSW1wbE5hbWUpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3czEpOw0KLQkJc2VpMSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCBzZWkxSW1wbE5hbWUpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWkxKTsNCi0JCXNlaTFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF92b2lkTWV0aG9kV2l0aE5vQXJnc05vQW5ub3RhdGlvblN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kRWxlbSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRNZXRob2QoInZvaWRNZXRob2RXaXRoTm9BcmdzTm9Bbm5vdGF0aW9uIiwgbmV3IFN0cmluZ1swXSk7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pKTsNCi0JCWFzc2VydE5vdE51bGwod20pOw0KLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZEVsZW0uZ2V0RWxlbWVudE5hbWUoKSwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod20uZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7DQotCQlhc3NlcnRFcXVhbHMoZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbSksIHdtLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJYXNzZXJ0RmFsc2Uod20uaXNFeGNsdWRlZCgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF92b2lkTWV0aG9kV2l0aE5vQXJnc1dpdGhBbm5vdGF0aW9uU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldE1ldGhvZCgidm9pZE1ldGhvZFdpdGhOb0FyZ3NXaXRoQW5ub3RhdGlvbiIsIG5ldyBTdHJpbmdbMF0pOw0KLQkJZmluYWwgSVdlYk1ldGhvZCB3bSA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSk7DQotCQlhc3NlcnROb3ROdWxsKHdtKTsNCi0JCWFzc2VydEVxdWFscygid2ViTmFtZSIsIHdtLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHdtLmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pLCB3bS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydFRydWUod20uaXNFeGNsdWRlZCgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF93ZWJOYW1lQ2hhbmdlZFN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kRWxlbSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRNZXRob2QoInZvaWRNZXRob2RXaXRoTm9BcmdzV2l0aEFubm90YXRpb24iLCBuZXcgU3RyaW5nWzBdKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbSkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3bSk7DQotCQlhc3NlcnRFcXVhbHMoIndlYk5hbWUiLCB3bS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3bS5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsNCi0JCWFzc2VydEVxdWFscyhkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSwgd20uZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlhc3NlcnRUcnVlKHdtLmlzRXhjbHVkZWQoKSk7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKS5zZXRDb21waWxhdGlvblVuaXRDb250ZW50KHNlaTFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkxIHtcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIndlYk5hbWVOZXdcIiwgZXhjbHVkZT10cnVlKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc1dpdGhBbm5vdGF0aW9uKCk7XG4iICsNCi0JCQkJIn0iLCBmYWxzZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoIndlYk5hbWVOZXciLCB3bS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3bS5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsNCi0JCWFzc2VydEVxdWFscyhkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSwgd20uZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlhc3NlcnRUcnVlKHdtLmlzRXhjbHVkZWQoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfZXhjbHVkZWRDaGFuZ2VkU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldE1ldGhvZCgidm9pZE1ldGhvZFdpdGhOb0FyZ3NXaXRoQW5ub3RhdGlvbiIsIG5ldyBTdHJpbmdbMF0pOw0KLQkJZmluYWwgSVdlYk1ldGhvZCB3bSA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSk7DQotCQlhc3NlcnROb3ROdWxsKHdtKTsNCi0JCWFzc2VydEVxdWFscygid2ViTmFtZSIsIHdtLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHdtLmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pLCB3bS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydFRydWUod20uaXNFeGNsdWRlZCgpKTsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCUZpbGVVdGlscy5nZXRJbnN0YW5jZSgpLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoc2VpMUNVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEge1xuIiArDQotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTmFtZVwiLCBleGNsdWRlPWZhbHNlKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc1dpdGhBbm5vdGF0aW9uKCk7XG4iICsNCi0JCQkJIn0iLCBmYWxzZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoIndlYk5hbWUiLCB3bS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3bS5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsNCi0JCWFzc2VydEVxdWFscyhkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSwgd20uZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlhc3NlcnRGYWxzZSh3bS5pc0V4Y2x1ZGVkKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlZE1ldGhvZFN5bmNlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RUb0RlbGV0ZSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRNZXRob2QoInZvaWRNZXRob2RXaXRoTm9BcmdzTm9Bbm5vdGF0aW9uIiwgbmV3IFN0cmluZ1swXSk7DQotCQlmaW5hbCBTdHJpbmcgbWV0aG9kVG9EZWxldGVJbXBsPSBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RUb0RlbGV0ZSk7DQotCQ0KLQkJRmlsZVV0aWxzLmdldEluc3RhbmNlKCkuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChzZWkxQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7XG4iICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJOYW1lXCIsIGV4Y2x1ZGU9dHJ1ZSkgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NXaXRoQW5ub3RhdGlvbigpO1xuIiArDQotCQkJCSJ9IiwgZmFsc2UsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0TnVsbChkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgbWV0aG9kVG9EZWxldGVJbXBsKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3Rfb3ZlcmxvYWRlZE1ldGhvZExvYWRlZFByb3Blcmx5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG5ld01ldGhvZCA9IHNlaTFDVS5maW5kUHJpbWFyeVR5cGUoKS5jcmVhdGVNZXRob2QoIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJOYW1lXCIsIGV4Y2x1ZGU9dHJ1ZSkgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NXaXRoQW5ub3RhdGlvbihpbnQgaSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCBuZXdXZWJNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obmV3TWV0aG9kKSk7DQotCQlhc3NlcnROb3ROdWxsKG5ld1dlYk1ldGhvZCk7DQotCQlmaW5hbCBJTWV0aG9kIG9sZE1ldGhvZCA9IHNlaTFDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoInZvaWRNZXRob2RXaXRoTm9BcmdzV2l0aEFubm90YXRpb24iLCBuZXcgU3RyaW5nWzBdKTsNCi0JCWFzc2VydE5vdFNhbWUobmV3V2ViTWV0aG9kLCBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24ob2xkTWV0aG9kKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X01ldGhvZHNGcm9tU3VwZXJUeXBlTG9hZGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIHBhcmVudE1ldGhvZCA9IHNvbWVJbnRmQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJ2b2lkTWV0aG9kV2l0aE5vQXJnc05vQW5ub3RhdGlvbkluUGFyZW50IiwgbmV3IFN0cmluZ1swXSk7DQotCQlhc3NlcnROb3ROdWxsKGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihwYXJlbnRNZXRob2QpKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfT3ZlcnJpZGVNZXRob2RzTG9hZGVkUHJvcGVybHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCXNlaTFDVS5maW5kUHJpbWFyeVR5cGUoKS5jcmVhdGVNZXRob2QoIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJOYW1lXCIsIGV4Y2x1ZGU9dHJ1ZSkgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb25JblBhcmVudCgpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotDQotCQlmaW5hbCBJTWV0aG9kIG92ZXJyaWRlbk1ldGhvZCA9IHNlaTFDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoInZvaWRNZXRob2RXaXRoTm9BcmdzTm9Bbm5vdGF0aW9uSW5QYXJlbnQiLCAgbmV3IFN0cmluZ1swXSk7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG92ZXJyaWRlbk1ldGhvZCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3bSk7DQotCQlhc3NlcnRFcXVhbHMoIndlYk5hbWUiLCB3bS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3bS5pc0V4Y2x1ZGVkKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X0NoYW5nZWRNZXRob2RJblBhcmVudEludGVyZmFjZVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCXNvbWVJbnRmQ1UuZ2V0QnVmZmVyKCkuc2F2ZShudWxsLCBmYWxzZSk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlmaW5hbCBJTWV0aG9kIHBhcmVudE1ldGhvZCA9IHNvbWVJbnRmQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJ2b2lkTWV0aG9kV2l0aE5vQXJnc05vQW5ub3RhdGlvbkluUGFyZW50IiwgbmV3IFN0cmluZ1swXSk7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKHBhcmVudE1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJ2b2lkTWV0aG9kV2l0aE5vQXJnc05vQW5ub3RhdGlvbkluUGFyZW50Iiwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydEZhbHNlKHdtLmlzRXhjbHVkZWQoKSk7DQotCQlGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKS5zZXRDb21waWxhdGlvblVuaXRDb250ZW50KHNvbWVJbnRmQ1UsICJwdWJsaWMgaW50ZXJmYWNlIFNvbWVJbnRme1xuIiArDQotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwiTWV0aG9kSW5QYXJlbnRDbGFzc1dpdGhOZXdOYW1lXCIsIGV4Y2x1ZGU9dHJ1ZSkgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb25JblBhcmVudCgpO1xuIiArDQotCQkJCSJ9IiwgZmFsc2UsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3bSk7DQotCQlhc3NlcnRFcXVhbHMoIk1ldGhvZEluUGFyZW50Q2xhc3NXaXRoTmV3TmFtZSIsIHdtLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHdtLmlzRXhjbHVkZWQoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfQ2hhbmdlZFNvYXBCaW5kaW5nU3luY2hlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwkNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7IHB1YmxpYyB2b2lkIHNvYXBCaW5kaW5nTWV0aG9kKCk7IH0iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWZpbmFsIElNZXRob2QgbmV3TWV0aG9kID0gc2VpMUNVLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgic29hcEJpbmRpbmdNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsNCi0JCWZpbmFsIElXZWJNZXRob2QgbmV3V2ViTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG5ld01ldGhvZCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChuZXdXZWJNZXRob2QpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1VzZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOw0KLQkJDQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZWkxQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEgeyBcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nKHN0eWxlPVN0eWxlLlJQQywgdXNlPVVzZS5FTkNPREVELCBwYXJhbWV0ZXJTdHlsZT1QYXJhbWV0ZXJTdHlsZS5CQVJFKVxuIiArDQotCQkJCSJwdWJsaWMgdm9pZCBzb2FwQmluZGluZ01ldGhvZCgpOyB9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5SUEMsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1VzZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X1NvYXBCaW5kaW5nT25TZWlTeW5jaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7CQ0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMoc2VpMUNVLCAiQGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nKHN0eWxlPVN0eWxlLlJQQywgdXNlPVVzZS5FTkNPREVELCBwYXJhbWV0ZXJTdHlsZT1QYXJhbWV0ZXJTdHlsZS5CQVJFKVxuIiArIA0KLQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGludGVyZmFjZSBTZWkxIHsgcHVibGljIHZvaWQgc29hcEJpbmRpbmdNZXRob2QoKTsgfSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZmluYWwgSU1ldGhvZCBuZXdNZXRob2QgPSBzZWkxQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJzb2FwQmluZGluZ01ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOw0KLQkJZmluYWwgSVdlYk1ldGhvZCBuZXdXZWJNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obmV3TWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5SUEMsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1VzZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X1NvYXBCaW5kaW5nT25TZWlPdmVybGFwcGluZ0Fubm90YXRpb25Pbk1ldGhvZFN5bmNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTFDVSwgIkBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyhzdHlsZT1TdHlsZS5SUEMsIHVzZT1Vc2UuRU5DT0RFRCwgcGFyYW1ldGVyU3R5bGU9UGFyYW1ldGVyU3R5bGUuQkFSRSlcbiIgKyANCi0JCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7ICIgKw0KLQkJCQkJIkBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyhzdHlsZT1TdHlsZS5ET0NVTUVOVCwgdXNlPVVzZS5MSVRFUkFMLCBwYXJhbWV0ZXJTdHlsZT1QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKSIgKw0KLQkJCQkJInB1YmxpYyB2b2lkIHNvYXBCaW5kaW5nTWV0aG9kKCk7IiArIA0KLQkJCQkifSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZmluYWwgSU1ldGhvZCBuZXdNZXRob2QgPSBzZWkxQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJzb2FwQmluZGluZ01ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOw0KLQkJZmluYWwgSVdlYk1ldGhvZCBuZXdXZWJNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obmV3TWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCwgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuTElURVJBTCwgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nVXNlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCwgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7DQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X1NvYXBCaW5kaW5nT25TZWlXcm9uZ092ZXJsYXBwaW5nQW5ub3RhdGlvbk9uTWV0aG9kU3luY2hlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwkNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTFDVSwgIkBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyhzdHlsZT1TdHlsZS5SUEMsIHVzZT1Vc2UuRU5DT0RFRCwgcGFyYW1ldGVyU3R5bGU9UGFyYW1ldGVyU3R5bGUuQkFSRSlcbiIgKyANCi0JCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7ICIgKw0KLQkJCQkJIkBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyhzdHlsZT1TdHlsZS5ET0NVTUVOVDEsIHVzZT1Vc2UuTElURVJBTDEsIHBhcmFtZXRlclN0eWxlPVBhcmFtZXRlclN0eWxlLldSQVBQRUQxKSIgKw0KLQkJCQkJInB1YmxpYyB2b2lkIHNvYXBCaW5kaW5nTWV0aG9kKCk7IiArIA0KLQkJCQkifSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZmluYWwgSU1ldGhvZCBuZXdNZXRob2QgPSBzZWkxQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJzb2FwQmluZGluZ01ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOw0KLQkJZmluYWwgSVdlYk1ldGhvZCBuZXdXZWJNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obmV3TWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5SUEMsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1VzZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUsIG5ld1dlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOw0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9TZWlTeW5jcm9uaXphdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL1NlaVN5bmNyb25pemF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OGVhZTFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL1NlaVN5bmNyb25pemF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmpvYnMuSm9iVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBTZWlTeW5jcm9uaXphdGlvblRlc3QgZXh0ZW5kcyBTeW5jaHJvbml6YXRpb25UZXN0Rml4dHVyZQ0KLXsNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZFNlaU5hbWVTeW5jaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHNlaTFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCWFzc2VydEVxdWFscygiU2VpMSIsIHNlaTEuZ2V0TmFtZSgpKTsgLy8gY2hlY2sgZGVmYXVsdCB2YWx1ZQ0KLQkJDQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZWkxQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOZXdOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCWFzc2VydEVxdWFscygiU2VpMU5ld05hbWUiLCBzZWkxLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHNlaTEuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jb250YWlucyh3czEpKTsNCi0JCWFzc2VydFNhbWUoc2VpMSwgZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHNlaTEuZ2V0SW1wbGVtZW50YXRpb24oKSkpOw0KLQkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZFNlaVRhcmdldE5hbWVzcGFjZVN5bmNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWFzc2VydEVxdWFscyhKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZShwcmoxUGNrTmFtZSksIHNlaTEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOyAvLyBjaGVjayBkZWZhdWx0IHZhbHVlDQotCQkNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2VpMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMoc2VpMUNVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmV3TmFtZVwiLCB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vY29tLnNhcC90ZXN0XCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCWFzc2VydEVxdWFscygiU2VpMU5ld05hbWUiLCBzZWkxLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHNlaTEuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jb250YWlucyh3czEpKTsNCi0JCWFzc2VydFNhbWUoc2VpMSwgZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHNlaTEuZ2V0SW1wbGVtZW50YXRpb24oKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJTRUkgdGFyZ2V0TmFtZXNwYWNlIG5vdCBzeW5jaGVkIiwgImh0dHA6Ly9jb20uc2FwL3Rlc3QiLCBzZWkxLmdldFRhcmdldE5hbWVzcGFjZSgpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X1NvYXBCaW5kaW5nU3R5bGVDaGFuZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCwgc2VpMS5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwsIHNlaTEuZ2V0U29hcEJpbmRpbmdVc2UoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVELCBzZWkxLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7DQotDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHNlaTFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTFDVSwgIkBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyhzdHlsZT1TdHlsZS5SUEMsIHVzZT1Vc2UuRU5DT0RFRCwgcGFyYW1ldGVyU3R5bGU9UGFyYW1ldGVyU3R5bGUuQkFSRSkiICsgDQotCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5SUEMsIHNlaTEuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5FTkNPREVELCBzZWkxLmdldFNvYXBCaW5kaW5nVXNlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSwgc2VpMS5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOwkJDQotCX0NCi0vLwkNCi0vLwlwdWJsaWMgdm9pZCB0ZXN0X0xvY2F0aW9uSW50ZXJmYWNlQWRhcHRlZCgpIHRocm93cyBFeGNlcHRpb24NCi0vLwl7DQotLy8JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2VpMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLS8vCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZWkxQ1UsICJAamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcoc3R5bGU9U3R5bGUuUlBDLCB1c2U9VXNlLkVOQ09ERUQsIHBhcmFtZXRlclN0eWxlPVBhcmFtZXRlclN0eWxlLkJBUkUpIiArIA0KLS8vCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEge30iKTsNCi0vLwkJDQotLy8JCUlMb2NhdG9yQWRhcHRlciBhZGFwdGVyID0gKElMb2NhdG9yQWRhcHRlcilmaW5kQWRhcHRlcihzZWkxLCBJTG9jYXRvckFkYXB0ZXIuY2xhc3MpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGFkYXB0ZXIpOw0KLS8vCQlJQW5ub3RhdGlvbkxvY2F0b3IgbG9jYXRvciA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbkxvY2F0b3IoV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTik7DQotLy8JCXByaW50TG9jYXRvcigiV1MiLCBsb2NhdG9yLmdldExvY2F0aW9uKCkpOw0KLS8vCQlsb2NhdG9yID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uTG9jYXRvcihTQkFubm90YXRpb25GZWF0dXJlcy5TQl9BTk5PVEFUSU9OKTsNCi0vLwkJcHJpbnRMb2NhdG9yKCJTQiIsIGxvY2F0b3IuZ2V0TG9jYXRpb24oKSk7DQotLy8JCXByaW50TG9jYXRvcigidXNlIiwgbG9jYXRvci5nZXRBdHRyaWJ1dGVOYW1lTG9jYXRpb24oInVzZSIpKTsNCi0vLwkJcHJpbnRMb2NhdG9yKCJ1c2VWYWwiLCBsb2NhdG9yLmdldEF0dHJpYnV0ZVZhbHVlTG9jYXRpb24oInVzZSIpKTsNCi0vLwl9DQotLy8JDQotLy8JcHJpdmF0ZSB2b2lkIHByaW50TG9jYXRvcihTdHJpbmcgbmFtZSwgSUxvY2F0b3IgbG9jYXRvcikNCi0vLwl7DQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIi0tLS0tLSIpOw0KLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4obG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4obG9jYXRvci5nZXRMZW5ndGgoKSk7CQkNCi0vLwl9CQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9TeW5jaHJvbml6YXRpb25UZXN0Rml4dHVyZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvU3luY2hyb25pemF0aW9uVGVzdEZpeHR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTQ5MGQ3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9TeW5jaHJvbml6YXRpb25UZXN0Rml4dHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZURlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLkRvbVRlc3RVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icy5Kb2JVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RFamIzUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25UZXN0Rml4dHVyZSBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZQ0KLXsNCi0JcHJvdGVjdGVkIFRlc3RQcm9qZWN0IHRlc3RQcmoxOyANCi0JcHJvdGVjdGVkIFRlc3RQcm9qZWN0IHRlc3RQcmoyOw0KLQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXQ7DQotCXByb3RlY3RlZCBJSmF2YU1vZGVsIGphdmFNb2RlbDsNCi0JDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHByajFQY2tOYW1lID0gImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxIjsJDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHByajJQY2tOYW1lID0gImNvbS5zYXAudGVzdC5tb2RlbHN5bmMyIjsNCi0JDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHdzMUltcGxOYW1lID0gcHJqMVBja05hbWUgKyAiLldTMSI7DQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHNlaTFJbXBsTmFtZSA9IHByajFQY2tOYW1lICsgIi5TZWkxIjsNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgd3MySW1wbE5hbWUgPSBwcmoyUGNrTmFtZSArICIuV1MyIjsNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2VpMkltcGxOYW1lID0gcHJqMlBja05hbWUgKyAiLlNlaTIiOwkNCi0JDQotCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmoxOw0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2Ugd3MxOw0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkxOw0KLQkNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByajI7DQotCXByb3RlY3RlZCBJV2ViU2VydmljZSB3czI7DQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTI7DQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gYWxsb3dlZFByb2plY3RzOw0KLQkNCi0JcHJvdGVjdGVkIERvbVV0aWwgZG9tVXRpbCA9ICBuZXcgRG9tVXRpbCgpOw0KLQlwcm90ZWN0ZWQgRG9tVGVzdFV0aWxzIHRlc3RVdGlsID0gIG5ldyBEb21UZXN0VXRpbHMoKTsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWFsbG93ZWRQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigzKTsNCi0JCWphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JCXRhcmdldCA9IGNyZWF0ZVRhcmdldCgpOw0KLQkJdGVzdFByajEgPSBuZXcgVGVzdFByb2plY3QobmV3IFRlc3RFamIzUHJvamVjdCgiVGVzdFByb2plY3QxIikuZ2V0UHJvamVjdCgpKTsNCi0JCXRlc3RQcmoxLmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzEgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMSIpOw0KLQkJZmluYWwgU3RyaW5nIGphdmFNb2RlbEVycm9yTWVzc2FnZSA9ICJKYXZhIE1vZGVsIEVycm9yLiBKdXN0IGNyZWF0ZWQgdHlwZSBub3QgZm91bmQgaW4gdGhlIGphdmEgbW9kZWwiOw0KLQkJYXNzZXJ0Tm90TnVsbChqYXZhTW9kZWxFcnJvck1lc3NhZ2UsIHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7fSIpKTsNCi0JCWFzc2VydE5vdE51bGwoamF2YU1vZGVsRXJyb3JNZXNzYWdlLCB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU2VpMVwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9IikpOw0KLQkJCQkNCi0JCXRlc3RQcmoyID0gbmV3IFRlc3RQcm9qZWN0KG5ldyBUZXN0RWpiM1Byb2plY3QoIlRlc3RQcm9qZWN0MiIpLmdldFByb2plY3QoKSk7DQotCQl0ZXN0UHJqMi5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMyID0gdGVzdFByajIuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzIiKTsNCi0JCWFzc2VydE5vdE51bGwoamF2YU1vZGVsRXJyb3JNZXNzYWdlLCB0ZXN0UHJqMi5jcmVhdGVUeXBlKG1vZGVsU3luYzIsICJTZWkyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkyTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTIge30iKSk7DQotCQlhc3NlcnROb3ROdWxsKGphdmFNb2RlbEVycm9yTWVzc2FnZSwgdGVzdFByajIuY3JlYXRlVHlwZShtb2RlbFN5bmMyLCAiV1MyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MyTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLlNlaTJcIikgcHVibGljIGNsYXNzIFdTMiB7fSIpKTsNCi0JCQ0KLQkJYWxsb3dlZFByb2plY3RzLmFkZCh0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJYWxsb3dlZFByb2plY3RzLmFkZCh0ZXN0UHJqMi5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJdGFyZ2V0LmxvYWQobnVsbCk7DQotCQl3c1ByajEgPSBkb21VdGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWFzc2VydE5vdE51bGwod3NQcmoxKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzUHJqMS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygxLCB3c1ByajEuZ2V0V2ViU2VydmljZXMoKS5zaXplKCkpOw0KLQkJCQkNCi0JCXdzMSA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzMUltcGxOYW1lKTsNCi0JCWFzc2VydE5vdE51bGwod3MxKTsNCi0JCXNlaTEgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgc2VpMUltcGxOYW1lKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpMSk7DQotCQl3c1ByajIgPSBkb21VdGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajIuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWFzc2VydE5vdE51bGwod3NQcmoyKTsNCi0JCWFzc2VydEVxdWFscygxLCB3c1ByajIuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd3NQcmoyLmdldFdlYlNlcnZpY2VzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJd3MyID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMiwgd3MySW1wbE5hbWUpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3czIpOw0KLQkJc2VpMiA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoyLCBzZWkySW1wbE5hbWUpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWkyKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGJlZm9yZVRlc3RDYXNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZW5hYmxlQXV0b0J1aWxkKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSwgZmFsc2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgYWZ0ZXJUZXN0Q2FzZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWVuYWJsZUF1dG9CdWlsZChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCksIHRydWUpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgZW5hYmxlQXV0b0J1aWxkKElXb3Jrc3BhY2Ugd3MsIGJvb2xlYW4gZW5hYmxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzYyA9IHdzLmdldERlc2NyaXB0aW9uKCk7DQotCQlkZXNjLnNldEF1dG9CdWlsZGluZyhlbmFibGUpOw0KLQkJd3Muc2V0RGVzY3JpcHRpb24oZGVzYyk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBBZGFwdGVyIGZpbmRBZGFwdGVyKEVPYmplY3Qgb2JqZWN0LCBDbGFzczw/PiBjbGF6eikgew0KLQkJZm9yIChBZGFwdGVyIGFkYXB0ZXI6IG9iamVjdC5lQWRhcHRlcnMoKSkgew0KLQkJCWlmIChhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUoY2xhenopKSB7DQotCQkJCXJldHVybiBhZGFwdGVyOyANCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0b3BTeW5jaHJvbml6aW5nKCk7DQotCQl0ZXN0UHJqMS5kaXNwb3NlKCk7DQotCQl0ZXN0UHJqMi5kaXNwb3NlKCk7DQotCX0NCi0JDQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBjcmVhdGVUYXJnZXQoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsKSANCi0JCXsNCi0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlUHJvamVjdChJSmF2YVByb2plY3QgcHJqKSB7DQotCQkJCWZvciAoU3RyaW5nIGFsbG93ZWRQcmogOiBhbGxvd2VkUHJvamVjdHMpDQotCQkJCXsNCi0JCQkJCWlmIChwcmouZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoYWxsb3dlZFByaikpDQotCQkJCQl7DQotCQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX07DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL1dzU3luY2hyb25pemF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvV3NTeW5jaHJvbml6YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0ZmUyMDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvV3NTeW5jaHJvbml6YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgV3NTeW5jaHJvbml6YXRpb25UZXN0IGV4dGVuZHMgU3luY2hyb25pemF0aW9uVGVzdEZpeHR1cmUgCi17Ci0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkV1NuYW1lU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3czFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3czFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5ld05hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiV1MxTmV3TmFtZSIsIHdzMS5nZXROYW1lKCkpOwotCQlhc3NlcnRTYW1lKHNlaTEsIHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7Ci0JCWFzc2VydFNhbWUod3MxLCBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTmFtZU9mSW1wbGljaXRJbnRlcmZhY2UoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMyA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMzIik7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3MzQ1UgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzMsICJXUzMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzNOYW1lXCIsIG5hbWU9XCJJbXBsaWNpdEludGVyZmFjZU5hbWVcIikgcHVibGljIGNsYXNzIFdTMyB7fSIpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MzID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3MzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGltcGxTZWkgPSB3czMuZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0JCWFzc2VydFRydWUoaW1wbFNlaS5pc0ltcGxpY2l0KCkpOwotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3czNDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTM05hbWVcIiwgbmFtZT1cIkltcGxpY2l0SW50ZXJmYWNlTmV3TmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MzIHt9Iik7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlhc3NlcnRTYW1lKGltcGxTZWksIHdzMy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7Ci0JCWFzc2VydFRydWUoaW1wbFNlaS5pc0ltcGxpY2l0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkltcGxpY2l0SW50ZXJmYWNlTmV3TmFtZSIsIGltcGxTZWkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkVGFyZ2V0TmFtZXNwYWNlU3luY2hlZCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKHByajFQY2tOYW1lKSwgd3MxLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3NDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3c0NVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vY29tLnNhcC4vdGVzdFwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInRhcmdldE5hbWVzcGFjZSBub3Qgc3luY2hyb25pemVkIiwgImh0dHA6Ly9jb20uc2FwLi90ZXN0Iiwgd3MxLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkUG9ydE5hbWVTeW5jaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXUzFQb3J0Iiwgd3MxLmdldFBvcnROYW1lKCkpOwotCQkKLQkJdGVzdFV0aWwuc2V0Q29udGVudHMod3NDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShwb3J0TmFtZT1cIkNoYW5nZWRQb3J0TmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7OwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJwb3J0TmFtZSBub3Qgc3luY2hyb25pemVkIiwgIkNoYW5nZWRQb3J0TmFtZSIsIHdzMS5nZXRQb3J0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkV3NkbExvY2F0aW9uU3luY2hlZCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0NVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB3czEuZ2V0V3NkbExvY2F0aW9uKCkpOwotCQkKLQkJdGVzdFV0aWwuc2V0Q29udGVudHMod3NDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZSh3c2RsTG9jYXRpb249XCJDOi9jaGFuZ2VkL3dzZGwvbG9jYXRpb25cIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOzsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygid3NkbExvY2F0aW9uIG5vdCBzeW5jaHJvbml6ZWQiLCAiQzovY2hhbmdlZC93c2RsL2xvY2F0aW9uIiwgd3MxLmdldFdzZGxMb2NhdGlvbigpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZEltcGxpY2l0U2VpU29hcEJpbmRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3NDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkKLQkJdGVzdFV0aWwuc2V0Q29udGVudHMod3NDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gd3MxLmdldFNlcnZpY2VFbmRwb2ludCgpOwotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCwgc2VpLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7Ci0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5MSVRFUkFMLCBzZWkuZ2V0U29hcEJpbmRpbmdVc2UoKSk7Ci0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQsIHNlaS5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOwotCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzQ1UsICJAamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcoc3R5bGU9U3R5bGUuUlBDLCB1c2U9VXNlLkVOQ09ERUQsIHBhcmFtZXRlclN0eWxlPVBhcmFtZXRlclN0eWxlLkJBUkUpXG4iICsgCi0JCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLlJQQywgc2VpLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7Ci0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5FTkNPREVELCBzZWkuZ2V0U29hcEJpbmRpbmdVc2UoKSk7Ci0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUsIHNlaS5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF9Db250cnVjdG9ySXNOb3RJbmNsdWRlZEluV2ViTWV0aG9kcygpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3NDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkKLQkJdGVzdFV0aWwuc2V0Q29udGVudHMod3NDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZSgpcHVibGljIGNsYXNzIFdTMXtwdWJsaWMgV1MxKCl7fTtwdWJsaWMgV1MxKFN0cmluZyBzKXt9cHVibGljIHZvaWQgbXlNZXRob2QoKXt9fSIpOwotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQkKLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSB3czEuZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0JCWZpbmFsIEVMaXN0PElXZWJNZXRob2Q+IG1ldGhvZHMgPSBzZWkuZ2V0V2ViTWV0aG9kcygpOwotCQlhc3NlcnRFcXVhbHMoIk9uZSBtZXRob2QgZXhwZWN0ZWQgaW4gdGhlIFNFSSIsIDEsIG1ldGhvZHMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbnBleHBlY3RlZCBtZXRob2QgbmFtZSBpbiBTRUkiLCAibXlNZXRob2QiLCBtZXRob2RzLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3V0aWwvRG9tMlJlc291cmNlTWFwcGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3V0aWwvRG9tMlJlc291cmNlTWFwcGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZDlhM2IxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS91dGlsL0RvbTJSZXNvdXJjZU1hcHBlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbTJSZXNvdXJjZU1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdEVqYjNQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsKLQotLyoqCi0gKiBUZXN0cyBmb3Ige0BsaW5rIERvbTJSZXNvdXJjZU1hcHBlcn0gY2xhc3MKLSAqIAotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdgotICovCi1wdWJsaWMgY2xhc3MgRG9tMlJlc291cmNlTWFwcGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHJpdmF0ZSBEb20yUmVzb3VyY2VNYXBwZXIgbWFwcGVyID0gRG9tMlJlc291cmNlTWFwcGVyLklOU1RBTkNFOwotICAgIHByaXZhdGUgVGVzdFByb2plY3QgdGVzdFByb2plY3Q7Ci0gICAgcHJpdmF0ZSBUZXN0UHJvamVjdCB0ZXN0UHJvamVjdDE7Ci0KLSAgICBwcml2YXRlIElUeXBlIHNlaVR5cGU7Ci0gICAgcHJpdmF0ZSBJVHlwZSB3c1R5cGU7Ci0gICAgcHJpdmF0ZSBJRE9NIGRvbTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGVzdFByb2plY3QgPSBwcmVwYXJlUHJvamVjdCgpOwotICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBjayA9IHRlc3RQcm9qZWN0LmNyZWF0ZVBhY2thZ2UoInRlc3QiKTsKLSAgICAgICAgc2VpVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUocGNrLCAiU2VpLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHsgXG4iICsKLSAgICAgICAgICAgICAgICAiQGphdmF4Lmp3cy5XZWJNZXRob2QgcHVibGljIHZvaWQgdGVzdChpbnQgYSk7IFxuIiArCi0gICAgICAgICJ9Iik7Ci0KLSAgICAgICAgdGVzdFByb2plY3QxID0gcHJlcGFyZVByb2plY3QoKTsKLSAgICAgICAgcGNrID0gdGVzdFByb2plY3QxLmNyZWF0ZVBhY2thZ2UoInRlc3QiKTsKLSAgICAgICAgd3NUeXBlID0gdGVzdFByb2plY3QxLmNyZWF0ZVR5cGUocGNrLCAiV3MuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGNsYXNzIFdzIHt9Iik7Ci0KLQotICAgICAgICBmaW5hbCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGRvbVJ1bnRpbWUgPSBXc0RPTVJ1bnRpbWVNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0RE9NUnVudGltZSgib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5qZWU1Iik7Ci0gICAgICAgIGRvbVJ1bnRpbWUuY3JlYXRlRE9NKG51bGwpOwotICAgICAgICBkb20gPSBkb21SdW50aW1lLmdldERPTSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgVGVzdFByb2plY3QgcHJlcGFyZVByb2plY3QoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBUZXN0RWpiM1Byb2plY3QgdHAgPSBuZXcgVGVzdEVqYjNQcm9qZWN0KCJFamIiKTsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0UHJvamVjdCh0cC5nZXRQcm9qZWN0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkKLSAgICB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZXN0UHJvamVjdC5kaXNwb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBfKSB7fQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGVzdFByb2plY3QxLmRpc3Bvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIF8pIHt9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmRQcm9qZWN0KCkKLSAgICB7Ci0gICAgICAgIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSBEb21VdGlsLklOU1RBTkNFLmZpbmRQcm9qZWN0QnlOYW1lKGRvbSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBtYXBwZXIuZmluZFByb2plY3Qod3NQcm9qZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSwgcHJvamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmRSZXNvdXJjZVNlaSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSBEb21VdGlsLklOU1RBTkNFLmZpbmRQcm9qZWN0QnlOYW1lKGRvbSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0gICAgICAgIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gRG9tVXRpbC5JTlNUQU5DRS5maW5kU2VpQnlJbXBsTmFtZSh3c1Byb2plY3QsICJ0ZXN0LlNlaSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlaSk7Ci0KLSAgICAgICAgLy8gZmluZCB1c2luZyBTRUkKLSAgICAgICAgSVR5cGUgdHlwZSA9IG1hcHBlci5maW5kVHlwZShzZWkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VpVHlwZSwgdHlwZSk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbmRSZXNvdXJjZVdzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFByb2plY3RCeU5hbWUoZG9tLCB0ZXN0UHJvamVjdDEuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCUlXZWJTZXJ2aWNlIHdzID0gRG9tVXRpbC5JTlNUQU5DRS5maW5kV3NCeUltcGxOYW1lKHdzUHJvamVjdCwgInRlc3QuV3MiKTsKLQkJYXNzZXJ0Tm90TnVsbCh3cyk7Ci0KLQkJSVR5cGUgdHlwZSA9IG1hcHBlci5maW5kVHlwZSh3cyk7Ci0JCWFzc2VydE5vdE51bGwodHlwZSk7Ci0JCWFzc2VydEVxdWFscyh3c1R5cGUsIHR5cGUpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kUmVzb3VyY2VXZWJNZXRob2QoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gRG9tVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEJ5TmFtZShkb20sIHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotICAgICAgICBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFNlaUJ5SW1wbE5hbWUod3NQcm9qZWN0LCAidGVzdC5TZWkiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZWkpOwotCi0gICAgICAgIElUeXBlIHR5cGUgPSBtYXBwZXIuZmluZFR5cGUoc2VpLmdldFdlYk1ldGhvZHMoKS5nZXQoMCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VpVHlwZSwgdHlwZSk7Ci0KLSAgICAgICAgZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCk7Ci0gICAgICAgIHR5cGUgPSBtYXBwZXIuZmluZFR5cGUod2ViTWV0aG9kKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh0eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZFJlc291cmNlV2ViUGFyYW0oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gRG9tVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEJ5TmFtZShkb20sIHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotICAgICAgICBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFNlaUJ5SW1wbE5hbWUod3NQcm9qZWN0LCAidGVzdC5TZWkiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZWkpOwotCi0gICAgICAgIElUeXBlIHR5cGUgPSBtYXBwZXIuZmluZFR5cGUoc2VpLmdldFdlYk1ldGhvZHMoKS5nZXQoMCkuZ2V0UGFyYW1ldGVycygpLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodHlwZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZWlUeXBlLCB0eXBlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdXRpbC9Eb21VdGlsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3V0aWwvRG9tVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNmZGQyMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdXRpbC9Eb21VdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnV0aWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgRG9tVXRpbFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17DQotCXByaXZhdGUgRG9tVXRpbCB1dGlsOyANCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0Jew0KLQkJdXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdElzT3V0aWRlSW5XZWJTZXJ2aWNlKCkNCi0Jew0KLQkJTW9jazxJV2ViU2VydmljZT4gd3MgPSBtb2NrKElXZWJTZXJ2aWNlLmNsYXNzKTsNCi0JCXdzLnN0dWJzKCkubWV0aG9kKCJnZXRXc2RsTG9jYXRpb24iKS53aWxsKHJldHVyblZhbHVlKCJDOi90ZXN0L3dzZGwvbG9jYXRpb24iKSk7DQotCQlNb2NrPElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IHNlaSA9IG1vY2soSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcyk7DQotCQlFTGlzdDxJV2ViU2VydmljZT4gaW1wbGVtZXRpbmdXcyA9IG5ldyBCYXNpY0VMaXN0PElXZWJTZXJ2aWNlPigpOw0KLQkJaW1wbGVtZXRpbmdXcy5hZGQod3MucHJveHkoKSk7DQotCQkNCi0JCXNlaS5zdHVicygpLm1ldGhvZCgiZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMiKS53aWxsKHJldHVyblZhbHVlKGltcGxlbWV0aW5nV3MpKTsNCi0JCWFzc2VydFRydWUodXRpbC5pc091dHNpZGVJbldlYlNlcnZpY2Uoc2VpLnByb3h5KCkpKTsNCi0JCQ0KLQkJd3Muc3R1YnMoKS5tZXRob2QoImdldFdzZGxMb2NhdGlvbiIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UodXRpbC5pc091dHNpZGVJbldlYlNlcnZpY2Uoc2VpLnByb3h5KCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEZpbmRXc1Byb2plY3QoKQ0KLQl7DQotCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCUlXZWJNZXRob2QgbWV0aG9kID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYk1ldGhvZCgpOw0KLQkJc2VpLmdldFdlYk1ldGhvZHMoKS5hZGQobWV0aG9kKTsNCi0JCXdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuYWRkKHNlaSk7DQotCQkNCi0JCWFzc2VydEVxdWFscyh3c1Byb2plY3QsIHV0aWwuZmluZFdzUHJvamVjdChtZXRob2QpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FsY1VuaXF1ZUltcGwoKQ0KLQl7DQotCQlJV2ViTWV0aG9kIG1ldGhvZCA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJNZXRob2QoKTsNCi0JCW1ldGhvZC5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sICJtZXRob2QoSSkiKTsNCi0JCUlXZWJQYXJhbSBwYXJhbSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJQYXJhbSgpOw0KLQkJcGFyYW0uZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAiYSIpOw0KLQkJbWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQocGFyYW0pOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZChJKSIsIHV0aWwuY2FsY1VuaXF1ZUltcGwobWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZChJKVthXSIsIHV0aWwuY2FsY1VuaXF1ZUltcGwocGFyYW0pKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9FbmRwb2ludElzU2Vzc2lvbkJlYW5SdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vRW5kcG9pbnRJc1Nlc3Npb25CZWFuUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmI4Y2M5MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9FbmRwb2ludElzU2Vzc2lvbkJlYW5SdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3RzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOwotCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRJc1Nlc3Npb25CZWFuUnVsZVRlc3QgZXh0ZW5kcyBWYWxpZGF0aW9uVGVzdHNTZXRVcAotewotCXByaXZhdGUgVGVzdFByb2plY3QgZWpiUHJvamVjdDsKLQlwcml2YXRlIFRlc3RQcm9qZWN0IHdlYlByb2plY3Q7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVX05BTUUgPSAiTXlUZXN0Q2xhc3MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVV9QQUNLQUdFID0gInRlc3QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVV9DT05URU5UID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoInB1YmxpYyBjbGFzcyB7MH0gJ3sncHVibGljIHZvaWQgdGVzdCgpJ3snfX0iLCBDVV9OQU1FKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQlUZXN0UHJvamVjdHNVdGlscy5kZWxldGVXb3Jrc3BhY2VQcm9qZWN0cygpOwotCi0JCWVqYlByb2plY3QgPSBuZXcgVGVzdFByb2plY3QoVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlRWpiM1Byb2plY3QoIkVKQjMiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLmdldFByb2plY3QoKSk7Ci0JCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdChlamJQcm9qZWN0KTsKLQkJZWpiUHJvamVjdC5zZXRBcHRQcm9jZXNzaW5nRW5hYmxlZCh0cnVlLCBmYWxzZSk7Ci0KLQkJd2ViUHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdChUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVXZWIyNVByb2plY3QoIldlYjI1IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKS5nZXRQcm9qZWN0KCkpOwotCQljcmVhdGVDb21waWxhdGlvblVuaXQod2ViUHJvamVjdCk7Ci0JCXdlYlByb2plY3Quc2V0QXB0UHJvY2Vzc2luZ0VuYWJsZWQodHJ1ZSwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXN0UHJvamVjdFtdIGNyZWF0ZUZpeHR1cmVQcm9qZWN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQllamJQcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZUVqYjNQcm9qZWN0KCJFSkIzIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKS5nZXRQcm9qZWN0KCkpOwotCQljcmVhdGVDb21waWxhdGlvblVuaXQoZWpiUHJvamVjdCk7Ci0JCWVqYlByb2plY3Quc2V0QXB0UHJvY2Vzc2luZ0VuYWJsZWQodHJ1ZSwgZmFsc2UpOwotCi0JCXdlYlByb2plY3QgPSBuZXcgVGVzdFByb2plY3QoVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlV2ViMjVQcm9qZWN0KCJXZWIyNSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkuZ2V0UHJvamVjdCgpKTsKLQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0KHdlYlByb2plY3QpOwotCQl3ZWJQcm9qZWN0LnNldEFwdFByb2Nlc3NpbmdFbmFibGVkKHRydWUsIGZhbHNlKTsKLQotCQlyZXR1cm4gbmV3IFRlc3RQcm9qZWN0W10geyBlamJQcm9qZWN0LCB3ZWJQcm9qZWN0IH07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmaW5hbCBUZXN0UHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBwcm9qZWN0LmNyZWF0ZVBhY2thZ2UoQ1VfUEFDS0FHRSk7Ci0JCWZpbmFsIElUeXBlIGN1ID0gcHJvamVjdC5jcmVhdGVUeXBlKHBrZywgQ1VfTkFNRSArICIuamF2YSIsIENVX0NPTlRFTlQpOwotCQlyZWZyZXNoQW5kQnVpbGRQcm9qZWN0KHByb2plY3QpOwotCQlhc3NlcnROb1ZhbGlkYXRpb25FcnJvcnMoY3UuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hBbmRCdWlsZFByb2plY3QoZmluYWwgVGVzdFByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCXByb2plY3QuZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCXByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKHJ1bm5hYmxlKTsKLQl9Ci0KLQlwcml2YXRlIElUeXBlIGZpbmRUZXN0RW5kcG9pbnQoZmluYWwgVGVzdFByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQID0gcHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwotCQlmaW5hbCBJVHlwZSByZXN1bHQgPSBqYXZhUC5maW5kVHlwZShDVV9QQUNLQUdFICsgIi4iICsgQ1VfTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCB0ZXN0V3NBbm5vdGF0aW9uT25KYXZhQ2xhc3NJbkVqYlByb2plY3QoKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJVHlwZSBlbmRwb2ludFR5cGUgPSBmaW5kVGVzdEVuZHBvaW50KGVqYlByb2plY3QpOwotCi0JCWZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c2FubiA9IChJQW5ub3RhdGlvbjxJVHlwZT4pIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTiwgZW5kcG9pbnRUeXBlLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOwotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQod3Nhbm4sIGVuZHBvaW50VHlwZSk7Ci0JCXJlZnJlc2hBbmRCdWlsZFByb2plY3QoZWpiUHJvamVjdCk7Ci0JCWZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFya2Vyc0V4cGVjdGF0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQltYXJrZXJzRXhwZWN0YXRpb25zLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIDQ2KTsKLQkJbWFya2Vyc0V4cGVjdGF0aW9ucy5wdXQoSU1hcmtlci5DSEFSX0VORCwgNTYpOwotCQltYXJrZXJzRXhwZWN0YXRpb25zLnB1dChJTWFya2VyLkxJTkVfTlVNQkVSLCA1KTsKLQkJbWFya2Vyc0V4cGVjdGF0aW9ucy5wdXQoSU1hcmtlci5NRVNTQUdFLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX09OTFlfT05fU1RBVEVMRVNTX1NFU1NJT05fQkVBTlMpOwotCQl2YWxpZGF0ZVJlc291cmNlTWFya2VycyhlbmRwb2ludFR5cGUuZ2V0UmVzb3VyY2UoKSwgbmV3IE1hcmtlckRhdGEoZW5kcG9pbnRUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQsIG1hcmtlcnNFeHBlY3RhdGlvbnMpKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCB0ZXN0V3NBbm5vdGF0aW9uSW5FamJTdGF0ZWxlc3MoKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJVHlwZSBlbmRwb2ludFR5cGUgPSBmaW5kVGVzdEVuZHBvaW50KGVqYlByb2plY3QpOwotCQlmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gYmVhbkFubm90YXRpb24gPSAoSUFubm90YXRpb248SVR5cGU+KSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJqYXZheC5lamIuU3RhdGVsZXNzIiwgZW5kcG9pbnRUeXBlLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOwotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYmVhbkFubm90YXRpb24sIGVuZHBvaW50VHlwZSk7Ci0JCXJlZnJlc2hBbmRCdWlsZFByb2plY3QoZWpiUHJvamVjdCk7Ci0JCWFzc2VydE5vVmFsaWRhdGlvbkVycm9ycyhlbmRwb2ludFR5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgdGVzdFdzQW5ub3RhdGlvbkluV2ViKCkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVR5cGUgZW5kcG9pbnRUeXBlID0gZmluZFRlc3RFbmRwb2ludCh3ZWJQcm9qZWN0KTsKLQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gd3Nhbm4gPSAoSUFubm90YXRpb248SVR5cGU+KSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04sIGVuZHBvaW50VHlwZSwgbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKTsKLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KHdzYW5uLCBlbmRwb2ludFR5cGUpOwotCQlyZWZyZXNoQW5kQnVpbGRQcm9qZWN0KHdlYlByb2plY3QpOwotCQlhc3NlcnROb1ZhbGlkYXRpb25FcnJvcnMoZW5kcG9pbnRUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRml4dHVyZVByb2plY3RzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWVqYlByb2plY3QuZGlzcG9zZSgpOwotCQl3ZWJQcm9qZWN0LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9TZWlWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vU2VpVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTIyYWUzZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9TZWlWYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi0vKioKLSAqIFRlc3RzIGZvciBTRUkgdmFsaWRhdGlvbiBjb25zdHJhaW50cyAKLSAqIAotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdgotICovCi1wdWJsaWMgY2xhc3MgU2VpVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBWYWxpZGF0aW9uVGVzdHNTZXRVcCAKLXsKLQlwcm90ZWN0ZWQgSVR5cGUgc2VpVHlwZTsKLQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJc2VpVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUodGVzdFBhY2ssICJTZWkuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkge30iKTsKLQkJdGVzdFByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcnZpY2VOYW1lSXNOQ05hbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsJCQotCQlhc3NlcnROb3ROdWxsKCJTRUkgbm90IGZvdW5kIiwgZmluZFNlaSgidGVzdC5TZWkiKSk7Ci0JCWFzc2VydE5vVmFsaWRhdGlvbkVycm9ycyhzZWlUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQpOwotCQkKLQkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiLS0tXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHt9Iik7Ci0JCQotCQlmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcmtlclByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCW1hcmtlclByb3BzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIDQxKTsKLQkJbWFya2VyUHJvcHMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIDQ2KTsKLQkJbWFya2VyUHJvcHMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIDIpOwotCQltYXJrZXJQcm9wcy5wdXQoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCW1hcmtlclByb3BzLnB1dChJTWFya2VyLk1FU1NBR0UsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpBWFdTQ29yZU1lc3NhZ2VzLklOVkFMSURfTkNOQU1FX0FUVFJJQlVURSwgIldlYlNlcnZpY2UiLCAibmFtZSIsICItLS0iKSk7Ci0JCWZpbmFsIE1hcmtlckRhdGEgbWFya2Vyc0RhdGEgPSBuZXcgTWFya2VyRGF0YShzZWlUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQsIG1hcmtlclByb3BzKTsKLQkJdmFsaWRhdGVSZXNvdXJjZU1hcmtlcnMoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBtYXJrZXJzRGF0YSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXROc0lzVmFsaWRVcmkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJYXNzZXJ0Tm90TnVsbCgiU0VJIG5vdCBmb3VuZCIsIGZpbmRTZWkoInRlc3QuU2VpIikpOwotCQlhc3NlcnROb1ZhbGlkYXRpb25FcnJvcnMoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lEKTsKLQkJCi0JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPVwiXl5eXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHt9Iik7Ci0KLQkJZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXJrZXJQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQltYXJrZXJQcm9wcy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCA1Mik7Ci0JCW1hcmtlclByb3BzLnB1dChJTWFya2VyLkNIQVJfRU5ELCA1Nyk7Ci0JCW1hcmtlclByb3BzLnB1dChJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJbWFya2VyUHJvcHMucHV0KElNYXJrZXIuTUVTU0FHRSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkFYV1NDb3JlTWVzc2FnZXMuVEFSR0VUX05BTUVTUEFDRV9VUklfU1lOVEFYX0VSUk9SLCAiMCIsICJeXl4iLCAiSWxsZWdhbCBjaGFyYWN0ZXIgaW4gcGF0aCIpKTsKLQkJZmluYWwgTWFya2VyRGF0YSBtYXJrZXJzRGF0YSA9IG5ldyBNYXJrZXJEYXRhKHNlaVR5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCwgbWFya2VyUHJvcHMpOwotCQl2YWxpZGF0ZVJlc291cmNlTWFya2VycyhzZWlUeXBlLmdldFJlc291cmNlKCksIG1hcmtlcnNEYXRhKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVkdW5kYW5kQXR0cmlidXRlc09uRXhwbGljaXRTZWkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiTmFtZVwiLCBwb3J0TmFtZT1cIlBvcnROYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHt9Iik7Ci0JCWFzc2VydE5vdE51bGwoIlNFSSBub3QgZm91bmQiLCBmaW5kU2VpKCJ0ZXN0LlNlaSIpKTsKLQkJCi0JCWZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFya2VyUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkJbWFya2VyUHJvcHMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgNTgpOwotCQltYXJrZXJQcm9wcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgNjgpOwotCQltYXJrZXJQcm9wcy5wdXQoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCW1hcmtlclByb3BzLnB1dChJTWFya2VyLk1FU1NBR0UsIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfUE9SVE5BTUVfU0VJKTsKLQkJZmluYWwgTWFya2VyRGF0YSBtYXJrZXJzRGF0YSA9IG5ldyBNYXJrZXJEYXRhKHNlaVR5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCwgbWFya2VyUHJvcHMpOwotCQl2YWxpZGF0ZVJlc291cmNlTWFya2VycyhzZWlUeXBlLmdldFJlc291cmNlKCksIG1hcmtlcnNEYXRhKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlZHVuZGFuZEF0dHJpYnV0ZXNPbkltcGxpY2l0U2VpKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUodGVzdFBhY2ssICJXcy5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiTmFtZVwiLCBwb3J0TmFtZT1cIlBvcnROYW1lXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOwkJCi0JCWFzc2VydE5vdE51bGwoIlNFSSBub3QgZm91bmQiLCBmaW5kU2VpKCJ0ZXN0LldzIikpOwotCQlhc3NlcnROb1ZhbGlkYXRpb25FcnJvcnMoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lEKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNlaUNsYXNzQ29ycmVjdEV4cGxpY2l0U2VpKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UgaW50ZXJmYWNlIFNlaSB7fSIpOwotCQlhc3NlcnROb3ROdWxsKCJTRUkgbm90IGZvdW5kIiwgZmluZFNlaSgidGVzdC5TZWkiKSk7Ci0JCQotCQlmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcmtlclByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCW1hcmtlclByb3BzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIDQ2KTsKLQkJbWFya2VyUHJvcHMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIDQ5KTsKLQkJbWFya2VyUHJvcHMucHV0KElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQltYXJrZXJQcm9wcy5wdXQoSU1hcmtlci5NRVNTQUdFLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTCk7Ci0JCWZpbmFsIE1hcmtlckRhdGEgbWFya2Vyc0RhdGEgPSBuZXcgTWFya2VyRGF0YShzZWlUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQsIG1hcmtlclByb3BzKTsKLQkJdmFsaWRhdGVSZXNvdXJjZU1hcmtlcnMoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBtYXJrZXJzRGF0YSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZWlDbGFzc0NvcnJlY3RJbXBsaWNpdFNlaSgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQl0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHRlc3RQYWNrLCAiV3MuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGNsYXNzIFdzIHt9Iik7CQkKLQkJYXNzZXJ0Tm90TnVsbCgiU0VJIG5vdCBmb3VuZCIsIGZpbmRTZWkoInRlc3QuU2VpIikpOwotCQlhc3NlcnROb1ZhbGlkYXRpb25FcnJvcnMoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lEKTsKLQl9Ci19Ci0JCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9WYWxpZGF0aW9uVGVzdHNTZXRVcC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vVmFsaWRhdGlvblRlc3RzU2V0VXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDRmMGYwZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9WYWxpZGF0aW9uVGVzdHNTZXRVcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5pbnRlcm5hbC5BcHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3RzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5GaWxlVXRpbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblRlc3RzU2V0VXAgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UKLXsKLQkvKioKLQkgKiBUaGUgQVBUIG5vbnJlY29uY2lsZSBtYXJrZXIgSUQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lEID0gQXB0UGx1Z2luLkFQVF9OT05SRUNPTkNJTEVfQ09NUElMQVRJT05fUFJPQkxFTV9NQVJLRVI7Ci0JCi0JcHJvdGVjdGVkIFRlc3RQcm9qZWN0IHRlc3RQcm9qZWN0OwotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHRhcmdldDsKLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCB0ZXN0UGFjazsKLQlwcm90ZWN0ZWQgRG9tVXRpbCB1dGlsID0gRG9tVXRpbC5JTlNUQU5DRTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIFRlc3RQcm9qZWN0W10gZml4dHVyZVByb2plY3RzID0gY3JlYXRlRml4dHVyZVByb2plY3RzKCk7Ci0JCQotCQlJSmF2YU1vZGVsIGphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJdGFyZ2V0ID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmVQcm9qZWN0KElKYXZhUHJvamVjdCBwcmopCi0JCQl7Ci0JCQkJZm9yIChUZXN0UHJvamVjdCB0cCA6IGZpeHR1cmVQcm9qZWN0cykKLQkJCQl7Ci0JCQkJCWlmIChwcmouZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModHAuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKSkKLQkJCQkJewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXRhcmdldC5sb2FkKG51bGwpOwotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXN0UHJvamVjdFtdIGNyZWF0ZUZpeHR1cmVQcm9qZWN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQl0ZXN0UHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdChUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVXZWIyNVByb2plY3QoIlZhbGlkYXRpb25UZXN0IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7Ci0JCXRlc3RQYWNrID0gdGVzdFByb2plY3QuY3JlYXRlUGFja2FnZSgidGVzdCIpOwotCQl0ZXN0UHJvamVjdC5zZXRBcHRQcm9jZXNzaW5nRW5hYmxlZCh0cnVlLCBmYWxzZSk7Ci0JCXRlc3RQcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQpOwotCQkKLQkJcmV0dXJuIG5ldyBUZXN0UHJvamVjdFtde3Rlc3RQcm9qZWN0fTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCXRyeSB7Ci0JCQlkaXNwb3NlRml4dHVyZVByb2plY3RzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBfKSB7fQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRml4dHVyZVByb2plY3RzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRlc3RQcm9qZWN0LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2UgZmluZFdzKFN0cmluZyB3c0ZRTmFtZSkKLQl7Ci0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSB1dGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCXJldHVybiB1dGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcm9qZWN0LCB3c0ZRTmFtZSk7CQkJCi0JfQotCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZmluZFNlaShTdHJpbmcgc2VpRlFOYW1lKSAKLQl7Ci0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSB1dGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCXJldHVybiB1dGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJvamVjdCwgc2VpRlFOYW1lKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb250ZW50cyhmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1LCBmaW5hbCBTdHJpbmcgY29udGVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgc2V0Q29udGVudHNSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gInBhY2thZ2UgIiArIHRlc3RQYWNrLmdldEVsZW1lbnROYW1lKCkgKyAiO1xuIiArIGNvbnRlbnRzOwotCQkJCUZpbGVVdGlscy5nZXRJbnN0YW5jZSgpLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoY3UsIG5ld0NvbnRlbnQsIGZhbHNlLCBtb25pdG9yKTsKLQkJCQljdS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUoc2V0Q29udGVudHNSdW5uYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHdoZXRoZXIgdGhlIHJlc291cmNlIHNwZWNpZmllZCBoYXMgbWFya2VycyB3aXRoIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWF0aW9ucwotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHRvIHZhbGlkYXRlCi0JICogQHBhcmFtIG1hcmtlcnNFeHBlY3RhdGlvbnMKLQkgKiAgICAgICAgICAgIGV4cGVjdGF0aW9ucyBmb3IgcmVzb3VyY2UgbWFya2VycwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVzb3VyY2VNYXJrZXJzKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgTWFya2VyRGF0YS4uLiBtYXJrZXJzRXhwZWN0YXRpb25zKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdmFsaWRhdGVNYXJrZXJDb3VudChyZXNvdXJjZSwgbWFya2Vyc0V4cGVjdGF0aW9ucyk7Ci0JCWZvciAoTWFya2VyRGF0YSBtRGF0YSA6IG1hcmtlcnNFeHBlY3RhdGlvbnMpCi0JCXsKLQkJCXZhbGlkYXRlU2luZ2xlUmVzb3VyY2VNYXJrZXIocmVzb3VyY2UsIG1EYXRhKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVNYXJrZXJDb3VudChmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIE1hcmtlckRhdGEuLi4gbWFya2Vyc0V4cGVjdGF0aW9ucykgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IG1hcmtlcnNDb3VudCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLQkJZm9yKE1hcmtlckRhdGEgbWQgOiBtYXJrZXJzRXhwZWN0YXRpb25zKQotCQl7Ci0JCQlpZihtYXJrZXJzQ291bnQuZ2V0KG1kLm1hcmtlclR5cGUpID09IG51bGwpCi0JCQl7Ci0JCQkJbWFya2Vyc0NvdW50LnB1dChtZC5tYXJrZXJUeXBlLCAwKTsKLQkJCX0KLQkJCW1hcmtlcnNDb3VudC5wdXQobWQubWFya2VyVHlwZSwgbWFya2Vyc0NvdW50LmdldChtZC5tYXJrZXJUeXBlKSArMSk7Ci0JCX0KLQkJCi0JCWZvcihNYXJrZXJEYXRhIG1kIDogbWFya2Vyc0V4cGVjdGF0aW9ucykKLQkJewotCQkJZmluYWwgSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhtZC5tYXJrZXJUeXBlLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJZmluYWwgaW50IG1hcmtlcnNGb3VuZCA9IG1hcmtlcnMgPT0gbnVsbCA/IDAgOiBtYXJrZXJzLmxlbmd0aDsKLQkJCWFzc2VydEVxdWFscyhNZXNzYWdlRm9ybWF0LmZvcm1hdCgiVW5leHBlY3RlZCBjb3VudCBvZiBtYXJrZXJzIG9mIHR5cGUgezB9IiwgbWQubWFya2VyVHlwZSksIG1hcmtlcnNDb3VudC5nZXQobWQubWFya2VyVHlwZSksIG5ldyBJbnRlZ2VyKG1hcmtlcnNGb3VuZCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU2luZ2xlUmVzb3VyY2VNYXJrZXIoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBNYXJrZXJEYXRhIG1hcmtlckV4cGVjdGF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhtYXJrZXJFeHBlY3RhdGlvbi5tYXJrZXJUeXBlLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQlhc3NlcnRUcnVlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJObyBtYXJrZXJzIHdpdGggdHlwZSB7MH0gZm91bmQgaW4gcmVzb3VyY2UgezF9IiwgbWFya2VyRXhwZWN0YXRpb24ubWFya2VyVHlwZSwgcmVzb3VyY2UuZ2V0TmFtZSgpKSwgbWFya2Vycy5sZW5ndGggPiAwKTsKLQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoSU1hcmtlciBtIDogbWFya2VycykKLQkJewotCQkJZm91bmQgPSBmb3VuZCB8fCBtYXJrZXJIYXNBdHRyaWJ1dGVzKG0sIG1hcmtlckV4cGVjdGF0aW9uLm1hcmtlckF0dHJpYnV0ZXMpOwotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgbWFya2VyIHdpdGggYXR0cmlidXRlcyBzcGVjaWZpZWQ6ICIgKyBtYXJrZXJFeHBlY3RhdGlvbi5tYXJrZXJBdHRyaWJ1dGVzLCBmb3VuZCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG1hcmtlckhhc0F0dHJpYnV0ZXMoZmluYWwgSU1hcmtlciBtYXJrZXIsIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlcykgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChtYXJrZXIuZ2V0QXR0cmlidXRlcygpID09IG51bGwgfHwgbWFya2VyLmdldEF0dHJpYnV0ZXMoKS5pc0VtcHR5KCkpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoU3RyaW5nIGF0dHJpYnV0ZU5hbWUgOiBhdHRyaWJ1dGVzLmtleVNldCgpKQotCQl7Ci0JCQlmaW5hbCBPYmplY3QgbWFya2VyQXR0cmlidXRlID0gZ2V0TWFya2VyQXR0cmlidXRlKG1hcmtlciwgYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAobWFya2VyQXR0cmlidXRlID09IG51bGwpCi0JCQl7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoYXR0cmlidXRlcy5nZXQoYXR0cmlidXRlTmFtZSkuZXF1YWxzKG1hcmtlckF0dHJpYnV0ZSkpCi0JCQl7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldE1hcmtlckF0dHJpYnV0ZShmaW5hbCBJTWFya2VyIG1hcmtlciwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0JewotCQl0cnkKLQkJewotCQkJcmV0dXJuIG1hcmtlci5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnROb1ZhbGlkYXRpb25FcnJvcnMoZmluYWwgSVJlc291cmNlIHZhbGlkYXRlZFJlc291cmNlLCBmaW5hbCBTdHJpbmcgbWFya2VyVHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElNYXJrZXJbXSBmb3VuZE1hcmtlcnMgPSB2YWxpZGF0ZWRSZXNvdXJjZS5maW5kTWFya2VycyhtYXJrZXJUeXBlLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQlmaW5hbCBpbnQgbWFya2Vyc0NvdW50ID0gKGZvdW5kTWFya2VycyA9PSBudWxsID8gMCA6IGZvdW5kTWFya2Vycy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIk1hcmtlcnMgdW5leHBlY3RlZGx5IGZvdW5kIiwgMCwgbWFya2Vyc0NvdW50KTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRhZGF0YSBmb3IgbWFya2VycyAoaW5zdGFuY2VzIG9mIHtAbGluayBJTWFya2VyfSBvbiByZXNvdXJjZXMKLQkgKiAKLQkgKiBAYXV0aG9yIEkwMzA3MjAKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgTWFya2VyRGF0YQotCXsKLQkJcHJvdGVjdGVkIGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZTsKLQkJcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFya2VyQXR0cmlidXRlczsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBtYXJrZXJUeXBlOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvcgotCQkgKiAKLQkJICogQHBhcmFtIHJlc291cmNlCi0JCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHRoZSBtYXJrZXIgYmVsb25ncyB0bwotCQkgKiBAcGFyYW0gbWFya2VyVHlwZQotCQkgKiAgICAgICAgICAgIHRoZSBtYXJrZXIgdHlwZQotCQkgKiBAcGFyYW0gbWFya2Vyc0F0dHJpYnV0ZXMKLQkJICogICAgICAgICAgICBhIHByb3BlcnRpZXMgbWFwIGNvbnRhaW5pbmcgbWFya2VyIGF0dHJpYnV0ZXMgbmFtZXMgYXMga2V5cyBhbmQgZXhwZWN0ZWQgYXR0cmlidXRlIHZhbHVlcwotCQkgKiBAc2VlIElNYXJrZXIjZ2V0QXR0cmlidXRlKFN0cmluZykKLQkJICovCi0JCXB1YmxpYyBNYXJrZXJEYXRhKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIG1hcmtlclR5cGUsIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFya2VyQXR0cmlidXRlcykKLQkJewotCQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCQkJdGhpcy5tYXJrZXJBdHRyaWJ1dGVzID0gbWFya2VyQXR0cmlidXRlczsKLQkJCXRoaXMubWFya2VyVHlwZSA9IG1hcmtlclR5cGU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9XbVZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9XbVZhbGlkYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5ZTVlYTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vV21WYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdtVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBWYWxpZGF0aW9uVGVzdHNTZXRVcAotewotCXByaXZhdGUgSVR5cGUgc2VpVHlwZTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXNlaVR5cGUgPSB0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHRlc3RQYWNrLCAiU2VpLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWlOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHtcbiIgKwotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwidGVzdFwiKSBwdWJsaWMgdm9pZCB0ZXN0KCk7IiArCi0JCQkJIn0iKTsKLQkJdGVzdFByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lSXNOQ05hbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXJrZXJzLmxlbmd0aCk7Ci0JCQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7XG4iICsKLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIi0tLVwiKSBwdWJsaWMgdm9pZCB0ZXN0KCk7IFxuIiArICJ9Iik7Ci0JCQotCQlhc3NlcnROb3ROdWxsKCJTRUkgbm90IGZvdW5kIiwgZmluZFNlaSgidGVzdC5TZWkiKSk7Ci0JCQotCQlmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcmtlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkJbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCAxMTApOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCAxMTUpOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkxJTkVfTlVNQkVSLCAzKTsKLQkJbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTUVTU0FHRSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkFYV1NDb3JlTWVzc2FnZXMuSU5WQUxJRF9OQ05BTUVfQVRUUklCVVRFLCAiV2ViTWV0aG9kIiwgIm9wZXJhdGlvbk5hbWUiLCAiLS0tIikpOwotCQlmaW5hbCBNYXJrZXJEYXRhIG1hcmtlckRhdGEgPSAgbmV3IE1hcmtlckRhdGEoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lELCBtYXJrZXJBdHRyaWJ1dGVzKTsKLQkJdmFsaWRhdGVSZXNvdXJjZU1hcmtlcnMoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBtYXJrZXJEYXRhKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5hbWVJc1VuaXF1ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7XG4iICsKLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIk9wTmFtZVwiKSBwdWJsaWMgdm9pZCBmaXJzdCgpOyBcbiIgKwotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwiT3BOYW1lXCIpIHB1YmxpYyB2b2lkIHNlY29uZCgpOyBcbiIgKyAKLQkJCQkifSIpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCgiU0VJIG5vdCBmb3VuZCIsIGZpbmRTZWkoInRlc3QuU2VpIikpOwotCQkKLQkJZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXJrZXIxX0F0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkJbWFya2VyMV9BdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIDEzMik7Ci0JCW1hcmtlcjFfQXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgMTM3KTsKLQkJbWFya2VyMV9BdHRyaWJ1dGVzLnB1dChJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJbWFya2VyMV9BdHRyaWJ1dGVzLnB1dChJTWFya2VyLk1FU1NBR0UsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpBWFdTQ29yZU1lc3NhZ2VzLk9QRVJBVElPTl9OQU1FU19NVVNUX0JFX1VOSVFVRV9FUlJPUiwgIntodHRwOi8vdGVzdC99T3BOYW1lIikpOwotCQlmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcmtlcjJfQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQltYXJrZXIyX0F0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgMTk5KTsKLQkJbWFya2VyMl9BdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCAyMDUpOwotCQltYXJrZXIyX0F0dHJpYnV0ZXMucHV0KElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQltYXJrZXIyX0F0dHJpYnV0ZXMucHV0KElNYXJrZXIuTUVTU0FHRSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkFYV1NDb3JlTWVzc2FnZXMuT1BFUkFUSU9OX05BTUVTX01VU1RfQkVfVU5JUVVFX0VSUk9SLCAie2h0dHA6Ly90ZXN0L31PcE5hbWUiKSk7Ci0JCWZpbmFsIE1hcmtlckRhdGEgbWFya2VyMV9EYXRhID0gIG5ldyBNYXJrZXJEYXRhKHNlaVR5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCwgbWFya2VyMV9BdHRyaWJ1dGVzKTsKLQkJZmluYWwgTWFya2VyRGF0YSBtYXJrZXIyX0RhdGEgPSAgbmV3IE1hcmtlckRhdGEoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lELCBtYXJrZXIyX0F0dHJpYnV0ZXMpOwotCQl2YWxpZGF0ZVJlc291cmNlTWFya2VycyhzZWlUeXBlLmdldFJlc291cmNlKCksIG1hcmtlcjFfRGF0YSwgbWFya2VyMl9EYXRhKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5hbWVJc1VuaXF1ZUV4Y2x1ZGVkTWV0aG9kKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7CQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWlOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHtcbiIgKwotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIGZpcnN0KCk7IFxuIiArCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJmaXJzdFwiKSBwdWJsaWMgdm9pZCBzZWNvbmQoKTsgXG4iICsgCi0JCQkJIn0iKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoIlNFSSBub3QgZm91bmQiLCBmaW5kU2VpKCJ0ZXN0LlNlaSIpKTsKLQkJCi0JCWZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFya2VyQXR0cmlidXRlc18xID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCW1hcmtlckF0dHJpYnV0ZXNfMS5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCAxMjIpOwotCQltYXJrZXJBdHRyaWJ1dGVzXzEucHV0KElNYXJrZXIuQ0hBUl9FTkQsIDEyNyk7Ci0JCW1hcmtlckF0dHJpYnV0ZXNfMS5wdXQoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCW1hcmtlckF0dHJpYnV0ZXNfMS5wdXQoSU1hcmtlci5NRVNTQUdFLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChKQVhXU0NvcmVNZXNzYWdlcy5PUEVSQVRJT05fTkFNRVNfTVVTVF9CRV9VTklRVUVfRVJST1IsICJ7aHR0cDovL3Rlc3QvfWZpcnN0IikpOwotCi0JCWZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFya2VyQXR0cmlidXRlc18yID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCW1hcmtlckF0dHJpYnV0ZXNfMi5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCAxMDQpOwotCQltYXJrZXJBdHRyaWJ1dGVzXzIucHV0KElNYXJrZXIuQ0hBUl9FTkQsIDEwOCk7Ci0JCW1hcmtlckF0dHJpYnV0ZXNfMi5wdXQoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCW1hcmtlckF0dHJpYnV0ZXNfMi5wdXQoSU1hcmtlci5NRVNTQUdFLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfRVhDTFVERV9OT1RfQUxMT1dFRF9PTl9TRUkpOwotCQkKLQkJZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXJrZXJBdHRyaWJ1dGVzXzMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkJbWFya2VyQXR0cmlidXRlc18zLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIDE4OCk7Ci0JCW1hcmtlckF0dHJpYnV0ZXNfMy5wdXQoSU1hcmtlci5DSEFSX0VORCwgMTk0KTsKLQkJbWFya2VyQXR0cmlidXRlc18zLnB1dChJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJbWFya2VyQXR0cmlidXRlc18zLnB1dChJTWFya2VyLk1FU1NBR0UsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpBWFdTQ29yZU1lc3NhZ2VzLk9QRVJBVElPTl9OQU1FU19NVVNUX0JFX1VOSVFVRV9FUlJPUiwgIntodHRwOi8vdGVzdC99Zmlyc3QiKSk7Ci0JCQotCQlmaW5hbCBNYXJrZXJEYXRhIG1hcmtlckRhdGFfMSA9ICBuZXcgTWFya2VyRGF0YShzZWlUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQsIG1hcmtlckF0dHJpYnV0ZXNfMSk7Ci0JCWZpbmFsIE1hcmtlckRhdGEgbWFya2VyRGF0YV8yID0gIG5ldyBNYXJrZXJEYXRhKHNlaVR5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCwgbWFya2VyQXR0cmlidXRlc18yKTsKLQkJZmluYWwgTWFya2VyRGF0YSBtYXJrZXJEYXRhXzMgPSAgbmV3IE1hcmtlckRhdGEoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lELCBtYXJrZXJBdHRyaWJ1dGVzXzMpOwotCQl2YWxpZGF0ZVJlc291cmNlTWFya2VycyhzZWlUeXBlLmdldFJlc291cmNlKCksIG1hcmtlckRhdGFfMSwgbWFya2VyRGF0YV8yLCBtYXJrZXJEYXRhXzMpOwotCX0KLQotCS8qKiAKLQkgKiB0aGlzIHRlc3QgY3VycmVudGx5IGRvZXMgbm90aGluZyBiZWNhdXNlIGV4Y2x1ZGVkIG1ldGhvZHMgYXJlIG5vdCBjb250YWluZWQgaW4gCi0JICogdGhlIG1vZGVsLiAKLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8gCi0JcHVibGljIHZvaWQgdGVzdFJlZHVuZGFudEF0dHJpYnV0ZXNGb3JFeGNsdWRlZE1ldGhvZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotLy8JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGNsYXNzIFNlaSB7XG4iICsKLS8vCQkJCSJAamF2YXguandzLldlYk1ldGhvZChleGNsdWRlPXRydWUsIG9wZXJhdGlvbk5hbWU9XCJPcE5hbWVcIikgcHVibGljIHZvaWQgZmlyc3QoKTsgXG4iICsKLS8vCQkJCSJ9Iik7Ci0vLwkJCi0vLwkJc2VpID0gZmluZFNlaSgidGVzdC5TZWkiKTsKLS8vCQlJV2ViU2VydmljZSB3cyA9IGZpbmRXcygidGVzdC5TZWkiKTsKLS8vCQkKLS8vCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsKLS8vCQlJTWFya2VyIFtdIG1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZENhbm5vdEJlRXhjbHVkZWRJblNFSSgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewkJCi0JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkge1xuIiArCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKGV4Y2x1ZGU9dHJ1ZSkgcHVibGljIHZvaWQgZmlyc3QoKTsgXG4iICsKLQkJCQkifSIpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCgiU0VJIG5vdCBmb3VuZCIsIGZpbmRTZWkoInRlc3QuU2VpIikpOwotCQkKLQkJZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXJrZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgMTA0KTsKLQkJbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgMTA4KTsKLQkJbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTUVTU0FHRSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX0VYQ0xVREVfTk9UX0FMTE9XRURfT05fU0VJKTsKLQkJZmluYWwgTWFya2VyRGF0YSBtYXJrZXJEYXRhID0gIG5ldyBNYXJrZXJEYXRhKHNlaVR5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCwgbWFya2VyQXR0cmlidXRlcyk7Ci0JCXZhbGlkYXRlUmVzb3VyY2VNYXJrZXJzKHNlaVR5cGUuZ2V0UmVzb3VyY2UoKSwgbWFya2VyRGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vV3BWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vV3BWYWxpZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Nzg3YmNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1dwVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotCi0vLyBUaGUgdGVzdCBoYXMgYmVlbiBleGNsdWRlZCBmcm9tIHRoZSB0ZXN0IHN1aXRlLiBJbmNsdWRlIGl0IGFnYWluIHdoZW4gZml4ZWQKLS8vIEZJWE1FOiBCdWcgMzA1NzcyCi1wdWJsaWMgY2xhc3MgV3BWYWxpZGF0aW9uVGVzdCBleHRlbmRzIFZhbGlkYXRpb25UZXN0c1NldFVwCi17Ci0gICAgcHJvdGVjdGVkIElUeXBlIHNlaVR5cGU7Ci0gICAgLy9wcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHNlaVR5cGUgPSB0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHRlc3RQYWNrLCAiU2VpLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWlOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHt9Iik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBmaW5kIFNFSSIsIGZpbmRTZWkoc2VpVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpOwotICAgICAgICB0ZXN0UHJvamVjdC5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxEKTsKLSAgICB9Ci0KLSAgICAvLyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUlzTkNOYW1lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAvLyAgICB7Ci0gICAgLy8gICAgICAgIHNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkgeyIgKwotICAgIC8vICAgICAgICAgICAgICAgICJwdWJsaWMgdm9pZCB0ZXN0KEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cIi0tLVwiKWludCBhKTsgXG4iICsKLSAgICAvLyAgICAgICAgIn0iKTsKLSAgICAvLwotICAgIC8vICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcmtlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAvLyAgICAgICAgbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCAxMTYpOwotICAgIC8vICAgICAgICBtYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCAxMjEpOwotICAgIC8vICAgICAgICBtYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkxJTkVfTlVNQkVSLCAyKTsKLSAgICAvLyAgICAgICAgbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0gICAgLy8gICAgICAgIGZpbmFsIE1hcmtlckRhdGEgbWFya2VyRGF0YSA9ICBuZXcgTWFya2VyRGF0YShzZWlUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQsIG1hcmtlckF0dHJpYnV0ZXMpOwotICAgIC8vICAgICAgICB2YWxpZGF0ZVJlc291cmNlTWFya2VycyhzZWlUeXBlLmdldFJlc291cmNlKCksIG1hcmtlckRhdGEpOwotICAgIC8vICAgIH0KLQotICAgIC8vICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0TmFtZUlzTkNOYW1lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAvLyAgICB7Ci0gICAgLy8gICAgICAgIHNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJpbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7XG4iICsKLSAgICAvLyAgICAgICAgICAgICAgICAiQFNPQVBCaW5kaW5nKHN0eWxlPVNPQVBCaW5kaW5nLlN0eWxlLlJQQykiICsKLSAgICAvLyAgICAgICAgICAgICAgICAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHsiICsKLSAgICAvLyAgICAgICAgICAgICAgICAicHVibGljIHZvaWQgdGVzdChAamF2YXguandzLldlYlBhcmFtKHBhcnROYW1lPVwiLS0tXCIpaW50IGEpOyBcbiIgKwotICAgIC8vICAgICAgICAifSIpOwotICAgIC8vCi0gICAgLy8gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFya2VyQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgIC8vICAgICAgICBtYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIDE4MCk7Ci0gICAgLy8gICAgICAgIG1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIDE4NSk7Ci0gICAgLy8gICAgICAgIG1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgIC8vICAgICAgICBmaW5hbCBNYXJrZXJEYXRhIG1hcmtlckRhdGEgPSAgbmV3IE1hcmtlckRhdGEoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lELCBtYXJrZXJBdHRyaWJ1dGVzKTsKLSAgICAvLyAgICAgICAgdmFsaWRhdGVSZXNvdXJjZU1hcmtlcnMoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBtYXJrZXJEYXRhKTsKLSAgICAvLyAgICB9Ci0KLSAgICAvLyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUlzVW5pcWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgIC8vICAgIHsKLSAgICAvLyAgICAgICAgc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7IiArCi0gICAgLy8gICAgICAgICAgICAgICAgInB1YmxpYyB2b2lkIHRlc3QoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW0xXCIpaW50IGEsIEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtMVwiKWludCBiKTsgXG4iICsKLSAgICAvLyAgICAgICAgIn0iKTsKLSAgICAvLwotICAgIC8vICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcmtlcjFfQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgIC8vICAgICAgICBtYXJrZXIxX0F0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgMTE2KTsKLSAgICAvLyAgICAgICAgbWFya2VyMV9BdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCAxMjQpOwotICAgIC8vICAgICAgICBtYXJrZXIxX0F0dHJpYnV0ZXMucHV0KElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgIC8vICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcmtlcjJfQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgIC8vICAgICAgICBtYXJrZXIyX0F0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgMTU3KTsKLSAgICAvLyAgICAgICAgbWFya2VyMl9BdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCAxNjUpOwotICAgIC8vICAgICAgICBtYXJrZXIyX0F0dHJpYnV0ZXMucHV0KElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgIC8vCi0gICAgLy8gICAgICAgIGZpbmFsIE1hcmtlckRhdGEgbWFya2VyMV9EYXRhID0gIG5ldyBNYXJrZXJEYXRhKHNlaVR5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCwgbWFya2VyMV9BdHRyaWJ1dGVzKTsKLSAgICAvLyAgICAgICAgZmluYWwgTWFya2VyRGF0YSBtYXJrZXIyX0RhdGEgPSAgbmV3IE1hcmtlckRhdGEoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lELCBtYXJrZXIyX0F0dHJpYnV0ZXMpOwotICAgIC8vICAgICAgICB2YWxpZGF0ZVJlc291cmNlTWFya2VycyhzZWlUeXBlLmdldFJlc291cmNlKCksIG1hcmtlcjJfRGF0YSwgbWFya2VyMV9EYXRhKTsKLSAgICAvLyAgICB9Ci0KLSAgICAvLwlwdWJsaWMgdm9pZCB0ZXN0TmFtZU5vdFJlZHVuZGFudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgLy8JewotICAgIC8vCQkvLyBpbiBSUEMgc3R5bGUgaWYgcGFydE5hbWUgaXMgbm90IHByZXNlbnQgdGhlIG5hbWUgaXMgbm90IHJlZHVuZGFudAotICAgIC8vCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nO1xuIiArCi0gICAgLy8JCQkJIkBTT0FQQmluZGluZyhzdHlsZT1TT0FQQmluZGluZy5TdHlsZS5SUEMpIiArCi0gICAgLy8JCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7IiArCi0gICAgLy8JCQkJInB1YmxpYyB2b2lkIHRlc3QoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwibXlOYW1lXCIpaW50IGEpOyBcbiIgKwotICAgIC8vCQkJCSJ9Iik7Ci0gICAgLy8JCWFzc2VydE5vVmFsaWRhdGlvbkVycm9ycyhzZWlUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQpOwotICAgIC8vCX0KLQotICAgIC8vICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lUmVkdW5kYW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAvLyAgICB7Ci0gICAgLy8gICAgICAgIC8vIGluIFJQQyBzdHlsZSBpZiBwYXJ0TmFtZSBpcyBwcmVzZW50IHRoZSBuYW1lIGlzIHJlZHVuZGFudAotICAgIC8vICAgICAgICBzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nO1xuIiArCi0gICAgLy8gICAgICAgICAgICAgICAgIkBTT0FQQmluZGluZyhzdHlsZT1TT0FQQmluZGluZy5TdHlsZS5SUEMpIiArCi0gICAgLy8gICAgICAgICAgICAgICAgIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7IiArCi0gICAgLy8gICAgICAgICAgICAgICAgInB1YmxpYyB2b2lkIHRlc3QoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwibXlOYW1lXCIsIHBhcnROYW1lPVwibXlQYXJ0XCIpaW50IGEpOyBcbiIgKwotICAgIC8vICAgICAgICAifSIpOwotICAgIC8vCi0gICAgLy8gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFya2VyQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgIC8vICAgICAgICBtYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIDE3Nik7Ci0gICAgLy8gICAgICAgIG1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIDE4NCk7Ci0gICAgLy8gICAgICAgIG1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyk7Ci0gICAgLy8gICAgICAgIGZpbmFsIE1hcmtlckRhdGEgbWFya2VyRGF0YSA9ICBuZXcgTWFya2VyRGF0YShzZWlUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQsIG1hcmtlckF0dHJpYnV0ZXMpOwotICAgIC8vICAgICAgICB2YWxpZGF0ZVJlc291cmNlTWFya2VycyhzZWlUeXBlLmdldFJlc291cmNlKCksIG1hcmtlckRhdGEpOwotICAgIC8vICAgIH0KLQotICAgIC8vCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXROc1ZhbGlkVXJpKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAvLwl7Ci0gICAgLy8JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkgeyIgKwotICAgIC8vCQkJCSJwdWJsaWMgdm9pZCB0ZXN0KEBqYXZheC5qd3MuV2ViUGFyYW0odGFyZ2V0TmFtZXNwYWNlPVwiXl5eXCIpaW50IGEpOyBcbiIgKwotICAgIC8vCQkJCSJ9Iik7Ci0gICAgLy8KLSAgICAvLwkJZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXJrZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgLy8JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgMTI3KTsKLSAgICAvLwkJbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgMTMyKTsKLSAgICAvLwkJbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0gICAgLy8JCWZpbmFsIE1hcmtlckRhdGEgbWFya2VyRGF0YSA9ICBuZXcgTWFya2VyRGF0YShzZWlUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQsIG1hcmtlckF0dHJpYnV0ZXMpOwotICAgIC8vCQl2YWxpZGF0ZVJlc291cmNlTWFya2VycyhzZWlUeXBlLmdldFJlc291cmNlKCksIG1hcmtlckRhdGEpOwotICAgIC8vCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1dzVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1dzVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTY2NTA0My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9Xc1ZhbGlkYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgV3NWYWxpZGF0aW9uVGVzdCBleHRlbmRzIFZhbGlkYXRpb25UZXN0c1NldFVwIAotewotCXByaXZhdGUgSVR5cGUgd3NUeXBlOwotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJd3NUeXBlID0gdGVzdFByb2plY3QuY3JlYXRlVHlwZSh0ZXN0UGFjaywgIldzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV3NOYW1lXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOwotCQl0ZXN0UHJvamVjdC5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxEKTsKLQkJYXNzZXJ0Tm90TnVsbCgiV2ViIHNlcnZpY2Ugbm90IGZvdW5kIiwgZmluZFdzKCJ0ZXN0LldzIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZU5hbWVJc05DTmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlhc3NlcnROb1ZhbGlkYXRpb25FcnJvcnMod3NUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQpOwotCQkKLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiLS0tXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOwotCQkKLQkJZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXJrZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgNDgpOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCA1Myk7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIDIpOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJZmluYWwgTWFya2VyRGF0YSBtYXJrZXJEYXRhID0gIG5ldyBNYXJrZXJEYXRhKHdzVHlwZS5nZXRSZXNvdXJjZSgpLCBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lELCBtYXJrZXJBdHRyaWJ1dGVzKTsKLQkJdmFsaWRhdGVSZXNvdXJjZU1hcmtlcnMod3NUeXBlLmdldFJlc291cmNlKCksIG1hcmtlckRhdGEpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UG9ydE5hbWVJc05DTmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlhc3NlcnROb1ZhbGlkYXRpb25FcnJvcnMod3NUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQpOwotCQkKLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHBvcnROYW1lPVwiLS0tXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOwotCi0JCWZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFya2VyQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIDQ1KTsKLQkJbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgNTApOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJZmluYWwgTWFya2VyRGF0YSBtYXJrZXJEYXRhID0gIG5ldyBNYXJrZXJEYXRhKHdzVHlwZS5nZXRSZXNvdXJjZSgpLCBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lELCBtYXJrZXJBdHRyaWJ1dGVzKTsKLQkJdmFsaWRhdGVSZXNvdXJjZU1hcmtlcnMod3NUeXBlLmdldFJlc291cmNlKCksIG1hcmtlckRhdGEpOwotCX0JCQotCQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXROc0lzVXJpKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JewotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPVwiXl5eXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOwotCQkKLQkJZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXJrZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgNTIpOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCA1Nyk7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQlmaW5hbCBNYXJrZXJEYXRhIG1hcmtlckRhdGEgPSAgbmV3IE1hcmtlckRhdGEod3NUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQsIG1hcmtlckF0dHJpYnV0ZXMpOwotCQl2YWxpZGF0ZVJlc291cmNlTWFya2Vycyh3c1R5cGUuZ2V0UmVzb3VyY2UoKSwgbWFya2VyRGF0YSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNFSUV4aXN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIAotCXsKLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC5kZW1vLlRlc3RcIikgcHVibGljIGNsYXNzIFdzIHt9Iik7Ci0JCQotCQlmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcmtlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkJbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCA1NCk7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIDczKTsKLQkJbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCWZpbmFsIE1hcmtlckRhdGEgbWFya2VyRGF0YSA9ICBuZXcgTWFya2VyRGF0YSh3c1R5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCwgbWFya2VyQXR0cmlidXRlcyk7Ci0JCXZhbGlkYXRlUmVzb3VyY2VNYXJrZXJzKHdzVHlwZS5nZXRSZXNvdXJjZSgpLCBtYXJrZXJEYXRhKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZU1pc3NpbmdJZlNlaVJlZmVyZW5jZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQl7Ci0JCWZpbmFsIElUeXBlIHNlaSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUodGVzdFBhY2ssICJTZWkuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkge30iKTsKLQkJYXNzZXJ0Tm90TnVsbChzZWkpOwotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2U9XCJ0ZXN0LlNlaVwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsKLQkJYXNzZXJ0Tm9WYWxpZGF0aW9uRXJyb3JzKHdzVHlwZS5nZXRSZXNvdXJjZSgpLCBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lEKTsKLQkJCi0JCXNldENvbnRlbnRzKHdzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiVGVzdFwiLCBlbmRwb2ludEludGVyZmFjZT1cInRlc3QuU2VpXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOwotCQkKLQkJZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXJrZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgNDEpOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCA0Nyk7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQlmaW5hbCBNYXJrZXJEYXRhIG1hcmtlckRhdGEgPSAgbmV3IE1hcmtlckRhdGEod3NUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQsIG1hcmtlckF0dHJpYnV0ZXMpOwotCQl2YWxpZGF0ZVJlc291cmNlTWFya2Vycyh3c1R5cGUuZ2V0UmVzb3VyY2UoKSwgbWFya2VyRGF0YSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RXc2RsTG9jYXRpb25JblByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSUZpbGUgZmlsZSA9IHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGb2xkZXIoIldlYkNvbnRlbnQiKS5nZXRGaWxlKCJUZXN0LndzZGwiKTsKLQkJZmlsZS5jcmVhdGUobmV3IFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcigiIiksIHRydWUsIG51bGwpOwotCQkKLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJUZXN0XCIsIHdzZGxMb2NhdGlvbj1cIlRlc3Qud3NkbFwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsKLQkJdGVzdFByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCk7Ci0JCWFzc2VydE5vVmFsaWRhdGlvbkVycm9ycyh3c1R5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCk7Ci0JCQotCQkvLyB3cm9uZyBsb2NhdGlvbgotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlRlc3RcIiwgd3NkbExvY2F0aW9uPVwiVGVzdDEud3NkbFwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsKLQkJCi0JCWZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFya2VyQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIDYyKTsKLQkJbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgNzQpOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcpOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLk1FU1NBR0UsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9VTkFCTEVfVE9fTE9DQVRFLCAiVGVzdDEud3NkbCIpKTsKLQkJZmluYWwgTWFya2VyRGF0YSBtYXJrZXJEYXRhID0gIG5ldyBNYXJrZXJEYXRhKHdzVHlwZS5nZXRSZXNvdXJjZSgpLCBWQUxJREFUSU9OX1BST0JMRU1fTUFSS0VSX0lELCBtYXJrZXJBdHRyaWJ1dGVzKTsKLQkJdmFsaWRhdGVSZXNvdXJjZU1hcmtlcnMod3NUeXBlLmdldFJlc291cmNlKCksIG1hcmtlckRhdGEpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0V3NkbExvY2F0aW9uSW5XZWJJbmZDb3JyZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElGb2xkZXIgd2ViSW5mID0gdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigiV2ViQ29udGVudCIpLmdldEZvbGRlcigiV0VCLUlORiIpOwotCQlJRmlsZSBmaWxlID0gd2ViSW5mLmdldEZpbGUoIlRlc3Qud3NkbCIpOwotCQlmaWxlLmNyZWF0ZShuZXcgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKCIiKSwgdHJ1ZSwgbnVsbCk7Ci0JCQotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlRlc3RcIiwgd3NkbExvY2F0aW9uPVwiV0VCLUlORi9UZXN0LndzZGxcIikgcHVibGljIGNsYXNzIFdzIHt9Iik7Ci0JCWFzc2VydE5vVmFsaWRhdGlvbkVycm9ycyh3c1R5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RXc2RsTG9jYXRpb25FbXB0eSgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlRlc3RcIiwgd3NkbExvY2F0aW9uPVwiXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOwotCQkKLQkJZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXJrZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgNjIpOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfRU5ELCA2NCk7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLk1FU1NBR0UsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpBWFdTQ29yZU1lc3NhZ2VzLkVNUFRZX0FUVFJJQlVURV9WQUxVRSwgIldlYlNlcnZpY2UiLCAid3NkbExvY2F0aW9uIikpOwotCQlmaW5hbCBNYXJrZXJEYXRhIG1hcmtlckRhdGEgPSAgbmV3IE1hcmtlckRhdGEod3NUeXBlLmdldFJlc291cmNlKCksIFZBTElEQVRJT05fUFJPQkxFTV9NQVJLRVJfSUQsIG1hcmtlckF0dHJpYnV0ZXMpOwotCQl2YWxpZGF0ZVJlc291cmNlTWFya2Vycyh3c1R5cGUuZ2V0UmVzb3VyY2UoKSwgbWFya2VyRGF0YSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RXc2RsTG9jYXRpb25BYnNvbHV0ZVVybCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLQl7Ci0JCUlGaWxlIGZpbGUgPSB0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZSgiVGVzdC53c2RsIik7Ci0JCWZpbGUuY3JlYXRlKG5ldyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIoIiIpLCB0cnVlLCBudWxsKTsKLQkJZmluYWwgU3RyaW5nIGZpbGVVcmwgPSBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0KLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJUZXN0XCIsIHdzZGxMb2NhdGlvbj1cIiIgKyBmaWxlVXJsICsgIlwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsKLQkJdGVzdFByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCk7Ci0JCWFzc2VydE5vVmFsaWRhdGlvbkVycm9ycyh3c1R5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbmRwb2ludEltcGxlbWVudHNTZWkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQl7Ci0JCWZpbmFsIElUeXBlIHNlaVR5cGUgPSB0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHRlc3RQYWNrLCAiU2VpLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHsiICsgCi0JCQkJInB1YmxpYyB2b2lkIHRlc3QoKTsiICsgCi0JCQkJInB1YmxpYyBpbnQgc2Vjb25kKGludCBhLCBpbnQgYiwgU3RyaW5nIGMpOyIgKyAKLQkJCQkifSIpOyAKLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlPVwidGVzdC5TZWlcIikgcHVibGljIGNsYXNzIFdzIHsiICsgCi0JCQkJInB1YmxpYyB2b2lkIHRlc3QoKSB7fSIgKyAKLQkJCSJ9Iik7Ci0JCQotCQlmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcmtlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkJbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCA1NCk7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIDY0KTsKLQkJbWFya2VyQXR0cmlidXRlcy5wdXQoSU1hcmtlci5MSU5FX05VTUJFUiwgMik7Ci0JCW1hcmtlckF0dHJpYnV0ZXMucHV0KElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQltYXJrZXJBdHRyaWJ1dGVzLnB1dChJTWFya2VyLk1FU1NBR0UsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9NVVNUX0lNUExFTUVOVCwgIlNlaS5zZWNvbmQoaW50LCBpbnQsIFN0cmluZykiKSk7Ci0JCWZpbmFsIE1hcmtlckRhdGEgbWFya2VyRGF0YSA9ICBuZXcgTWFya2VyRGF0YSh3c1R5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCwgbWFya2VyQXR0cmlidXRlcyk7Ci0JCXZhbGlkYXRlUmVzb3VyY2VNYXJrZXJzKHdzVHlwZS5nZXRSZXNvdXJjZSgpLCBtYXJrZXJEYXRhKTsKLQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoInRlc3QuU2VpIik7Ci0JCWFzc2VydE5vdE51bGwoc2VpKTsKLQkJYXNzZXJ0Tm9WYWxpZGF0aW9uRXJyb3JzKHNlaVR5cGUuZ2V0UmVzb3VyY2UoKSwgVkFMSURBVElPTl9QUk9CTEVNX01BUktFUl9JRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDFhNDMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUzNDdkMWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDNjYmM1Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMA0KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMsDQotIG9yZy5qbW9jaywNCi0gb3JnLmp1bml0DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMuaW50ZXJuYWwNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjdhY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAyMCwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M4OGVmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNWVhYjJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQnVuZGxlLU5hbWUuMD1KQVgtV1MgRE9NIFVJIFRlc3RzDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTJiNGQ4Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0czsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMuaW50ZXJuYWwuQWxsRG9tSXRlbVByb3ZpZGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy5pbnRlcm5hbC5ET01JdGVtUHJvcGVydHlQcm92aWRlclRlc3Q7DQotDQotcHVibGljIGNsYXNzIEFsbFRlc3RzU3VpdGUNCi17DQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotCXsNCi0JCWZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0NCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbGxEb21JdGVtUHJvdmlkZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShET01JdGVtUHJvcGVydHlQcm92aWRlclRlc3QuY2xhc3MpOw0KLQkJDQotCQlyZXR1cm4gc3VpdGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS90ZXN0cy9pbnRlcm5hbC9BbGxEb21JdGVtUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL2ludGVybmFsL0FsbERvbUl0ZW1Qcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTYzOGNlYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL2ludGVybmFsL0FsbERvbUl0ZW1Qcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMuaW50ZXJuYWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUHJvcGVydHlWYWx1ZVdyYXBwZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlTdGF0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklXZWJNZXRob2RJdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSVdlYlBhcmFtSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5qbW9jay5Nb2NrOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxEb21JdGVtUHJvdmlkZXJUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBpdGVtUHJvdmlkZXI7IA0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0Jew0KLQkJaXRlbVByb3ZpZGVyID0gbmV3IERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpDQotCXsNCi0JCWl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RET01JdGVtUHJvdmlkZXIoKQ0KLQl7DQotCQlhc3NlcnROb3ROdWxsKGl0ZW1Qcm92aWRlci5nZXRSb290QWRhcHRlckZhY3RvcnkoKSk7DQotCQlpdGVtUHJvdmlkZXIuc2V0UGFyZW50QWRhcHRlckZhY3RvcnkobnVsbCk7DQotCQlhc3NlcnROb3ROdWxsKGl0ZW1Qcm92aWRlci5nZXRSb290QWRhcHRlckZhY3RvcnkoKSk7DQotCQlpdGVtUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobnVsbCk7DQotCQlhc3NlcnROb3ROdWxsKGl0ZW1Qcm92aWRlci5nZXRSb290QWRhcHRlckZhY3RvcnkoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyKCkNCi0Jew0KLQkJSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlciBqYXZhSXRlbVByb3ZpZGVyID0gKElKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlci5jcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50QWRhcHRlcigpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGphdmFJdGVtUHJvdmlkZXIpOw0KLQkJDQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wRGVzY3MgPSBqYXZhSXRlbVByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMobnVsbCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwocHJvcERlc2NzKTsNCi0JCWFzc2VydFRydWUocHJvcERlc2NzLnNpemUoKSA+IDApOw0KLQkJDQotCQlNb2NrIGphdmFXU0VsZW0gPSBtb2NrKElKYXZhV2ViU2VydmljZUVsZW1lbnQuY2xhc3MpOw0KLQkJamF2YVdTRWxlbS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiVGVzdE5hbWUiKSk7DQotCQlhc3NlcnROb3ROdWxsKGphdmFJdGVtUHJvdmlkZXIuZ2V0SW1hZ2UobmV3IE9iamVjdCgpKSk7DQotCQlhc3NlcnROb3ROdWxsKGphdmFJdGVtUHJvdmlkZXIuZ2V0VGV4dChqYXZhV1NFbGVtLnByb3h5KCkpKTsNCi0JCWFzc2VydE51bGwoamF2YUl0ZW1Qcm92aWRlci5nZXROYW1lQ2F0ZWdvcnkoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJU2VydmljZUVuZHBvaW50SXRlbVByb3ZpZGVyKCkNCi0Jew0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlciBzZWlJdGVtUHJvdmlkZXIgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VBZGFwdGVyKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoc2VpSXRlbVByb3ZpZGVyKTsNCi0JCQ0KLQkJTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcHJvcERlc2NzID0gc2VpSXRlbVByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMobnVsbCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwocHJvcERlc2NzKTsNCi0JCWFzc2VydFRydWUocHJvcERlc2NzLnNpemUoKSA+IDApOw0KLQkJDQotCQlNb2NrIHNFSUVsZW0gPSBtb2NrKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MpOw0KLQkJc0VJRWxlbS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiVGVzdE5hbWUiKSk7DQotCQlhc3NlcnROb3ROdWxsKHNlaUl0ZW1Qcm92aWRlci5nZXRJbWFnZShuZXcgT2JqZWN0KCkpKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpSXRlbVByb3ZpZGVyLmdldFRleHQoc0VJRWxlbS5wcm94eSgpKSk7DQotCQlhc3NlcnROb3ROdWxsKHNlaUl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG51bGwpKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpSXRlbVByb3ZpZGVyLmdldE5hbWVDYXRlZ29yeSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElXZWJNZXRob2RJdGVtUHJvdmlkZXIoKQ0KLQl7DQotCQlJV2ViTWV0aG9kSXRlbVByb3ZpZGVyIG1ldGhvZEl0ZW1Qcm92aWRlciA9IChJV2ViTWV0aG9kSXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIuY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RJdGVtUHJvdmlkZXIpOw0KLQkJDQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wRGVzY3MgPSBtZXRob2RJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wRGVzY3MpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wRGVzY3Muc2l6ZSgpID4gMCk7DQotCQkNCi0JCU1vY2sgd01FbGVtID0gbW9jayhJV2ViTWV0aG9kLmNsYXNzKTsNCi0JCXdNRWxlbS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiVGVzdE5hbWUiKSk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZEl0ZW1Qcm92aWRlci5nZXRJbWFnZShuZXcgT2JqZWN0KCkpKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kSXRlbVByb3ZpZGVyLmdldFRleHQod01FbGVtLnByb3h5KCkpKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuRmVhdHVyZXMobnVsbCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RJdGVtUHJvdmlkZXIuZ2V0TmFtZUNhdGVnb3J5KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SVdlYlNlcnZpY2VJdGVtUHJvdmlkZXIoKQ0KLQl7DQotCQlJV2ViU2VydmljZUl0ZW1Qcm92aWRlciB3c0l0ZW1Qcm92aWRlciA9IChJV2ViU2VydmljZUl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyLmNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdzSXRlbVByb3ZpZGVyKTsNCi0JCQ0KLQkJTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcHJvcERlc2NzID0gd3NJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wRGVzY3MpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wRGVzY3Muc2l6ZSgpID4gMCk7DQotCQkNCi0JCU1vY2sgd3NFbGVtID0gbW9jayhJV2ViU2VydmljZS5jbGFzcyk7DQotCQl3c0VsZW0uZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZ2V0TmFtZSIpLndpbGwocmV0dXJuVmFsdWUoIlRlc3ROYW1lIikpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c0l0ZW1Qcm92aWRlci5nZXRJbWFnZShuZXcgT2JqZWN0KCkpKTsNCi0JCWFzc2VydE5vdE51bGwod3NJdGVtUHJvdmlkZXIuZ2V0VGV4dCh3c0VsZW0ucHJveHkoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c0l0ZW1Qcm92aWRlci5nZXROYW1lQ2F0ZWdvcnkoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIoKQ0KLQl7DQotCQlJV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIgd3NQcm9qSXRlbVByb3ZpZGVyID0gKElXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyLmNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdEFkYXB0ZXIoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3c1Byb2pJdGVtUHJvdmlkZXIpOw0KLQkJDQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wRGVzY3MgPSB3c1Byb2pJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wRGVzY3MpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wRGVzY3Muc2l6ZSgpID4gMCk7DQotCQkNCi0JCU1vY2sgd3NQcm9qRWxlbSA9IG1vY2soSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzKTsNCi0JCXdzUHJvakVsZW0uZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZ2V0TmFtZSIpLndpbGwocmV0dXJuVmFsdWUoIlRlc3ROYW1lIikpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c1Byb2pJdGVtUHJvdmlkZXIuZ2V0SW1hZ2UobmV3IE9iamVjdCgpKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzUHJvakl0ZW1Qcm92aWRlci5nZXRUZXh0KHdzUHJvakVsZW0ucHJveHkoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c1Byb2pJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhudWxsKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJV2ViTWV0aG9kSXRlbVByb3ZpZGVyR2V0SW1wbGVtZW50YXRpb24oKQ0KLQl7DQotCQlJV2ViTWV0aG9kSXRlbVByb3ZpZGVyIG1ldGhvZEl0ZW1Qcm92aWRlciA9IChJV2ViTWV0aG9kSXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIuY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kSXRlbVByb3ZpZGVyKTsNCi0JCQ0KLQkJTW9jayB3ZWJQYXJhbTEgPSBtb2NrKElXZWJQYXJhbS5jbGFzcyk7DQotCQl3ZWJQYXJhbTEuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJQYXJhbTEiKSk7DQotCQl3ZWJQYXJhbTEuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldFR5cGVOYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiYm9vbGVhbiIpKTsNCi0JCU1vY2sgd2ViUGFyYW0yID0gbW9jayhJV2ViUGFyYW0uY2xhc3MpOw0KLQkJd2ViUGFyYW0yLmV4cGVjdHMoYXRMZWFzdE9uY2UoKSkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgicmV0dXJuIikpOw0KLQkJd2ViUGFyYW0yLmV4cGVjdHMoYXRMZWFzdE9uY2UoKSkubWV0aG9kKCJnZXRUeXBlTmFtZSIpLndpbGwocmV0dXJuVmFsdWUoImphdmEubGFuZy5TdHJpbmciKSk7DQotCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q8SVdlYlBhcmFtPiB3ZWJQYXJhbXMgPSBuZXcgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q8SVdlYlBhcmFtPigpOw0KLQkJd2ViUGFyYW1zLmFkZCgoSVdlYlBhcmFtKXdlYlBhcmFtMS5wcm94eSgpKTsNCi0JCXdlYlBhcmFtcy5hZGQoKElXZWJQYXJhbSl3ZWJQYXJhbTIucHJveHkoKSk7DQotCQlNb2NrIHdlYk1ldGhvZCA9IG1vY2soSVdlYk1ldGhvZC5jbGFzcyk7DQotCQl3ZWJNZXRob2QuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldFBhcmFtZXRlcnMiKS53aWxsKHJldHVyblZhbHVlKHdlYlBhcmFtcykpOw0KLQkJd2ViTWV0aG9kLmV4cGVjdHMoYXRMZWFzdE9uY2UoKSkubWV0aG9kKCJnZXRJbXBsZW1lbnRhdGlvbiIpLndpbGwocmV0dXJuVmFsdWUoInRlc3RNZXRob2QoQilRU3RyaW5nIikpOw0KLQkJDQotCQlCYXNpY0VMaXN0PFN0YXRlQWRhcHRlcj4gYWRhcHRlcnMgPSBuZXcgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q8U3RhdGVBZGFwdGVyPigpOw0KLQkJTW9jayBhZGFwdGVyID0gbW9jayhTdGF0ZUFkYXB0ZXIuY2xhc3MpOw0KLQkJYWRhcHRlci5zdHVicygpLm1ldGhvZCgiaXNBZGFwdGVyRm9yVHlwZSIpLndpbGwocmV0dXJuVmFsdWUodHJ1ZSkpOw0KLQkJYWRhcHRlci5zdHVicygpLm1ldGhvZCgiaXNDaGFuZ2VhYmxlIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJYWRhcHRlcnMuYWRkKChTdGF0ZUFkYXB0ZXIpYWRhcHRlci5wcm94eSgpKTsNCi0JCQ0KLQkJd2ViTWV0aG9kLmV4cGVjdHMoYXRMZWFzdE9uY2UoKSkubWV0aG9kKCJlQWRhcHRlcnMiKS53aWxsKHJldHVyblZhbHVlKGFkYXB0ZXJzKSk7DQotCQkoKElXZWJNZXRob2Qpd2ViTWV0aG9kLnByb3h5KCkpLmVBZGFwdGVycygpOw0KLQkJbWV0aG9kSXRlbVByb3ZpZGVyLnNldFRhcmdldCgoTm90aWZpZXIpd2ViTWV0aG9kLnByb3h5KCkpOw0KLQkJTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gcHJvcERlc2NzID0gbWV0aG9kSXRlbVByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMod2ViTWV0aG9kLnByb3h5KCkpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHByb3BEZXNjcyk7DQotCQlhc3NlcnRUcnVlKHByb3BEZXNjcy5zaXplKCkgPiAwKTsNCi0JCQ0KLQkJZm9yKElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIHByb3BEZXNjIDogcHJvcERlc2NzKQ0KLQkJew0KLQkJCWlmKHByb3BEZXNjLmdldEZlYXR1cmUobnVsbCkuZXF1YWxzKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04pKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0RXF1YWxzKCgoUHJvcGVydHlWYWx1ZVdyYXBwZXIpcHJvcERlc2MuZ2V0UHJvcGVydHlWYWx1ZSh3ZWJNZXRob2QucHJveHkoKSkpLmdldFRleHQobnVsbCksICJTdHJpbmcgdGVzdE1ldGhvZChib29sZWFuKSIpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElXZWJQYXJhbUl0ZW1Qcm92aWRlcigpDQotCXsNCi0JCUlXZWJQYXJhbUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVdlYlBhcmFtSXRlbVByb3ZpZGVyKSBuZXcgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKS5jcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCk7DQotCQlNb2NrIHBhcmFtTW9jayA9IG1vY2soSVdlYlBhcmFtLmNsYXNzKTsJCQ0KLQkJYXNzZXJ0Tm90TnVsbChpdGVtUHJvdmlkZXIuZ2V0SW1hZ2UobmV3IE9iamVjdCgpKSk7DQotDQotCQlwYXJhbU1vY2suc3R1YnMoKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJteVBhcmFtIikpOw0KLQkJcGFyYW1Nb2NrLnN0dWJzKCkubWV0aG9kKCJnZXRUeXBlTmFtZSIpLndpbGwocmV0dXJuVmFsdWUoImphdmEudXRpbC5MaXN0IikpOw0KLQkJcGFyYW1Nb2NrLnN0dWJzKCkubWV0aG9kKCJnZXRJbXBsZW1lbnRhdGlvbiIpLndpbGwocmV0dXJuVmFsdWUoInRlc3QiKSk7DQotCQlwYXJhbU1vY2suc3R1YnMoKS5tZXRob2QoImVDb250YWluZXIiKS53aWxsKHJldHVyblZhbHVlKG51bGwpKTsNCi0JCXBhcmFtTW9jay5zdHVicygpLm1ldGhvZCgiZVJlc291cmNlIikud2lsbChyZXR1cm5WYWx1ZShudWxsKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscygibXlQYXJhbSIsIGl0ZW1Qcm92aWRlci5nZXRUZXh0KHBhcmFtTW9jay5wcm94eSgpKSk7DQotCQlhc3NlcnROb3ROdWxsKGl0ZW1Qcm92aWRlci5nZXRJbWFnZShwYXJhbU1vY2sucHJveHkoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbChpdGVtUHJvdmlkZXIuZ2V0TmFtZUNhdGVnb3J5KCkpOw0KLQkJcGFyYW1Nb2NrLnN0dWJzKCkubWV0aG9kKCJnZXRJbXBsZW1lbnRhdGlvbiIpLndpbGwocmV0dXJuVmFsdWUoInJldHVybiIpKTsNCi0JCWFzc2VydE5vdE51bGwoaXRlbVByb3ZpZGVyLmdldEltYWdlKHBhcmFtTW9jay5wcm94eSgpKSk7CQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SVdlYlBhcmFtSXRlbVByb3ZpZGVyRm9yVHlwZU5hbWUoKQ0KLQl7DQotCQkvLyBJV2ViUGFyYW1JdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElXZWJQYXJhbUl0ZW1Qcm92aWRlcikgbmV3IERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkuY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpOw0KLQkJZmluYWwgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgdHlwZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IgPSBmaW5kV2ViUGFyYW1JdGVtUHJvcGVydHlEZXNjcmlwdG9yKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVFlQRV9OQU1FKTsNCi0JCQ0KLQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlBhcmFtKCk7DQotCQl3ZWJQYXJhbS5zZXRIZWFkZXIodHJ1ZSk7DQotCQl3ZWJQYXJhbS5zZXRLaW5kKFdlYlBhcmFtS2luZC5JTk9VVCk7DQotCQl3ZWJQYXJhbS5zZXROYW1lKCJhbnlOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCXdlYlBhcmFtLnNldFBhcnROYW1lKCJhbnlQYXJ0TmFtZSIpOyAvLyROT04tTkxTLTEkDQotCQl3ZWJQYXJhbS5zZXRUYXJnZXROYW1lc3BhY2UoImFueVRhcmdldE5hbWVzcGFjZSIpOyAvLyROT04tTkxTLTEkDQotCQkoKEVPYmplY3QpIHdlYlBhcmFtKS5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVFlQRV9OQU1FLCBudWxsKTsNCi0JCQkJDQotCQlhc3NlcnROdWxsKCJVbmV4cGVjdGVkIHZhbHVlLiIsIHR5cGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VmFsdWUod2ViUGFyYW0pKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJT2JqZWN0IHByb3BlcnR5VmFsdWVXcmFwcGVyID0gbnVsbDsNCi0JCQ0KLQkJKChFT2JqZWN0KSB3ZWJQYXJhbSkuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RZUEVfTkFNRSwgIkkiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcHJvcGVydHlWYWx1ZVdyYXBwZXIgPSB0eXBlTmFtZVByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVZhbHVlKHdlYlBhcmFtKTsJCQ0KLQkJYXNzZXJ0RXF1YWxzKCJVbnJlc29sdmVkIHZhbHVlLiIsICJpbnQiLCAoKElJdGVtUHJvcGVydHlTb3VyY2UpIHByb3BlcnR5VmFsdWVXcmFwcGVyKS5nZXRFZGl0YWJsZVZhbHVlKG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkNCi0JCSgoRU9iamVjdCkgd2ViUGFyYW0pLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UWVBFX05BTUUsICJbUVN0cmluZzsiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcHJvcGVydHlWYWx1ZVdyYXBwZXIgPSB0eXBlTmFtZVByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVZhbHVlKHdlYlBhcmFtKTsJCQ0KLQkJYXNzZXJ0RXF1YWxzKCJVbnJlc29sdmVkIHZhbHVlLiIsICJTdHJpbmdbXSIsICgoSUl0ZW1Qcm9wZXJ0eVNvdXJjZSkgcHJvcGVydHlWYWx1ZVdyYXBwZXIpLmdldEVkaXRhYmxlVmFsdWUobnVsbCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBmaW5kV2ViUGFyYW1JdGVtUHJvcGVydHlEZXNjcmlwdG9yKGZpbmFsIEVBdHRyaWJ1dGUgYXR0cmlidXRlKQ0KLQl7DQotCQlmaW5hbCBJV2ViUGFyYW1JdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElXZWJQYXJhbUl0ZW1Qcm92aWRlcikgbmV3IERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkuY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpOw0KLQkJTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMgPSBpdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsNCi0JCQkJCQ0KLQkJZm9yIChJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yIDogZGVzY3JpcHRvcnMpCQkJDQotCQl7DQotCQkJaWYgKGRlc2NyaXB0b3IuZ2V0RmVhdHVyZShudWxsKS5lcXVhbHMoYXR0cmlidXRlKSkNCi0JCQl7DQotCQkJCXJldHVybiBkZXNjcmlwdG9yOwkJCQkNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgaW50ZXJmYWNlIFN0YXRlQWRhcHRlciBleHRlbmRzIElQcm9wZXJ0eVN0YXRlLCBBZGFwdGVyDQotCXsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL2ludGVybmFsL0RPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS90ZXN0cy9pbnRlcm5hbC9ET01JdGVtUHJvcGVydHlQcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGZiZmNkZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL2ludGVybmFsL0RPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLmludGVybmFsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLmltcGwuRE9NSXRlbVByb3BlcnR5UHJvdmlkZXI7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBET01JdGVtUHJvcGVydHlQcm92aWRlcn0gY2xhc3MNCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBET01JdGVtUHJvcGVydHlQcm92aWRlciBwcm92aWRlcjsNCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0Jew0KLQkJcHJvdmlkZXIgPSBuZXcgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXIoDQotCQkJCW51bGwsDQotCQkJCW51bGwsDQotCQkJCSJkaXNwbGF5IG5hbWUiLA0KLQkJCQkiZGVzY3JpcHRpb24iLA0KLQkJCQlEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUsDQotCQkJCXRydWUsDQotCQkJCWZhbHNlLA0KLQkJCQlmYWxzZSwNCi0JCQkJbnVsbCwgDQotCQkJCSJjYXRlZ29yeSIsDQotCQkJCW5ldyBTdHJpbmdbMF0pOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzZXRQcm9wZXJ0eVZhbHVlKCkNCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJd3MuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAib3JnLmVjbGlwc2UudGVzdC5TZWkiKTsNCi0JCXdzLnNldE5hbWUoIlRlc3QiKTsNCi0JCXByb3ZpZGVyLnJlc2V0UHJvcGVydHlWYWx1ZSh3cyk7DQotCQlhc3NlcnRFcXVhbHMoIlNlaVNlcnZpY2UiLCB3cy5nZXROYW1lKCkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxYTQzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmN2EzODAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNNb24gSnVsIDIwIDE1OjI1OjMxIEVFU1QgMjAwOQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4NjEwMTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjANCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscw0KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbg0KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXINCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmptb2NrLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywNCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwNCi0gb3JnLmVjbGlwc2UudWksDQotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcsDQotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMsDQotIG9yZy5qdW5pdCwNCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlDQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5maWxlcywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jaywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay50ZXN0Y2FzZXMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZw0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiN2FjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDIwLCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzg4ZWZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3ZGNiMDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1CdW5kbGUtTmFtZS4wPUpBWC1XUyBVdGlsaXRpZXMgZm9yIEpVbml0IHRlc3RzDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9JV2FpdENvbmRpdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9JV2FpdENvbmRpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTA4ZThmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvSVdhaXRDb25kaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlsczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLkNvbmRpdGlvbkNoZWNrRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSB3aGljaCBkZWZpbmVzIGEgY29uZGl0aW9uIHVwb24gd2hpY2ggdGhlIGV4ZWN1dGlvbiBjYW4gY29udGludWUgDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXYWl0Q29uZGl0aW9uDQotew0KLQkvKioNCi0JICogTWV0aG9kIHdoaWNoIGNoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY29uZGl0aW9uIGlzIG1ldA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIGNvbmRpdGlvbiBpcyBtZXQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHRocm93cyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbiB3aGVuIGltcGxlbWVudG9ycyBkZWNpZGUgdGhhdCB0aGV5IGNhbm5vdCBkZWFsIHdpdGggYSBnaXZlbiBleGNlcHRpb25hbCBzaXR1YXRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGNoZWNrQ29uZGl0aW9uKCkgdGhyb3dzIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2Fzc2VydGlvbnMvQXNzZXJ0aW9ucy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9hc3NlcnRpb25zL0Fzc2VydGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2ZiOWZmNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2Fzc2VydGlvbnMvQXNzZXJ0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLklXYWl0Q29uZGl0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZy5UZXN0Q29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsNCi0NCi0vKioNCi0gKiBVdGlsaXR5IGNsYXNzIHdoaWNoIHByb3ZpZGVzIG1ldGhvZHMgd2hpY2ggYXNzZXJ0IHRoYXQgYSBnaXZlbiBjb25kaXRpb24gaXMgbWV0LiBJZiBuZWNlc3NhcnksIG1ldGhvZHMgd2lsbCBibG9jayB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjYWxsZXIgdW50aWwNCi0gKiB0aGUgY29uZGl0aW9uIGlzIG1ldCBmb3IgYSByZWFzb25hYmxlIHRpbWUuIElmIHRoZSBjb25kaXRpb25zIGlzIG5vdCBtZXQsIDxjb2RlPkFzc2VydC5mYWlsKCk8L2NvZGU+IGlzIGludm9rZWQNCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBc3NlcnRpb25zDQotew0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX0NPTkRJVElPTl9DSEVDS1MgPSA1MDAwOw0KLQ0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0xFRVBfVElNRU9VVCA9IDQyOw0KLQ0KLQkvKioNCi0JICogQXNzZXJ0cyB0aGF0IHdhaXRzIHNvbWUgdGltZSB1bnRpbCB0aGUgY29uZGl0aW9uIHNwZWNpZmllZCBpcyBtZXQuIElmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldCBhZnRlciBzb21lIHJlYXNvbmFibGUgdGltZSwgdGhlIG1ldGhvZCBjYWxscyBBc3NlcnQuZmFpbCgpICANCi0JICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uIHRvIGNoZWNrDQotCSAqIEBwYXJhbSBmYWlsTWVzc2FnZSB0aGUgbWVzc2FnZSB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byA8Y29kZT5Bc3NlcnQuZmFpbCgpPC9jb2RlPiB0aHVzIGluZGljYXRpbmcgYSB0ZXN0IGZhaWx1cmUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0QXNzZXJ0KGZpbmFsIElXYWl0Q29uZGl0aW9uIGNvbmRpdGlvbiwgZmluYWwgU3RyaW5nIGZhaWxNZXNzYWdlKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlpZiAoIXdhaXRGb3JDb25kaXRpb25Mb29wKGNvbmRpdGlvbikpDQotCQkJew0KLQkJCQlBc3NlcnQuZmFpbChmYWlsTWVzc2FnZSk7DQotCQkJfQ0KLQkJfSBjYXRjaCAoQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlmYWlsVXBvblRocm93YWJsZShlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQmxvY2tzIHRoZSBleGVjdXRpb24gb2YgdGhlIGNhbGxlciB1bnRpbCB0aGUgPGNvZGU+Y29uZGl0aW9uPC9jb2RlPiBpcyBtZXQgb3IgTUFYX0NPTkRJVElPTl9DSEVDS1MgYXR0ZW1wdHMgaGF2ZSBiZWVuIHJlYWNoZWQuPGJyPg0KLQkgKiBUaGUgbWV0aG9kIGJlaGF2aW91ciBzbGlnaHRseSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIG1ldGhvZCBpcyBpbnZva2VkIGZyb20gdGhlIFVJIHRocmVhZCBvciBub3QNCi0JICogPGxpPklmIHRoZSBjYWxsZXIgaXMgdGhlIFVJIHRocmVhZCwgYSBuZXcgbW9kYWwgY29udGV4dCB0aHJlYWQgaXMgc3RhcnRlZCB3aGljaCBzbGVlcHMgZm9yIHtAbGluayAjU0xFRVBfVElNRU9VVH0NCi0JICogPGxpPklmIHRoZSBjYWxsZXIgaXMgbm90IHRoZSBVSSB0aHJlYWQsIHRoZW4gdGhlIGN1cnJlbnQgdGhyZWFkIHNsZWVwcyBmb3Ige0BsaW5rICNTTEVFUF9USU1FT1VUfSA8YnI+DQotCSAqIA0KLQkgKiBAcGFyYW0gY29uZGl0aW9uDQotCSAqICAgICAgICAgICAgY29uZGl0aW9uIG9uIHdoaWNoIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gaWYgbWV0DQotCSAqIEB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24NCi0JICovDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gd2FpdEZvckNvbmRpdGlvbkxvb3AoZmluYWwgSVdhaXRDb25kaXRpb24gY29uZGl0aW9uKSB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24NCi0Jew0KLQkJaW50IGF0dGVtcHRzID0gMDsNCi0JCXdoaWxlIChhdHRlbXB0cyA8IE1BWF9DT05ESVRJT05fQ0hFQ0tTKQ0KLQkJew0KLQkJCWlmIChjb25kaXRpb24uY2hlY2tDb25kaXRpb24oKSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0NCi0JCQlhdHRlbXB0cysrOw0KLQkJCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBzbGVlcFJ1bm5hYmxlID0gZ2V0U2xlZXBSdW5uYWJsZSgpOw0KLQ0KLQkJCXRyeQ0KLQkJCXsNCi0JCQkJVGVzdENvbnRleHQucnVuKHNsZWVwUnVubmFibGUsIERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpKTsNCi0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpDQotCQkJew0KLQkJCQl0aHJvdyBuZXcgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24oZSk7DQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCQl7DQotCQkJCXRocm93IG5ldyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbihlKTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldFNsZWVwUnVubmFibGUoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpDQotCQl7DQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uDQotCQkJew0KLQkJCQlUaHJlYWQuc2xlZXAoU0xFRVBfVElNRU9VVCk7DQotCQkJfQ0KLQkJfTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZhaWxVcG9uVGhyb3dhYmxlKGZpbmFsIFRocm93YWJsZSB0KQ0KLQl7DQotCQlmaW5hbCBTdHJpbmdCdWlsZGVyIG1zZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih0LmdldE1lc3NhZ2UoKSk7DQotCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLQkJUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsNCi0JCXQucHJpbnRTdGFja1RyYWNlKHByaW50V3JpdGVyKTsNCi0JCW1zZ0J1aWxkZXIuYXBwZW5kKHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsNCi0JCW1zZ0J1aWxkZXIuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7DQotDQotCQlBc3NlcnQuZmFpbChtc2dCdWlsZGVyLnRvU3RyaW5nKCkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvYXNzZXJ0aW9ucy9Db25kaXRpb25DaGVja0V4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9hc3NlcnRpb25zL0NvbmRpdGlvbkNoZWNrRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllNjkxZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9hc3NlcnRpb25zL0NvbmRpdGlvbkNoZWNrRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5JV2FpdENvbmRpdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBFeGNlcHRpb24gd2hpY2ggY2FuIGJlIHRocm93biBieSB7QGxpbmsgSVdhaXRDb25kaXRpb24jY2hlY2tDb25kaXRpb24oKX0gbWV0aG9kLiBUaGlzIGlzIGEgd3JhcHBlciBleGNlcHRpb24gd2hpY2ggZW5jbG9zZXMgdGhlIGV4Y2VwdGlvbiBjYXVzZQ0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotcHVibGljIGNsYXNzIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDkyOTA4MDI4NTUwNjc4ODk4NEw7DQotDQotCXB1YmxpYyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbihmaW5hbCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCXN1cGVyKGNhdXNlKTsNCi0JfQ0KLQkNCi0JcHVibGljIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlzdXBlcihtZXNzYWdlKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ZpbGVzL1Rlc3RGaWxlVXRpbHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvZmlsZXMvVGVzdEZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNTMyY2JkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvZmlsZXMvVGVzdEZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5maWxlczsNCi0NCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgVGVzdEZpbGVVdGlscw0KLXsNCi0JLy8gSGlkZSBkZWZhdWx0IGNvbnN0cnVjdG9yDQotCXByaXZhdGUgVGVzdEZpbGVVdGlscygpDQotCXsNCi0JfTsNCi0NCi0JLyoqIEdldCBuZXcgaW5zdGFuY2Ugb2YgdGhlIEZpbGVVdGlsaXRpZXMgb2JqZWN0ICovDQotCXB1YmxpYyBzdGF0aWMgVGVzdEZpbGVVdGlscyBnZXRJbnN0YW5jZSgpDQotCXsNCi0JCXJldHVybiBuZXcgVGVzdEZpbGVVdGlscygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBVdGlsaXR5IG1ldGhvZC4gQ29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGZvbGRlciB0byB0aGUgZGVzdGluYXRpb24gZm9sZGVyLg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gY29weUZpbGVzKGZpbmFsIEZpbGUgZGVzdCwgZmluYWwgRmlsZSBzcmMpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotDQotCQlpZiAoc3JjLmlzRGlyZWN0b3J5KCkpDQotCQl7DQotCQkJZGVzdC5ta2RpcnMoKTsNCi0JCQlmaW5hbCBTdHJpbmcgbGlzdFtdID0gc3JjLmxpc3QoKTsNCi0NCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspDQotCQkJew0KLQkJCQlmaW5hbCBTdHJpbmcgZGVzdDEgPSBkZXN0LmdldEFic29sdXRlUGF0aCgpICsgIlxcIiArIGxpc3RbaV07DQotCQkJCWZpbmFsIFN0cmluZyBzcmMxID0gc3JjLmdldEFic29sdXRlUGF0aCgpICsgIlxcIiArIGxpc3RbaV07DQotCQkJCWNvcHlGaWxlcyhuZXcgRmlsZShkZXN0MSksIG5ldyBGaWxlKHNyYzEpKTsNCi0JCQl9DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlyZXR1cm4gY29weShkZXN0LCBzcmMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY29weWluZyBhIGZpbGUhIC0gbm90IGEgZGlyZWN0b3J5DQotCSAqIA0KLQkgKiBAcGFyYW0gdGFyZ2V0DQotCSAqIEBwYXJhbSBzb3VyY2UNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gY29weShmaW5hbCBGaWxlIHRhcmdldCwgZmluYWwgRmlsZSBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlpZiAoIXNvdXJjZS5pc0ZpbGUoKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlmaW5hbCBGaWxlQ2hhbm5lbCBzb3VyY2VDaGFubmVsID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpLmdldENoYW5uZWwoKTsNCi0JCWZpbmFsIEZpbGVDaGFubmVsIHRhcmdldENoYW5uZWwgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRhcmdldCkuZ2V0Q2hhbm5lbCgpOw0KLQkJc291cmNlQ2hhbm5lbC50cmFuc2ZlclRvKDAsIHNvdXJjZUNoYW5uZWwuc2l6ZSgpLCB0YXJnZXRDaGFubmVsKTsNCi0JCXNvdXJjZUNoYW5uZWwuY2xvc2UoKTsNCi0JCXRhcmdldENoYW5uZWwuY2xvc2UoKTsNCi0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCS8qKg0KLQkgKiANCi0JICogQHBhcmFtIGRlc3REaXINCi0JICogQHBhcmFtIHNyY1JlbGF0aXZlUGF0aCAtDQotCSAqICAgICAgICAgICAgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIGluIHRoZSBzYW1lIHBhY2thZ2UNCi0JICogQHBhcmFtIHJlc291cmNlTmFtZQ0KLQkgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcw0KLQkgKiBAcmV0dXJuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBGaWxlIGNvcHlSZXNvdXJjZVRvRGlyKEZpbGUgZGVzdERpciwgSW5wdXRTdHJlYW0gc3JjU3RyZWFtLCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCksIHJlc291cmNlTmFtZSk7DQotCQljb3B5RmlsZShzcmNTdHJlYW0sIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKSk7DQotCQlyZXR1cm4gZGVzdEZpbGU7DQotCX0NCi0JLyoqDQotCSAqIA0KLQkgKiBAcGFyYW0gZGVzdERpcg0KLQkgKiBAcGFyYW0gc3JjUmVsYXRpdmVQYXRoIC0NCi0JICogICAgICAgICAgICB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgaW4gdGhlIHNhbWUgcGFja2FnZQ0KLQkgKiBAcGFyYW0gc3JjRmlsZU5hbWUNCi0JICogQHBhcmFtIHJlc291cmNlQ2xhc3MNCi0JICogQHJldHVybg0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgRmlsZSBjb3B5UmVzb3VyY2VUb0RpcihGaWxlIGRlc3REaXIsIFN0cmluZyBzcmNSZWxhdGl2ZVBhdGgsIFN0cmluZyBzcmNGaWxlTmFtZSwgQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpLCBzcmNGaWxlTmFtZSk7DQotCQljb3B5RmlsZShjcmVhdGVJbnB1dFN0cmVhbUZvclJlc291cmNlKHNyY1JlbGF0aXZlUGF0aCwgc3JjRmlsZU5hbWUsIHJlc291cmNlQ2xhc3MpLCBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSkpOw0KLQkJcmV0dXJuIGRlc3RGaWxlOw0KLQl9DQotDQotCXByaXZhdGUgSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW1Gb3JSZXNvdXJjZShTdHJpbmcgc3JjUmVsYXRpdmVQYXRoLCBTdHJpbmcgc3JjRmlsZU5hbWUsIENsYXNzPD8+IHJlc291cmNlQ2xhc3MpDQotCXsNCi0JCXJldHVybiByZXNvdXJjZUNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oY3JlYXRlUmVzb3VyY2VQYXRoKHNyY1JlbGF0aXZlUGF0aCkgKyBzcmNGaWxlTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUmVzb3VyY2VQYXRoKFN0cmluZyBzcmNSZWxhdGl2ZVBhdGgpDQotCXsNCi0JCXJldHVybiAoc3JjUmVsYXRpdmVQYXRoID09IG51bGwpID8gIiIgOiBzcmNSZWxhdGl2ZVBhdGggKyAiLyI7DQotCX0NCi0NCi0JLyoqIENsb3NlcyB0aGUgc3RyZWFtcyBhZnRlciBjb21wbGV0aW9uICovDQotCXB1YmxpYyB2b2lkIGNvcHlGaWxlKElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJaWYgKGluID09IG51bGwgfHwgb3V0ID09IG51bGwpDQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyZWFtIG5vdCBpbml0aWFsaXplZCIpOw0KLQkJdHJ5DQotCQl7DQotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOw0KLQkJCWludCBsZW47DQotCQkJd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZikpID4gMCkNCi0JCQl7DQotCQkJCW91dC53cml0ZShidWYsIDAsIGxlbik7DQotCQkJfQ0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJaW4uY2xvc2UoKTsNCi0JCQlvdXQuY2xvc2UoKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVXRpbGl0eSBtZXRob2QgZm9yIGRlbGV0aW5nIHRoZSBjb250ZW50cyBvZiBhIGdpdmVuIGZvbGRlciBwYXRoDQotCSAqIA0KLQkgKiBAcGFyYW0gZm9sZGVyUGF0aA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9jZXNzIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Lg0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBkZWxldGVGb2xkZXJBbmRDb250ZW50cyhmaW5hbCBTdHJpbmcgZm9sZGVyUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIEZpbGUgcGF0aCA9IG5ldyBGaWxlKGZvbGRlclBhdGgpOw0KLQkJcmV0dXJuIGRlbGV0ZUZvbGRlckFuZENvbnRlbnRzKHBhdGgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBhbGwgaXRzIGNvbnRlbnRzIGluY2x1ZGluZyBhbGwgc3ViIGRpcmVjdG9yaWVzLg0KLQkgKiANCi0JICogQHBhcmFtIHRlbXBEaXINCi0JICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IHRoYXQgaXMgYmVpbmcgZGVsZXRlZC4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZUZvbGRlckFuZENvbnRlbnRzKEZpbGUgdGVtcERpcikNCi0Jew0KLQkJYm9vbGVhbiBzdGF0dXMgPSB0cnVlOw0KLQkJaWYgKHRlbXBEaXIgIT0gbnVsbCkNCi0JCXsNCi0JCQlGaWxlW10gZmlsZXMgPSB0ZW1wRGlyLmxpc3RGaWxlcygpOw0KLQ0KLQkJCWlmIChmaWxlcyAhPSBudWxsKQ0KLQkJCXsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykNCi0JCQkJew0KLQkJCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpDQotCQkJCQl7DQotCQkJCQkJc3RhdHVzID0gZGVsZXRlRm9sZGVyQW5kQ29udGVudHMoZmlsZXNbaV0pICYmIHN0YXR1czsNCi0JCQkJCX0gZWxzZQ0KLQkJCQkJew0KLQkJCQkJCXN0YXR1cyA9IGZpbGVzW2ldLmRlbGV0ZSgpICYmIHN0YXR1czsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQlzdGF0dXMgPSB0ZW1wRGlyLmRlbGV0ZSgpICYmIHN0YXR1czsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXN0YXR1cyA9IGZhbHNlOw0KLQkJfQ0KLQkJcmV0dXJuIHN0YXR1czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gZmlsZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5Lg0KLQkgKiANCi0JICogQHBhcmFtIGlzdHINCi0JICogICAgICAgICAgICBUaGUgaW5wdXQgc3RyZWFtIG9mIHRoZSBqYXIgZmlsZQ0KLQkgKiBAcGFyYW0gc3JjRmlsZU5hbWUNCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYXJjaGl2ZSAtIHdoZXJlIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgc3RyZWFtIHdpbGwgYmUgY29waWVkDQotCSAqIEBwYXJhbSBkZXN0RGlyDQotCSAqICAgICAgICAgICAgVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBvYmplY3QNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvY2VzcyB3YXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiB1bnppcEFyY2hpdmVUb0RpcihmaW5hbCBJbnB1dFN0cmVhbSBpc3RyLCBmaW5hbCBTdHJpbmcgc3JjRmlsZU5hbWUsIGZpbmFsIEZpbGUgZGVzdERpcikgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0NCi0JCWlmICghZGVzdERpci5leGlzdHMoKSkNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCIpOw0KLQkJaWYgKCFkZXN0RGlyLmNhbldyaXRlKCkpDQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3Qgd3JpdGUgdG8gZGlyZWN0b3J5Iik7DQotDQotCQlmaW5hbCBGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBzcmNGaWxlTmFtZSk7DQotDQotCQlmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNvdXJjZUZpbGUpOw0KLQkJZmluYWwgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYnVmT3V0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZvcyk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlVbnppcHBlci5JTlNUQU5DRS5jb3B5SW5wdXRTdHJlYW0oaXN0ciwgYnVmT3V0U3RyZWFtKTsNCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCWJ1Zk91dFN0cmVhbS5jbG9zZSgpOw0KLQkJCWZvcy5jbG9zZSgpOw0KLQkJfQ0KLQ0KLQkJLy8gY2hlY2sgaWYgdGhlIGFyY2hpdmUgd2FzIGNvcGllZCBzdWNjZXNzZnVsbHkNCi0JCWlmICghc291cmNlRmlsZS5leGlzdHMoKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJBcmNoaXZlIGNvdWxkIG5vdCBiZSBmb3VuZCIpOw0KLQkJfQ0KLQ0KLQkJVW56aXBwZXIuSU5TVEFOQ0UudW56aXAoc291cmNlRmlsZSwgZGVzdERpciwgZmFsc2UpOw0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JLyoqIFV0aWxpdHkgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgdGhyb3VnaCBVUkwgKi8NCi0JcHVibGljIFN0cmluZyByZWFkVVJMUmVzb3VyY2UoVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyByZWFkSW5mID0gbnVsbDsNCi0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gdXJsLm9wZW5TdHJlYW0oKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCWludCBpblJlYWQgPSBpbi5yZWFkKCk7DQotDQotCQkJcmVhZEluZiA9ICIiOw0KLQkJCXdoaWxlIChpblJlYWQgIT0gLTEpDQotCQkJew0KLQkJCQlyZWFkSW5mICs9IFN0cmluZy52YWx1ZU9mKChjaGFyKSBpblJlYWQpOw0KLQkJCQlpblJlYWQgPSBpbi5yZWFkKCk7DQotCQkJfQ0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJaW4uY2xvc2UoKTsNCi0JCX0NCi0NCi0JCXJldHVybiByZWFkSW5mOw0KLQl9DQotDQotCS8qKg0KLQkgKiBNZXRob2QgZm9yIHJlcGxhY2luZyB0aGUgdGV4dCBvY2N1cnJlbmNlIGluIGEgZmlsZSB3aXRoIHRoZSBwcm92aWRlZCByZXBsYWNlbWVudC4NCi0JICogDQotCSAqIEBwYXJhbSBmaWxlDQotCSAqIEBwYXJhbSBmaW5kDQotCSAqIEBwYXJhbSByZXBsYWNlbWVudA0KLQkgKiBAcmV0dXJuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIHJlcGxhY2VDb250ZW50c0luRmlsZShGaWxlIGZpbGUsIFN0cmluZyBmaW5kLCBTdHJpbmcgcmVwbGFjZW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJU3RyaW5nIGZpbGVDb250ZW50cyA9IHJlYWRGaWxlQ29udGVudHMoZmlsZSk7DQotDQotCQlmaWxlQ29udGVudHMgPSBmaWxlQ29udGVudHMucmVwbGFjZUFsbChmaW5kLCByZXBsYWNlbWVudCk7DQotDQotCQlmaWxlLmRlbGV0ZSgpOw0KLQkJZmlsZS5jcmVhdGVOZXdGaWxlKCk7DQotDQotCQl3cml0ZUNvbnRlbnRzVG9GaWxlKGZpbGUsIGZpbGVDb250ZW50cyk7DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogV3JpdGVzIHRoZSBzdHJpbmcgdG8gdGhlIGdpdmVuIGZpbGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZSAtDQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gd3JpdGUgdG8NCi0JICogQHBhcmFtIGZpbGVDb250ZW50cyAtDQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgd3JpdGVDb250ZW50c1RvRmlsZShGaWxlIGZpbGUsIFN0cmluZyBmaWxlQ29udGVudHMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCXsNCi0NCi0JCVByaW50V3JpdGVyIHBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoZmlsZSk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlwb3V0LnByaW50bG4oZmlsZUNvbnRlbnRzKTsNCi0JCQlwb3V0LmZsdXNoKCk7DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQlwb3V0LmNsb3NlKCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlYWRzIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgYW5kIHJldHVybnMgaXQgYXMgU3RyaW5nLg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIHJlYWQgZnJvbQ0KLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIHJlYWRGaWxlQ29udGVudHMoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIHJlYWRJbmYgPSBudWxsOw0KLQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJaW50IGluUmVhZCA9IGluLnJlYWQoKTsNCi0NCi0JCQlyZWFkSW5mID0gIiI7DQotCQkJd2hpbGUgKGluUmVhZCAhPSAtMSkNCi0JCQl7DQotCQkJCXJlYWRJbmYgKz0gU3RyaW5nLnZhbHVlT2YoKGNoYXIpIGluUmVhZCk7DQotCQkJCWluUmVhZCA9IGluLnJlYWQoKTsNCi0JCQl9DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCXRocm93IGU7DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQlpbi5jbG9zZSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlYWRJbmY7DQotCX0NCi0NCi0JLyoqIEByZXR1cm4gdGhlIHJlc291cmNlIGlucHV0IHN0cmVhbSBvZiB0aGUgcHJvamVjdHMgYXJjaGl2ZSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlSW5wdXRTdHJlYW0oZmluYWwgU3RyaW5nIGFyY2hpdmVOYW1lLCBmaW5hbCBTdHJpbmcgcHJvamVjdFNvdXJjZUZvbGRlciwgQ2xhc3MgcmVsYXRpdmVSZXNvdXJjZUJhc2VDbGFzcykNCi0Jew0KLQkJcmV0dXJuIHJlbGF0aXZlUmVzb3VyY2VCYXNlQ2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShwcm9qZWN0U291cmNlRm9sZGVyICsgIi8iICsgYXJjaGl2ZU5hbWUpOw0KLQl9DQotDQotCS8qKiBNZXRob2QgZm9yIGhhbmRsaW5nIHRoZSB1bnppcHBpbmcgb2YgdGhlIHRlc3QgcHJvamVjdHMgKi8NCi0JcHVibGljIHZvaWQgdW56aXBUZXN0UHJvamVjdHMoZmluYWwgSW5wdXRTdHJlYW0gYXJjaGl2ZVN0cmVhbSwgZmluYWwgU3RyaW5nIGFyY2hpdmVOYW1lLCBmaW5hbCBGaWxlIGRlc3REaXIpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotDQotCQlpZiAoYXJjaGl2ZVN0cmVhbSA9PSBudWxsKQ0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGhlIGFyY2hpdmUgcmVzb3VyY2Ugc3RyZWFtIGlzIG5vdCBpbml0aWFsaXplZCEgYXJjaGl2ZTogIiArIGFyY2hpdmVOYW1lICsgIiAtIGRpcjogIiArIGRlc3REaXIpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJdW56aXBBcmNoaXZlVG9EaXIoYXJjaGl2ZVN0cmVhbSwgYXJjaGl2ZU5hbWUsIGRlc3REaXIpOw0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJYXJjaGl2ZVN0cmVhbS5jbG9zZSgpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBVbnppcHMgdGhlIGNvbnRlbnQgb2YgPHR0PnppcEZpbGVMb2NhdGlvbjwvdHQ+IGludG8gPHR0Pm91dEZvbGRlcjwvdHQ+Lg0KLQkgKiANCi0JICogQHBhcmFtIHppcEZpbGVMb2NhdGlvbg0KLQkgKiBAcGFyYW0gb3V0Rm9sZGVyDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRaaXBwZWRDb250ZW50KEZpbGUgemlwRmlsZUxvY2F0aW9uLCBGaWxlIG91dEZvbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGVMb2NhdGlvbik7DQotCQlhZGRaaXBwZWRDb250ZW50KGZpcywgb3V0Rm9sZGVyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVW56aXBzIHRoZSBjb250ZW50IG9mIDx0dD5pczwvdHQ+IGludG8gPHR0Pm91dEZvbGRlcjwvdHQ+Lg0KLQkgKiANCi0JICogQHBhcmFtIHppcEZpbGVMb2NhdGlvbg0KLQkgKiBAcGFyYW0gb3V0Rm9sZGVyDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRaaXBwZWRDb250ZW50KElucHV0U3RyZWFtIGlzLCBGaWxlIG91dEZvbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCVppcElucHV0U3RyZWFtIHppcyA9IG5ldyBaaXBJbnB1dFN0cmVhbShpcyk7DQotCQlaaXBFbnRyeSBlbnRyeSA9IG51bGw7DQotCQl3aGlsZSAoKGVudHJ5ID0gemlzLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKQ0KLQkJew0KLQkJCUZpbGUgb3V0RmlsZSA9IG5ldyBGaWxlKG91dEZvbGRlciwgZW50cnkuZ2V0TmFtZSgpKTsNCi0NCi0JCQlpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkNCi0JCQl7DQotCQkJCW91dEZpbGUubWtkaXJzKCk7DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSk7DQotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMjA0OF07DQotCQkJCWludCByZWFkOw0KLQkJCQl3aGlsZSAoKHJlYWQgPSB6aXMucmVhZChidWZmKSkgPiAwKQ0KLQkJCQl7DQotCQkJCQlvdXQud3JpdGUoYnVmZiwgMCwgcmVhZCk7DQotCQkJCX0NCi0JCQkJb3V0LmNsb3NlKCk7DQotCQkJfQ0KLQ0KLQkJCXppcy5jbG9zZUVudHJ5KCk7DQotCQl9DQotDQotCQl6aXMuY2xvc2UoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRGVsZXRlcyBkaXJlY3Rvcnkgd2l0aCBpdHMgY29udGVudA0KLQkgKiANCi0JICogQHBhcmFtIGRpcg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcikNCi0Jew0KLQkJaWYgKCFkaXIuaXNEaXJlY3RvcnkoKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYSBkaXJlY3RvcnkiICsgZGlyLmdldE5hbWUoKSk7DQotCQl9DQotDQotCQlmb3IgKFN0cmluZyBzIDogZGlyLmxpc3QoKSkNCi0JCXsNCi0JCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIHMpOw0KLQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpDQotCQkJew0KLQkJCQlkZWxldGVEaXJlY3RvcnkoZik7DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQlmLmRlbGV0ZSgpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWRpci5kZWxldGUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgZGlyZWN0b3J5IG5hbWVkIHZpYSB0aGUgcGF0dGVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikgKyBGaWxlLnNlcGFyYXRvciArIGRpck5hbWUNCi0JICogDQotCSAqIEBwYXJhbSBkaXJOYW1lDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRGlyZWN0b3J5KFN0cmluZyBkaXJOYW1lKQ0KLQl7DQotCQlGaWxlIHRlbXBEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksIGRpck5hbWUpOw0KLQkJaWYgKHRlbXBEaXIuZXhpc3RzKCkpDQotCQl7DQotCQkJZGVsZXRlRGlyZWN0b3J5KHRlbXBEaXIpOw0KLQkJfQ0KLQ0KLQkJaWYgKCF0ZW1wRGlyLm1rZGlyKCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGVtcCBkaXJlY29yeSAiICsgdGVtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIgY291bGQgbm90IGJlIGNyZWF0ZWQiKTsNCi0JCX0NCi0JCS8vIHRlbXBEaXIuZGVsZXRlT25FeGl0KCk7DQotDQotCQlyZXR1cm4gdGVtcERpcjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29weSB0aGUgY29udGVudCBvZiA8Y29kZT5maWxlUGF0aDwvY29kZT4gYW5kIGNvcGllcyBpdCB0byB0ZW1wb3JhcnkgZmlsZSBpbiBzeXN0ZW0gdGVtcCBkaXJlY3RvcnkuDQotCSAqIA0KLQkgKiBAcGFyYW0gY2xhc3NDb250ZXh0DQotCSAqIEBwYXJhbSBmaWxlUGF0aA0KLQkgKiBAcmV0dXJuIGNyZWF0ZWQgdGVtcG9yYXJ5IGZpbGUNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvcHlUb1RlbXBMb2NhdGlvbihDbGFzczw/PiBjbGFzc0NvbnRleHQsIFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElucHV0U3RyZWFtIGlzID0gY2xhc3NDb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0oZmlsZVBhdGgpOw0KLQkJZmluYWwgRmlsZSBkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOw0KLQkJZmluYWwgRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKGRpciwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmphdmEiKTsNCi0JCXRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOw0KLQ0KLQkJZmluYWwgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7DQotCQl0cnkNCi0JCXsNCi0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlWzEwMjRdOw0KLQkJCWZvciAoaW50IGNudCA9IDA7IChjbnQgPSBpcy5yZWFkKGJ1ZmYpKSA+IC0xOykNCi0JCQl7DQotCQkJCWZvcy53cml0ZShidWZmLCAwLCBjbnQpOw0KLQkJCX0NCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCWlzLmNsb3NlKCk7DQotCQkJZm9zLmNsb3NlKCk7DQotCQl9DQotDQotCQlyZXR1cm4gdGVtcEZpbGU7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpbGVDb250ZW50KEZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoZmlsZSk7DQotCQl0cnkNCi0JCXsNCi0JCQlmdy53cml0ZShjb250ZW50KTsNCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCWZ3LmNsb3NlKCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9maWxlcy9VbnppcHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9maWxlcy9VbnppcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOWJmZGZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvZmlsZXMvVW56aXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuZmlsZXM7DQotDQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ow0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7DQotDQotLyoqDQotICogQSBzaW1wbGUgdXRpbGl0eSBmb3IgdW56aXBwaW5nIFpJUCBhcmNoaXZlcw0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotcHVibGljIGNsYXNzIFVuemlwcGVyIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVbnppcHBlciBJTlNUQU5DRSA9IG5ldyBVbnppcHBlcigpOw0KLQ0KLQkvLyBIaWRlIGRlZmF1bHQgY29uc3RydWN0b3INCi0JcHJpdmF0ZSBVbnppcHBlcigpIHsNCi0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29weSB0aGUgY29udGVudCBmcm9tIHRoZSA8Y29kZT5zb3VyY2VTdHJlYW08L2NvZGU+IHRvIHRoZQ0KLQkgKiA8Y29kZT5kZXN0aW5hdGlvblN0cmVhbTwvY29kZT4NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VTdHJlYW0NCi0JICogQHBhcmFtIGRlc3RTdHJlYW0NCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgY29weUlucHV0U3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSwNCi0JCQlmaW5hbCBPdXRwdXRTdHJlYW0gZGVzdFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsNCi0JCWludCBsZW47DQotDQotCQl3aGlsZSAoKGxlbiA9IHNvdXJjZVN0cmVhbS5yZWFkKGJ1ZmZlcikpID49IDApIHsNCi0JCQlkZXN0U3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsNCi0JCX0NCi0NCi0JCWRlc3RTdHJlYW0uZmx1c2goKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVW56aXAgdGhlIHppcCBmaWxlIHNwZWNpZmllZCB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5DQotCSAqIA0KLQkgKiBAcGFyYW0gc291cmNlRmlsZQ0KLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgemlwIGZpbGUNCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uRGlyDQotCSAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQ0KLQkgKiBAcGFyYW0gdG9Mb3dlckNhc2UNCi0JICogICAgICAgICAgICBpZiB0cnVlLCBhbGwgdGhlIHVuemlwcGVkIGVudHJpZXMgd291bGQgYmUgbG93ZXJjYXNlZCAoZm9yICpJWA0KLQkgKiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkpIFRoZSBiYWNrZ3JvdW5kIGJlaGluZCB0aGlzIHBhcmFtZXRlciBpcyB0aGUNCi0JICogICAgICAgICAgICBjYXNlIGluY29uc2lzdGVuY3kgYmV0d2VlbiBBQkFQIHhtbCB0ZXN0IGRhdGEgZGlyZWN0b3J5IG5hbWVzDQotCSAqICAgICAgICAgICAgYW5kIHRoZSByZWFsIGRpcmVjdG9yeSBuYW1lcyBpbiB0aGUgQUJBUCBaSVANCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gYW55IG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGlzIG51bGwNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiA8Y29kZT5zb3VyY2VGaWxlPC9jb2RlPiBkb2VzIG5vdCBleGlzdCBvciBwb2ludHMgdG8gYQ0KLQkgKiAgICAgICAgICAgICBkaXJlY3RvcnkNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiA8Y29kZT5kZXN0aW5hdGlvbkRpcjwvY29kZT4gZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGENCi0JICogICAgICAgICAgICAgZGlyZWN0b3J5DQotCSAqLw0KLQlwdWJsaWMgdm9pZCB1bnppcChmaW5hbCBGaWxlIHNvdXJjZUZpbGUsIGZpbmFsIEZpbGUgZGVzdGluYXRpb25EaXIsDQotCQkJZmluYWwgYm9vbGVhbiB0b0xvd2VyQ2FzZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWNoZWNrSW5wdXRQYXJhbXMoc291cmNlRmlsZSwgZGVzdGluYXRpb25EaXIpOw0KLQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsNCi0NCi0JCXRyeSB7DQotCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHNvdXJjZUZpbGUpOw0KLQkJCUVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOw0KLQ0KLQkJCS8vIENyZWF0ZSBkaXIgc3RydWN0dXJlDQotCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCi0JCQkJZmluYWwgWmlwRW50cnkgZW50cnkgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7DQotDQotCQkJCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7DQotCQkJCQkvLyBUaGlzIGlzIG5vdCByb2J1c3QsIGp1c3QgZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMuDQotCQkJCQkobmV3IEZpbGUoZGVzdGluYXRpb25EaXIsIHRvTG93ZXJDYXNlID8gZW50cnkuZ2V0TmFtZSgpDQotCQkJCQkJCS50b0xvd2VyQ2FzZSgpIDogZW50cnkuZ2V0TmFtZSgpKSkubWtkaXJzKCk7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gQ3JlYXRlIGZpbGVzDQotCQkJZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOw0KLQkJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7DQotCQkJCWZpbmFsIFppcEVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOw0KLQ0KLQkJCQlpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0NCi0JCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOw0KLQkJCQlCdWZmZXJlZE91dHB1dFN0cmVhbSBidWZPdXRTdHJlYW0gPSBudWxsOw0KLQ0KLQkJCQl0cnkgew0KLQkJCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZGVzdGluYXRpb25EaXIsDQotCQkJCQkJCXRvTG93ZXJDYXNlID8gZW50cnkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkgOiBlbnRyeQ0KLQkJCQkJCQkJCS5nZXROYW1lKCkpKTsNCi0JCQkJCWJ1Zk91dFN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmb3MpOw0KLQkJCQkJY29weUlucHV0U3RyZWFtKHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpLCBidWZPdXRTdHJlYW0pOw0KLQkJCQkJZm9zLmZsdXNoKCk7DQotCQkJCQlidWZPdXRTdHJlYW0uZmx1c2goKTsNCi0JCQkJfSBmaW5hbGx5IHsNCi0JCQkJCWlmIChmb3MgIT0gbnVsbCkgew0KLQkJCQkJCWZvcy5jbG9zZSgpOw0KLQkJCQkJfQ0KLQkJCQkJaWYgKGJ1Zk91dFN0cmVhbSAhPSBudWxsKSB7DQotCQkJCQkJYnVmT3V0U3RyZWFtLmNsb3NlKCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmICh6aXBGaWxlICE9IG51bGwpIHsNCi0JCQkJemlwRmlsZS5jbG9zZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgY2hlY2tJbnB1dFBhcmFtcyhmaW5hbCBGaWxlIHppcEZpbGUsIGZpbmFsIEZpbGUgZGVzdGluYXRpb24pIHsNCi0JCS8vIENvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbSh6aXBGaWxlLCAiemlwRmlsZSIpOw0KLQkJLy8gQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGRlc3RpbmF0aW9uLCAiZGVzdGluYXRpb24iKTsNCi0JCWlmICghemlwRmlsZS5leGlzdHMoKSB8fCB6aXBGaWxlLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJIlpJUCBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGlzIGEgZGlyZWN0b3J5Iik7DQotCQl9DQotCQlpZiAoIWRlc3RpbmF0aW9uLmV4aXN0cygpIHx8ICFkZXN0aW5hdGlvbi5pc0RpcmVjdG9yeSgpKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCSJEZXN0aW5hdGlvbiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBkaXJlY3RvcnkiKTsNCi0JCX0NCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL0Fic3RyYWN0RHluYW1pY01vY2suamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svQWJzdHJhY3REeW5hbWljTW9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTMxNGIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svQWJzdHJhY3REeW5hbWljTW9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrOw0KLQ0KLWltcG9ydCBvcmcuam1vY2suY29yZS5JbnZvY2F0aW9uRGlzcGF0Y2hlcjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGlzIGVxdWl2YWxlbnQgdG8gPGM+b3JnLmptb2NrLmNvcmUuQWJzdHJhY3REeW5hbWljTW9jazwvYz4uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBjbGFzcyBpcyBwYXJhbWV0ZXJpemVkLiBJdCBleHRlbmRzIGZyb20NCi0gKiA8Yz5vcmcuam1vY2suY29yZS5BYnN0cmFjdER5bmFtaWNNb2NrPC9jPiBhbmQgaXMgdGh1cyBiYWNrd2FyZCBjb21wYXRpYmxlLg0KLSAqIA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICogDQotICogQHBhcmFtIDxUPg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdER5bmFtaWNNb2NrPFQ+IGV4dGVuZHMgb3JnLmptb2NrLmNvcmUuQWJzdHJhY3REeW5hbWljTW9jaw0KLXsNCi0NCi0JcHVibGljIEFic3RyYWN0RHluYW1pY01vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSwgU3RyaW5nIG5hbWUsIEludm9jYXRpb25EaXNwYXRjaGVyIGludm9jYXRpb25EaXNwYXRjaGVyKQ0KLQl7DQotCQlzdXBlcihtb2NrZWRUeXBlLCBuYW1lLCBpbnZvY2F0aW9uRGlzcGF0Y2hlcik7DQotCX0NCi0NCi0JcHVibGljIEFic3RyYWN0RHluYW1pY01vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSwgU3RyaW5nIG5hbWUpDQotCXsNCi0JCXN1cGVyKG1vY2tlZFR5cGUsIG5hbWUpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIENsYXNzPFQ+IGdldE1vY2tlZFR5cGUoKQ0KLQl7DQotCQlyZXR1cm4gc3VwZXIuZ2V0TW9ja2VkVHlwZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYWJzdHJhY3QgVCBwcm94eSgpOw0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL0Fic3RyYWN0TW9ja09iamVjdFRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL0Fic3RyYWN0TW9ja09iamVjdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1YzEzNjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9BYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jazsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkR5bmFtaWNNb2NrOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5Gb3JtYXR0aW5nOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5JbnZvY2F0aW9uTWF0Y2hlcjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuTW9ja09iamVjdFN1cHBvcnRUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuU3R1YjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUubWF0Y2hlci5JbnZva2VBdExlYXN0T25jZU1hdGNoZXI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLm1hdGNoZXIuSW52b2tlQXRNb3N0T25jZU1hdGNoZXI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLm1hdGNoZXIuSW52b2tlQ291bnRNYXRjaGVyOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5tYXRjaGVyLkludm9rZU9uY2VNYXRjaGVyOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5tYXRjaGVyLlRlc3RGYWlsdXJlTWF0Y2hlcjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuc3R1Yi5SZXR1cm5JdGVyYXRvclN0dWI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLnN0dWIuUmV0dXJuU3R1YjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuc3R1Yi5UaHJvd1N0dWI7DQotDQotLyoqDQotICogQW4gYWJzdHJhY3QgY2xhc3MgZnJvbSB3aGljaCBzdWItY2xhc3NpbmcgdGVzdCBjYXNlcyBjYW4gaW5oZXJpdC4gVGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIG9yZy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2Ugd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0DQotICogaWQgZG9lcyBub3QgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiB0byA8Yz5uZXdDb3JlTW9jazwvYz4gbWV0aG9kIGFuZCB0aHVzIGlzIG5vdCBhYmxlIHRvIGNyZWF0ZSBhbnkgcHJveGllcy4gVGhlIG90aGVyIG1ham9yIGRpZmZlcmVuY2UgaXMgdGhhdA0KLSAqIHRoaXMgY2xhc3MgaXMgcGFyYW1ldGVyaXplZC4gSXQgc2hvdWxkIGJlIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGZvciBzdWItY2xhc3NlcyB0aGF0IHByb3ZpZGUgc3Ryb25nbHkgdHlwZWQgbW9ja3MuIFRoaXMgY2xhc3MgYWxzbyB0YWtlIGFkdmFudGFnZSBvZg0KLSAqIHNvbWUgb2YgdGhlIGphdmEgNSBzdWdhcnMuIEZvciBleGFtcGxlICJ2YXJhcmdzIi4NCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZSBleHRlbmRzIE1vY2tPYmplY3RTdXBwb3J0VGVzdENhc2UNCi17DQotDQotCXB1YmxpYyBBYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZSgpDQotCXsNCi0JfQ0KLQ0KLQlwdWJsaWMgQWJzdHJhY3RNb2NrT2JqZWN0VGVzdENhc2UoU3RyaW5nIG5hbWUpDQotCXsNCi0JCXN1cGVyKG5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbW9jayBvYmplY3QgdGhhdCBtb2NrcyB0aGUgZ2l2ZW4gdHlwZS4gVGhlIG1vY2sgb2JqZWN0IGlzIG5hbWVkIGFmdGVyIHRoZSB0eXBlOyB0aGUgZXhhY3QgbmFtZSBpcyBjYWxjdWxhdGVkIGJ5DQotCSAqIHtAbGluayAjZGVmYXVsdE1vY2tOYW1lRm9yVHlwZX0uDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9ja2VkVHlwZQ0KLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIHRvIGJlIG1vY2tlZC4NCi0JICogQHJldHVybiBBIHtAbGluayBNb2NrfSBvYmplY3QgdGhhdCBtb2NrcyA8dmFyPm1vY2tlZFR5cGU8L3Zhcj4uDQotCSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIDxUPiBNb2NrPFQ+IG1vY2soQ2xhc3MgbW9ja2VkVHlwZSkNCi0Jew0KLQkJcmV0dXJuIG1vY2sobW9ja2VkVHlwZSwgZGVmYXVsdE1vY2tOYW1lRm9yVHlwZShtb2NrZWRUeXBlKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBtb2NrIG9iamVjdCB0aGF0IG1vY2tzIHRoZSBnaXZlbiB0eXBlIGFuZCBpcyBleHBsaWNpdGx5IGdpdmVuIGEgbmFtZS4gVGhlIG1vY2sgb2JqZWN0IGlzIG5hbWVkIGFmdGVyIHRoZSB0eXBlOyB0aGUgZXhhY3QgbmFtZSBpcw0KLQkgKiBjYWxjdWxhdGVkIGJ5IHtAbGluayAjZGVmYXVsdE1vY2tOYW1lRm9yVHlwZX0uDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9ja2VkVHlwZQ0KLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIHRvIGJlIG1vY2tlZC4NCi0JICogQHBhcmFtIHJvbGVOYW1lDQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIG1vY2sgb2JqZWN0DQotCSAqIEByZXR1cm4gQSB7QGxpbmsgTW9ja30gb2JqZWN0IHRoYXQgbW9ja3MgPHZhcj5tb2NrZWRUeXBlPC92YXI+Lg0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyA8VD4gTW9jazxUPiBtb2NrKENsYXNzIG1vY2tlZFR5cGUsIFN0cmluZyByb2xlTmFtZSkNCi0Jew0KLQkJZmluYWwgTW9jazxUPiBuZXdNb2NrID0gbmV3IE1vY2s8VD4obmV3Q29yZU1vY2sobW9ja2VkVHlwZSwgcm9sZU5hbWUpKTsNCi0JCXJlZ2lzdGVyVG9WZXJpZnkobmV3TW9jayk7DQotCQlyZXR1cm4gbmV3TW9jazsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgPFQ+IER5bmFtaWNNb2NrIG5ld0NvcmVNb2NrKENsYXNzPFQ+IG1vY2tlZFR5cGUsIFN0cmluZyByb2xlTmFtZSk7DQotDQotCS8qKg0KLQkgKiBDYWxjdWxhdGVzDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9ja2VkVHlwZQ0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRNb2NrTmFtZUZvclR5cGUoQ2xhc3M8Pz4gbW9ja2VkVHlwZSkNCi0Jew0KLQkJcmV0dXJuICJtb2NrIiArIEZvcm1hdHRpbmcuY2xhc3NTaG9ydE5hbWUobW9ja2VkVHlwZSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUoT2JqZWN0IG8pDQotCXsNCi0JCXJldHVybiBuZXcgUmV0dXJuU3R1YihvKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShib29sZWFuIHJlc3VsdCkNCi0Jew0KLQkJcmV0dXJuIHJldHVyblZhbHVlKG5ldyBCb29sZWFuKHJlc3VsdCkpOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHJldHVyblZhbHVlKGJ5dGUgcmVzdWx0KQ0KLQl7DQotCQlyZXR1cm4gcmV0dXJuVmFsdWUobmV3IEJ5dGUocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUoY2hhciByZXN1bHQpDQotCXsNCi0JCXJldHVybiByZXR1cm5WYWx1ZShuZXcgQ2hhcmFjdGVyKHJlc3VsdCkpOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHJldHVyblZhbHVlKHNob3J0IHJlc3VsdCkNCi0Jew0KLQkJcmV0dXJuIHJldHVyblZhbHVlKG5ldyBTaG9ydChyZXN1bHQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShpbnQgcmVzdWx0KQ0KLQl7DQotCQlyZXR1cm4gcmV0dXJuVmFsdWUobmV3IEludGVnZXIocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUobG9uZyByZXN1bHQpDQotCXsNCi0JCXJldHVybiByZXR1cm5WYWx1ZShuZXcgTG9uZyhyZXN1bHQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShmbG9hdCByZXN1bHQpDQotCXsNCi0JCXJldHVybiByZXR1cm5WYWx1ZShuZXcgRmxvYXQocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUoZG91YmxlIHJlc3VsdCkNCi0Jew0KLQkJcmV0dXJuIHJldHVyblZhbHVlKG5ldyBEb3VibGUocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuSXRlcmF0b3IoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFJldHVybkl0ZXJhdG9yU3R1Yihjb2xsZWN0aW9uKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5JdGVyYXRvcihPYmplY3RbXSBhcnJheSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBSZXR1cm5JdGVyYXRvclN0dWIoYXJyYXkpOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHRocm93RXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpDQotCXsNCi0JCXJldHVybiBuZXcgVGhyb3dTdHViKHRocm93YWJsZSk7DQotCX0NCi0NCi0JcHVibGljIEludm9jYXRpb25NYXRjaGVyIG9uY2UoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEludm9rZU9uY2VNYXRjaGVyKCk7DQotCX0NCi0NCi0JcHVibGljIEludm9jYXRpb25NYXRjaGVyIGF0TGVhc3RPbmNlKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBJbnZva2VBdExlYXN0T25jZU1hdGNoZXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSW52b2NhdGlvbk1hdGNoZXIgYXRNb3N0T25jZSgpDQotCXsNCi0JCXJldHVybiBuZXcgSW52b2tlQXRNb3N0T25jZU1hdGNoZXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSW52b2NhdGlvbk1hdGNoZXIgZXhhY3RseShpbnQgZXhwZWN0ZWRDb3VudCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBJbnZva2VDb3VudE1hdGNoZXIoZXhwZWN0ZWRDb3VudCk7DQotCX0NCi0NCi0JcHVibGljIEludm9jYXRpb25NYXRjaGVyIG5ldmVyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBUZXN0RmFpbHVyZU1hdGNoZXIoIm5vdCBleHBlY3RlZCIpOw0KLQl9DQotDQotCXB1YmxpYyBJbnZvY2F0aW9uTWF0Y2hlciBuZXZlcihTdHJpbmcgZXJyb3JNZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFRlc3RGYWlsdXJlTWF0Y2hlcigibm90IGV4cGVjdGVkICgiICsgZXJyb3JNZXNzYWdlICsgIikiKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNpbmNlIDEuMC4xDQotCSAqLw0KLQlwdWJsaWMgU3R1YiBvbkNvbnNlY3V0aXZlQ2FsbHMoU3R1Yi4uLiBzdHVicykNCi0Jew0KLQkJcmV0dXJuIG9uQ29uc2VjdXRpdmVDYWxscyhzdHVicyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzaW5jZSAxLjEuMA0KLQkgKi8NCi0JcHVibGljIFN0dWIgZG9BbGwoU3R1Yi4uLiBzdHVicykNCi0Jew0KLQkJcmV0dXJuIGRvQWxsKHN0dWJzKTsNCi0JfQ0KLQkNCi0JcHVibGljIENvbnN0cmFpbnQgY29sbGVjdGlvbldpdGhFbGVtZW50cyhmaW5hbCBpbnQgZXhwZWN0ZWRDb2xsZWN0aW9uU2l6ZSwgZmluYWwgT2JqZWN0Li4uIG9iamVjdHMpDQotCXsNCi0JCXJldHVybiBuZXcgQ29uc3RyYWludCgpew0KLQ0KLQkJCXB1YmxpYyBib29sZWFuIGV2YWwoT2JqZWN0IGFyZzApDQotCQkJew0KLQkJCQlmaW5hbCBDb2xsZWN0aW9uPD8+IGNvbCA9IChDb2xsZWN0aW9uPD8+KWFyZzA7DQotCQkJCWZvcihPYmplY3QgbyA6IG9iamVjdHMpDQotCQkJCXsNCi0JCQkJCWlmKCFjb2wuY29udGFpbnMobykpDQotCQkJCQl7DQotCQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlyZXR1cm4gb2JqZWN0cy5sZW5ndGggPT0gZXhwZWN0ZWRDb2xsZWN0aW9uU2l6ZTsNCi0JCQl9DQotDQotCQkJcHVibGljIFN0cmluZ0J1ZmZlciBkZXNjcmliZVRvKFN0cmluZ0J1ZmZlciBhcmcwKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGFyZzA7DQotCQkJfX07DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9Nb2NrLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL01vY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2MzYjlhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL01vY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jazsNCi0NCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuRHluYW1pY01vY2s7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIDxjPm9yZy5qbW9jay5Nb2NrPC9jPiBjbGFzcyBmcm9tIEpNb2NrLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBhIHBhcmFtZXRlcml6ZWQgKGdlbmVyaWMpIHZlcnNpb24uIFRoaXMgbWFrZXMNCi0gKiBpdCBhIGxvdCBlYXNpZXIgZm9yIHVzZSBhcyBubyBtYW51YWwgY2FzdHMgdG8gdGhlIG1vY2tlZCB0eXBlIGFyZSByZXF1aXJlZCBieSB0aGUgcHJvZ3JhbW1lci4gVGhpcyBjbGFzcyBleHRlbmRzIGZyb20gPGM+b3JnLmptb2NrLk1vY2s8L2M+IHNvIGl0cw0KLSAqIGZ1bGx5IGJhY2t3YXJkIGNvbXBhdGlibGUuDQotICogDQotICogQHNlZSBvcmcuam1vY2suTW9jaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNb2NrPFQ+IGV4dGVuZHMgb3JnLmptb2NrLk1vY2sNCi17DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IG1vY2sgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4gVGhlIG5ldyBtb2NrIGhhcyB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoaXMgbmFtZSB3aWxsIGJlIHNob3duIGJ5IGFsbCByZXBvcnRzIGNvbmNlcm5pbmcgdGhpcyBtb2NrDQotCSAqIGluc3RhbmNlLiBTdWNoIHJlcG9ydHMgYXJlIHVubWFjaGVkIGludm9jYXRpb25zIGFuZCBzbyBvbi4NCi0JICogDQotCSAqIEBwYXJhbSBtb2NrZWRUeXBlIC0NCi0JICogICAgICAgICAgICB0aGUgdHlwZSB0byBiZSBtb2NrZWQuIFRoaXMgY291bGQgYmUgZWl0aGVyIGNsYXNzIG9yIGludGVyZmFjZS4NCi0JICogQHBhcmFtIG5hbWUgLQ0KLQkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhpcyBtb2NrDQotCSAqLw0KLQlwdWJsaWMgTW9jayhDbGFzczxUPiBtb2NrZWRUeXBlLCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJc3VwZXIobW9ja2VkVHlwZSwgbmFtZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgYSBuZXcgbW9jayBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLg0KLQkgKiANCi0JICogQHBhcmFtIG1vY2tlZFR5cGUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIHRvIGJlIG1vY2tlZC4gVGhpcyBjbGFzcyBuZWVkcyB0byBiZSBlaXRoZXIgY2xhc3Mgb3IgaW50ZXJmYWNlLg0KLQkgKi8NCi0JcHVibGljIE1vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSkNCi0Jew0KLQkJc3VwZXIobW9ja2VkVHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgbmV3IE1vY2sgdGhhdCB3cmFwcyB0aGUgc3VwcGxpZWQgPGM+RHluYW1pY01vY2s8L2M+IGluc3RhbmNlLg0KLQkgKiANCi0JICogQHBhcmFtIGFyZzAgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBkeW5hbWljIG1vY2sgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBNb2NrKER5bmFtaWNNb2NrIGFyZzApDQotCXsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotDQotCS8qKg0KLQkgKiBPYnRhaW5zIHRoZSBwcm94eSBpbnN0YW5jZSBmb3IgdGhpcyBtb2NrLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgcHJveHkgaW5zdGFuY2UgZm9yIHRoaXMgbW9jay4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIFQgcHJveHkoKQ0KLQl7DQotCQlyZXR1cm4gKFQpIHN1cGVyLnByb3h5KCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9Nb2NrT2JqZWN0VGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svTW9ja09iamVjdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxMjYwNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9Nb2NrT2JqZWN0VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2s7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLnRlc3RjYXNlcy5CZWZvcmVBZnRlckVuYWJsZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2sudGVzdGNhc2VzLklCZWZvcmVBZnRlckVuYWJsZWQ7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkNvcmVNb2NrOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5EeW5hbWljTW9jazsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuVmVyaWZpYWJsZTsNCi0NCi0NCi0vKioNCi0gKiBBbiB0ZXN0IGNhc2UgYmFzZSBjbGFzcyBmb3IgbW9jayBvYmplY3RzIHRlc3QgY2FzZS4gVGhpcyBvbmUgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIG9yZy5qbW9jay5jZ2xpYi5Nb2NrT2JqZWN0VGVzdENhc2UuIFRoZXJlIGFyZSBzZXZlcmFsDQotICogaW1wb3J0YW50IGRpZmZlcmVuY2VzIHRob3VnaC4gVGhpcyB0ZXN0IGNhc2UgY2xhc3MgYXNzdW1lcyB0aGF0IHRoZSBsb2FkZXIgb2YgdGhlIHRlc3QgY2FzZSBjbGFzcyBpcyBhYmxlIHRvIGxvYWQgYm90aCB0aGUgY2xhc3MgYmVpbmcgbW9ja2VkIGFuZA0KLSAqIHRoZSBqbW9jayBjbGFzc2VzLiBUaHVzIHRlc3QgY2FzZSBjbGFzcyBsb2FkZXIgaXMgdXNlZCB0byBjcmVhdGUgdGhlIG1vY2sgdHlwZS4gVGhpcyBtb2NrIHRlc3QgY2FzZSBhbHNvIHByb3ZpZGVzIHR3byBuZXcgPGM+bW9jazwvYz4gbWV0aG9kcy4NCi0gKiBUaGVzZSBtZXRob2RzIGNhbiBpbnN0YW50aWF0ZSBhIG1vY2sgZm9yIGEgZ2l2ZW4gY2xhc3MgYnkgZXhlY3V0aW5nIHRoZSBjbGFzcydzIGNvbnN0cnVjdG9yLiBUaGUgbWV0aG9kcyA8Yz48L2M+IGFuZCA8Yz48L2M+IGluaGVyaXRlZCBmcm9tDQotICogPGM+QWJzdHJhY3RNb2NrT2JqZWN0VGVzdENhc2U8L2M+IGNyZWF0ZSBtb2NrcyB3aXRob3V0IGV4ZWN1dGluZyB0aGUgY29uc3RydWN0b3Igb2YgdGhlIG1vY2tlZCBjbGFzcy4gVGhleSB1c2UgdGhlIFNVTidzIHJlZmxlY3Rpb24gbWVjaGFuaXNtIGFuZA0KLSAqIGFyZSBhYmxlIHRvIGNyZWF0ZSBjbGFzc2VzIHdpdGhvdXQgYSB2aXNpYmxlIGRlZmF1bHQgY29uc3RydWN0b3Igb3Igd2l0aG91dCBjb25zdHJ1Y3RvciBhdCBhbGwuIFRoaXMgZnVuY3Rpb25hbGxpdHkgaG93ZXZlciBpcyBwbGF0Zm9ybSBzcGVjaWZpYy4NCi0gKiBJdCBjYW4gYmUgY29tcGlsZWQgYW5kIGV4ZWN1dGVkIG9ubHkgb24gU1VOIFZNcy4gU2hvdWxkIHRoZSBjb2RlIGJlIGV4ZWN1dGVkIG9uIGFub3RoZXIgVk0gbW9zdCBsaWtlbHkgYSA8Yz5Ob0NsYXNzRGVmRm91bmRFcnJvcjwvYz4gd2lsbCBvY3Vyci4NCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2NrT2JqZWN0VGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZSBpbXBsZW1lbnRzIElCZWZvcmVBZnRlckVuYWJsZWQNCi17DQotCXByaXZhdGUgZmluYWwgQmVmb3JlQWZ0ZXJFbmFibGVyIGJhZSA9IG5ldyBCZWZvcmVBZnRlckVuYWJsZXIodGhpcyk7DQotCXB1YmxpYyB2b2lkIGFmdGVyVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBiZWZvcmVUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHJ1bkJhcmVJbnRlcm5hbCgpIHRocm93cyBUaHJvd2FibGUNCi0Jew0KLQkJc3VwZXIucnVuQmFyZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBydW5CYXJlKCkgdGhyb3dzIFRocm93YWJsZQ0KLQl7DQotCQliYWUucnVuQmFyZSgpOw0KLQl9DQotCQ0KLQlwcml2YXRlIExpc3Q8TW9jazw/Pj4gbW9ja3NUb1ZlcmlmeSA9IG5ldyBWZWN0b3I8TW9jazw/Pj4oKTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgYSBuZXcgPGM+TW9ja09iamVjdFRlc3RDYXNlPC9jPiBpbnN0YW5jZSB3aXRoIG5vIG5hbWUNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgTW9ja09iamVjdFRlc3RDYXNlKCkNCi0Jew0KLQl9DQotDQotCXB1YmxpYyBMaXN0PE1vY2s8Pz4+IGdldE1vY2tzVG9WZXJpZnkoKQ0KLQl7DQotCQlmaW5hbCBMaXN0PE1vY2s8Pz4+IGNvcHkgPSBuZXcgQXJyYXlMaXN0PE1vY2s8Pz4+KCk7DQotCQljb3B5LmFkZEFsbChtb2Nrc1RvVmVyaWZ5KTsNCi0JCXJldHVybiBjb3B5Ow0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyVG9WZXJpZnkoVmVyaWZpYWJsZSBhcmcwKQ0KLQl7DQotCQltb2Nrc1RvVmVyaWZ5LnJlbW92ZShhcmcwKTsNCi0JCXN1cGVyLnVucmVnaXN0ZXJUb1ZlcmlmeShhcmcwKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgdmVyaWZ5KCkNCi0Jew0KLQkJbW9ja3NUb1ZlcmlmeS5jbGVhcigpOw0KLQkJc3VwZXIudmVyaWZ5KCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgYSBuZXcgPGM+TW9ja09iamVjdFRlc3RDYXNlPC9jPiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQ0KLQkgKiANCi0JICogQHBhcmFtIG5hbWUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoaXMgdGVzdCBjYXNlLg0KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZQ0KLQkgKi8NCi0JcHVibGljIE1vY2tPYmplY3RUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0Jew0KLQkJc3VwZXIobmFtZSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCA8VD4gRHluYW1pY01vY2sgbmV3Q29yZU1vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSwgU3RyaW5nIHJvbGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gbmV3IENvcmVNb2NrKG1vY2tlZFR5cGUsIHJvbGVOYW1lKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL1N0dWJVdGlscy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9TdHViVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTVhYzg3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL1N0dWJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jazsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLlN0dWI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLnN0dWIuUmV0dXJuU3R1YjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuc3R1Yi5TdHViU2VxdWVuY2U7DQotDQotLyoqDQotICogVXRpbHMgZm9yIGNyZWF0aW5nIG1vcmUgY29tcGxleCBqbW9jayBzdHVicw0KLSAqIA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICogDQotICovDQotcHVibGljIGNsYXNzIFN0dWJVdGlscw0KLXsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBzdHViIHRoYXQgd2lsbCByZXR1cm4gdGhlIHByb3h5IGZvciB0aGUgbmV4dCBtb2NrIGluIHRoZSBzdXBwbGllZCBhcnJheSBvbiBhIGNvbnNlcXV0aXZlIGNhbGwuIEkuZS4gdGhlIGZpcnN0IGNhbGwgcmV0dXJucyB0aGUgcHJveHkNCi0JICogYXQgPGM+cmV0dXJuVmFsdWVzWzBdPC9jPiwgdGhlIHNlY29uZCBjYWxsIHdpbGwgcmV0dXJuIHRoZSBwcm94eSBmb3IgdGhlIG1vY2sgYXQgPGM+cmV0dXJuVmFsdWVzWzFdPC9jPiwgYW5kIHNvIGZvcnRoDQotCSAqIA0KLQkgKiBAcGFyYW0gcmV0dXJuVmFsdWVzIC0NCi0JICogICAgICAgICAgICB0aGUgbW9ja3Mgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBvbiBjb25zZXF1dGl2ZSBjYWxscw0KLQkgKiBAcmV0dXJuIC0gYSBzdHViIHRoYXQgd2lsbCByZXR1cm4gdGhlIHByb3hpZXMgZm9yIHRoZSBzcGVjaWZpZWQgbW9ja3Mgb24gZWFjaCBjb25zZXF1dGl2ZSBjYWxsDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0dWIgb25Db25zZXF1dGl2ZUNhbGxzV2lsbFJldHVybk1vY2tzKE1vY2s8Pz5bXSByZXR1cm5WYWx1ZXMpDQotCXsNCi0JCWZpbmFsIFN0dWJbXSByZXR1cm5TdHVicyA9IG5ldyBTdHViW3JldHVyblZhbHVlcy5sZW5ndGhdOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXR1cm5WYWx1ZXMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJcmV0dXJuU3R1YnNbaV0gPSBuZXcgUmV0dXJuU3R1YihyZXR1cm5WYWx1ZXNbaV0ucHJveHkoKSk7DQotCQl9DQotCQlyZXR1cm4gbmV3IFN0dWJTZXF1ZW5jZShyZXR1cm5TdHVicyk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDb252ZXJ0cyBhbiBhcnJheSBvZiBtb2NrcyB0byBhbiBhcnJheSBvZiBwcm94aWVzIGZvciB0aGVzZSBtb2Nrcy4gQWxsIG1vY2tzIHNob3VsZCBiZSBtb2NrcyBmb3Igb25lIGFuZCB0aGUNCi0JICogc2FtZSB0eXBlLg0KLQkgKiBAcGFyYW0gPFQ+IC0gdGhlIHR5cGUgb2YgdGhlIG1vY2tlZCBjbGFzcw0KLQkgKiBAcGFyYW0gbW9ja3MgLSB0aGUgYXJyYXkgb2YgbW9ja3MgdG8gYmUgY29udmVydGVkIHRvIHByb3hpZXMNCi0JICogQHBhcmFtIHByb3hpZXMgLSBhbiBhcnJheSBvZiB0aGUgdHlwZSBvZiB0aGUgcHJveHkuIEl0IHdpbGwgYmUgdXNlZCB0byBzdG9yZSB0aGUgcHJveGllcyBmb3IgdGhlIG1vY2tzDQotCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAtIHRocm93biBpZiB0aGUgYXJyYXlzIGFyZSB3aXRoIGRpZmZlcmVudCBzaXplcy4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgbW9ja3NUb1Byb3hpZXMoTW9jazxUPltdIG1vY2tzLCBUW10gcHJveGllcykgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2Nrcy5sZW5ndGg7IGkrKykNCi0JCXsNCi0JCQlwcm94aWVzW2ldID0gbW9ja3NbaV0ucHJveHkoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMgYSByZXR1cm4gc3R1YiB0aGF0IHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIG1vY2sgcHJveGllcyBmb3IgdGhlIHN1cHBsaWVkIGFycmF5IG9mIG1vY2tzLg0KLQkgKiBAcGFyYW0gcmV0dXJuVmFsdWVzIC0gYW4gYXJyYXkgb2YgbW9ja3MsIHdob3NlIHByb3hpZXMgaGFzIHRvIGJlIHJldHVybmVkDQotCSAqIEByZXR1cm4gLSBhIHN0dWIgd2ljaCB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBwcm94aWVzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBwYXNzZWQgbW9ja3MuDQotCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAtIGlmIHRoZSB0d28gYXJyYXlzIGFyZSB3aXRoIGRpZmZlcmVudCBsZW5ndGhzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIDxUPlN0dWIgcmV0dXJuQXJyYXlPZk1vY2tzKE1vY2s8VD5bXSByZXR1cm5WYWx1ZXMsIFRbXSBwcm94aWVzKQ0KLQl7DQotCQltb2Nrc1RvUHJveGllcyhyZXR1cm5WYWx1ZXMsIHByb3hpZXMpOw0KLQkJcmV0dXJuIG5ldyBSZXR1cm5TdHViKHByb3hpZXMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgc3R1YiB0aGF0IG9uIGNvbnNlcXV0aXZlIGNhbGxzIHdpbGwgcmV0dXJuIHRoZSBuZXh0IGJvb2xlYW4gaW4gdGhlIHN1cHBsaWVkIGFycmF5IEkuZS4gdGhlIGZpcnN0IGNhbGwgcmV0dXJucyB0aGUgYm9vbGVhbiBhdA0KLQkgKiA8Yz5yZXR1cm5WYWx1ZXNbMF08L2M+LCB0aGUgc2Vjb25kIGNhbGwgd2lsbCByZXR1cm4gdGhlIGJvb2xlYW4gYXQgPGM+cmV0dXJuVmFsdWVzWzFdPC9jPiwgYW5kIHNvIGZvcnRoDQotCSAqIA0KLQkgKiBAcGFyYW0gcmV0dXJuVmFsdWVzIC0NCi0JICogICAgICAgICAgICB0aGUgYm9vbGVhbnMgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBvbiBjb25zZXF1dGl2ZSBjYWxscw0KLQkgKiBAcmV0dXJuIC0gYSBzdHViIHRoYXQgd2lsbCByZXR1cm4gdGhlIGJvb2xlYW5zIGZvciBlYWNoIGNvbnNlcXV0aXZlIGNhbGwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3R1YiBvbkNvbnNlY3V0aXZlQ2FsbHNXaWxsUmV0dXJuQm9vbGVhbihib29sZWFuW10gcmV0dXJuVmFsdWVzKQ0KLQl7DQotCQlmaW5hbCBTdHViW10gcmV0dXJuU3R1YnMgPSBuZXcgU3R1YltyZXR1cm5WYWx1ZXMubGVuZ3RoXTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmV0dXJuVmFsdWVzLmxlbmd0aDsgaSsrKQ0KLQkJew0KLQkJCXJldHVyblN0dWJzW2ldID0gbmV3IFJldHVyblN0dWIocmV0dXJuVmFsdWVzW2ldKTsNCi0JCX0NCi0JCXJldHVybiBuZXcgU3R1YlNlcXVlbmNlKHJldHVyblN0dWJzKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIDxUPiBTdHViIHJldHVybkNvbGxlY3Rpb25Db250YWluaW5nKFRbXSBjb250YWluZWQpIHsNCi0JCWZpbmFsIENvbGxlY3Rpb248VD4gY29sbCA9IG5ldyBBcnJheUxpc3Q8VD4oKTsNCi0JCWZvcihUIG8gOiBjb250YWluZWQpIHsNCi0JCQljb2xsLmFkZChvKTsNCi0JCX0NCi0JCXJldHVybiBuZXcgUmV0dXJuU3R1Yihjb2xsKTsNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyA8VD4gU3R1YiByZXR1cm5Db2xsZWN0aW9uQ29udGFpbmluZyhUIGNvbnRhaW5lZCkgew0KLQkJZmluYWwgQ29sbGVjdGlvbjxUPiBjb2xsID0gbmV3IEFycmF5TGlzdDxUPigxKTsNCi0JCWNvbGwuYWRkKGNvbnRhaW5lZCk7DQotCQlyZXR1cm4gbmV3IFJldHVyblN0dWIoY29sbCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvQmVmb3JlQWZ0ZXJFbmFibGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9CZWZvcmVBZnRlckVuYWJsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDlkMTY1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9CZWZvcmVBZnRlckVuYWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogVGhpcyBjbGFzcyBpcyBiYXNlZCBvbiB3b3JrIGJ5IFNoYXkgQmFub24gKGh0dHA6Ly93d3cua2ltY2h5Lm9yZy9iZWZvcmVfYWZ0ZXJfdGVzdGNhc2Vfd2l0aF9qdW5pdC8pDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2sudGVzdGNhc2VzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBCZWZvcmVBZnRlckVuYWJsZXIgew0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBJQmVmb3JlQWZ0ZXJFbmFibGVkIHRjOw0KLQkNCi0gICAgcHJpdmF0ZSBpbnQgdGVzdENvdW50ID0gMDsNCi0gDQotICAgIHByaXZhdGUgZmluYWwgaW50IHRvdGFsVGVzdENvdW50Ow0KLSANCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpc2FibGVBZnRlclRlc3RDYXNlID0gZmFsc2U7DQotIA0KLSAgICBwdWJsaWMgQmVmb3JlQWZ0ZXJFbmFibGVyKElCZWZvcmVBZnRlckVuYWJsZWQgdGMpIHsNCi0gICAgCXRoaXMudGMgPSB0YzsNCi0gICAgCXRvdGFsVGVzdENvdW50ID0gY291bnRUb3RhbFRlc3RzKCk7DQotICAgIH0NCi0gDQotICAgIHB1YmxpYyB2b2lkIHJ1bkJhcmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsNCi0gICAgICAgIFRocm93YWJsZSBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgaWYgKHRlc3RDb3VudCA9PSAwKSB7DQotICAgICAgICAgICAgYmVmb3JlVGVzdENhc2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRlc3RDb3VudCsrOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0Yy5ydW5CYXJlSW50ZXJuYWwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBydW5uaW5nKSB7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gcnVubmluZzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh0ZXN0Q291bnQgPT0gdG90YWxUZXN0Q291bnQpIHsNCi0gICAgICAgICAgICBpZiAoIWRpc2FibGVBZnRlclRlc3RDYXNlKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBhZnRlclRlc3RDYXNlKCk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBhZnRlclRlc3RDYXNlKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uID09IG51bGwpIGV4Y2VwdGlvbiA9IGFmdGVyVGVzdENhc2U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQWZ0ZXJUZXN0Q2FzZSA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkgdGhyb3cgZXhjZXB0aW9uOw0KLSAgICB9DQotIA0KLSAgICBwdWJsaWMgdm9pZCBkaXNhYmxlQWZ0ZXJUZXN0Q2FzZSgpIHsNCi0gICAgICAgIGRpc2FibGVBZnRlclRlc3RDYXNlID0gdHJ1ZTsNCi0gICAgfQ0KLSANCi0gICAgLyoqDQotICAgICAqIENhbGxlZCBiZWZvcmUgYW55IHRlc3RzIHdpdGhpbiB0aGlzIHRlc3QgY2FzZS4NCi0gICAgICoNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGJlZm9yZVRlc3RDYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgIAl0Yy5iZWZvcmVUZXN0Q2FzZSgpOw0KLSAgICB9DQotIA0KLSAgICAvKioNCi0gICAgICogQ2FsbGVkIGFmdGVyIGFsbCB0aGUgdGVzdHMgd2l0aGluIHRoZSB0ZXN0IGNhc2UNCi0gICAgICogaGF2ZSBleGVjdXRlZC4NCi0gICAgICoNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGFmdGVyVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgCXRjLmFmdGVyVGVzdENhc2UoKTsNCi0gICAgfQ0KLSANCi0gICAgcHJpdmF0ZSBpbnQgY291bnRUb3RhbFRlc3RzKCkgew0KLSAgICAgICAgaW50IGNvdW50ID0gMDsNCi0gICAgICAgIENsYXNzPD8+IHN1cGVyQ2xhc3MgPSB0Yy5nZXRDbGFzcygpOw0KLSAgICAgICAgVmVjdG9yPFN0cmluZz4gbmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsNCi0gICAgICAgIHdoaWxlIChUZXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc3VwZXJDbGFzcykpIHsNCi0gICAgICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gc3VwZXJDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsNCi0gICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzLmNvbnRhaW5zKG5hbWUpKQ0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIG5hbWVzLmFkZEVsZW1lbnQobmFtZSk7DQotICAgICAgICAgICAgICAgIGlmIChpc1Rlc3RNZXRob2QobWV0aG9kKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBzdXBlckNsYXNzID0gc3VwZXJDbGFzcy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY291bnQ7DQotICAgIH0NCi0gDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Rlc3RNZXRob2QoTWV0aG9kIG0pIHsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gbS5nZXROYW1lKCk7DQotICAgICAgICBDbGFzczw/PltdIHBhcmFtZXRlcnMgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7DQotICAgICAgICBDbGFzczw/PiByZXR1cm5UeXBlID0gbS5nZXRSZXR1cm5UeXBlKCk7DQotICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5sZW5ndGggPT0gMCAmJiBuYW1lLnN0YXJ0c1dpdGgoInRlc3QiKSAmJiByZXR1cm5UeXBlLmVxdWFscyhWb2lkLlRZUEUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0JlZm9yZUFmdGVyVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0JlZm9yZUFmdGVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWVhYmE3Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9CZWZvcmVBZnRlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2sudGVzdGNhc2VzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJlZm9yZUFmdGVyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIElCZWZvcmVBZnRlckVuYWJsZWQgew0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBCZWZvcmVBZnRlckVuYWJsZXIgYmZlID0gbmV3IEJlZm9yZUFmdGVyRW5hYmxlcih0aGlzKTsNCi0JDQotCXB1YmxpYyB2b2lkIHJ1bkJhcmVJbnRlcm5hbCgpIHRocm93cyBUaHJvd2FibGUgew0KLQkJc3VwZXIucnVuQmFyZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBydW5CYXJlKCkgdGhyb3dzIFRocm93YWJsZSB7DQotCQliZmUucnVuQmFyZSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0VxdWFsc1Rlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9FcXVhbHNUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZWQwZTI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0VxdWFsc1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLnRlc3RjYXNlczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIEFuIGFic3RyYWN0IHRlc3QgY2FzZSBmb3IgdGhlIDxjPk9iamVjdC5lcXVhbHMoT2JqZWN0KTwvYz4gYW5kIDxjPk9iamVjdC5oYXNoQ29kZSgpPC9jPiBtZXRob2RzLiBUaGlzIHRlc3QgY2FzZSBwZXJmb3JtcyB0aGUgdGVzdHMgZm9yIDxjPmVxdWFsczwvYz4NCi0gKiBhbmQgPGM+aGFzaENvZGU8L2M+IHNpbXVsdGFuaWVzbHkgYXMgdGhleSBhcmUgdGlnaHRseSBjb25uZWN0ZWQuIFRoZSB0ZXNjYXNlIHRlc3QgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG9mIGVxdWFscy9oYXNDb2RlOg0KLSAqIDxwPg0KLSAqIDEuIGVxdWFscyByZWZsZXhpdml0eSAyLiBlcXVhbHMgc3ltZXRyaWNpdHkgMy4gZXF1YWxzIHRyYW5zaXRpdnl0ZSA0LiBoYXNoQ29kZSBzdGF0YmlsaXR5IDUuIGhhc2hDb2RlIGltbXV0YWJpbGl0eSA2LiBlcXVhbHMgaXMgc3VpdGFibGUgZm9yDQotICogc3ViY2xhc3Nlcw0KLSAqIDwvcD4NCi0gKiANCi0gKiBUaGUgdGVzdCBjYXNlcyBpcyBhYnN0cmFjdCBhbmQgbmVlZCB0byBiZSBzdWJsY2Fzc2VkIGJ5IGNvbmNyZXRlIHRlc3QgY2FzZS4gU2V2ZXJhbCBhYnN0cmFjdCBtZXRob2RzIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgdGVzdCBjYXNlcy4NCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqIA0KLSAqIEBwYXJhbSA8VD4NCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXF1YWxzVGVzdENhc2U8VD4gZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBDbGFzczxUPiB0ZXN0Q2xhc3M7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IDxjPkVxdWFsc1Rlc3RDYXNlPC9jPiBpbnN0YW5jZSB0byB0ZXN0IHRoZSBlcXVhbHMgbWV0aG9kIG9mIHRoZSBzdXBwbGllZCBjbGFzcw0KLQkgKiANCi0JICogQHBhcmFtIHRlc3RDbGFzcyAtDQotCSAqICAgICAgICAgICAgdGhlIGNsYXNzIHdob3NlIGVxdWFscyBtZXRob2Qgd2lsbCBiZSB0ZXN0ZWQNCi0JICovDQotCXB1YmxpYyBFcXVhbHNUZXN0Q2FzZShDbGFzczxUPiB0ZXN0Q2xhc3MpDQotCXsNCi0JCXRoaXMobnVsbCwgdGVzdENsYXNzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyA8Yz5FcXVhbHNUZXN0Q2FzZTwvYz4gaW5zdGFuY2UgdG8gdGVzdCB0aGUgZXF1YWxzIG1ldGhvZCBvZiB0aGUgc3VwcGxpZWQgY2xhc3MuIFRoaXMgdGVzdCBjYXNlIGFsc28gdGFrZXMgYSBuYW1lIHBhcmFtdGVyLCB3aGljaA0KLQkgKiBpIHBhc3NlZCB0byA8Yz5UZXN0Q2FzZTwvYz4gc3VwZXIgY29uc3RydWN0b3IuIEkuZS4gdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlDQotCSAqIA0KLQkgKiBAcGFyYW0gbmFtZSAtDQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlDQotCSAqIEBwYXJhbSB0ZXN0Q2xhc3MgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBjbGFzcyB3aG9zZSBlcXVhbHMgbWV0aG9kIHdpbGwgYmUgdGVzdGVkDQotCSAqLw0KLQlwdWJsaWMgRXF1YWxzVGVzdENhc2UoU3RyaW5nIG5hbWUsIENsYXNzPFQ+IHRlc3RDbGFzcykNCi0Jew0KLQkJYXNzZXJ0Tm90TnVsbCgidGVzdCBjbGFzcyBwYXNzZWQgaW4gY29uc3RydWN0b3Igd2FzIG51bGwiLCB0ZXN0Q2xhc3MpOw0KLQkJdGhpcy50ZXN0Q2xhc3MgPSB0ZXN0Q2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIE9idGFpbnMgYSBuZXcgaXRlcmF0b3Igb2YgaW5zdGFuY2VzIGZvciB0aGUgdGVzdGVkIGNsYXNzLg0KLQkgKiANCi0JICogQHBhcmFtIGl0ZXJhdGlvbnMgLQ0KLQkgKiAgICAgICAgICAgIG51bWJlciBvZiBpdGVyYXRpb25zIGkuZSB0aGUgbnVtYmVyIG9mIHRpbWVzIG9uZSBjYW4gaW52b2tlIDxjPkl0ZXJhdG9yLm5leHQoKTwvYz4gd2l0aG91dGggZ2V0dGluZyA8Yz5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uPC9jPg0KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbg0KLQkgKiBAcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9mIGluc3RhbmNlZCBmb3IgdGhlIHRlc3RlZCBjbGFzczsNCi0JICovDQotCWFic3RyYWN0IHB1YmxpYyBJdGVyYXRvcjxUPiBuZXdPYmplY3RJdGVyYXRvcihpbnQgaXRlcmF0aW9ucyk7DQotDQotCS8qKg0KLQkgKiBPYnRhaW5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0ZWQgY2xhc3MuIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGluc3RhbmNlLCB3aGljaCBpcyBjb25zaWRlcmVkIGVxdWFsIHRvIHRoZSBpbnN0YW5jZQ0KLQkgKiByZXR1cm5lZCBieSB0aGUgcHJlZnZpb3VzIGNhbGwgYnV0IGlzIG5vdCBpZGVudGljYWwuIEZvciBleGFtcGxlIGlmIHRoZSB0ZXN0ZWQgY2xhc3Mgd2FzIDxjPlN0cmluZzwvYz4gdGhlIG1vc3Qgb2J2aW91cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzDQotCSAqIG1ldGhvZCB3b3VsZCBiZSA8Yz4NCi0JICogPHA+DQotCSAqIHJldHVybiBuZXcgU3RyaW5nKCJ0ZXN0IHN0cmluZyIpDQotCSAqIDwvcD4NCi0JICogPC9jPg0KLQkgKiANCi0JICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdCBjbGFzcyBhc3N1bWVkIHRvIGJlIGVxdWFsIHRvIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIGluc3RhbmNlcw0KLQkgKi8NCi0JYWJzdHJhY3QgcHVibGljIFQgbmV3RXF1YWxJbnN0YW5jZSgpOw0KLQ0KLQkvKioNCi0JICogT2J0YWlucyBhIG5ldyBpbnN0YW5jZSBvZiBhIHNpbmdsZSBjbGFzcywgd2hpY2ggaXMgYSBzdWJjbGFzcyBvZiB0aGUgdGVzdGVkIGNsYXNzLiBUaGUgc3ViY2xhc3MgbXVzdCBub3Qgb3ZlcnJpZGUgdGhlIDxjPmVxdWFsczwvYz4gbWV0aG9kIG9mDQotCSAqIHRoZSB0ZXN0ZWQgY2xhc3MuIEFsbCBpbnN0YW5jZXMgc2hvdWxkIGJlIGVxdWFsLiBUaGUgcmV0dXJuZWQgaW5zdGFuY2VzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHZhbHVlcyBvZiBhbGwgdGhlIGluaGVyaXRlZCBmaWVsZHMgYXMgdGhlDQotCSAqIGluc3RhbmNlcyByZXR1cmVkIGJ5IDxjPm5ld0VxdWFsSW5zdGFuY2U8L2M+DQotCSAqIA0KLQkgKiBAcmV0dXJuIHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Ygc2luZ2xlIHN1YmxjYXNzIG9mIHRoZSB0ZXN0ZWQgY2xhc3MuIEVhY2ggY2FsbCBzaG91bGQgcmV0dXJuIGFuIGluc3RhbmNlIGVxdWFsIHRvIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIGJ1dA0KLQkgKiAgICAgICAgIG5vdCBpZGVudGljYWwuIE51bGwgaWYgdGhlIHRlc3RlZCBjbGFzcyBpcyBmaW5hbA0KLQkgKi8NCi0JYWJzdHJhY3QgcHVibGljIFQgbmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlKCk7DQotDQotCS8qKg0KLQkgKiBPYnRhaW5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0aGUgdGVzdGVkIGNsYXNzLiBUaGUgc2luZ2xlIHJlc3RyaWN0aW9uIG9uIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgaXMgdGhhdCB0aGV5IHNob3VsZCBub3QgYmUgZXF1YWwgdG8gdGhlDQotCSAqIGluc3RhbmNlcyByZXR1cm5lZCBieSA8Yz5uZXdFcXVhbEluc3RhbmNlPC9jPg0KLQkgKiANCi0JICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdCBjbGFzcy4gVGhlIG5ld2x5IHJldHVybmVkIGluc3RhbmNlIGlzIG5vdCBlcXVhbCB0byB0aGUgaW5zdGFuY2VzIHJldHVybmVkIGJ5IDxjPm5ld0VxdWFsSW5zdGFuY2U8L2M+DQotCSAqLw0KLQlhYnN0cmFjdCBwdWJsaWMgVCBuZXdOb25FcXVhbEluc3RhbmNlKCk7DQotDQotCS8qKg0KLQkgKiBNb2RpZmllcyBhIGdpdmVuIGluc3RhbmNlIG9mIHRoZSB0ZXN0ZWQgY2xhc3MuIFRoZSBpbnN0YW5jZSBzaG91bGQgYmUgbW9kaWZpZWQgaW4gc3VjaCBhIHdheSB0aGF0IGl0J3Mgbm90IGVxdWFsIHRvIHRoZSBpbnN0YW5jZXMgcmV0dXJlZCBieQ0KLQkgKiA8Yz5uZXdFcXVhbEluc3RhbmNlPC9jPiBhbnMgPGM+bmV3Tm9uZUVxdWFsSW5zdGFuY2UoKTwvYz4uIElmIHRoZSB0ZXN0ZWQgY2xhc3MgaXMgaW1tdXRhYmxlIHRoZW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBiZQ0KLQkgKiBlbXB0eQ0KLQkgKiANCi0JICogQHBhcmFtIGluc3RhbmNlIC0NCi0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2UgdG8gYmUgbW9kaWZpZWQuDQotCSAqLw0KLQlhYnN0cmFjdCBwdWJsaWMgdm9pZCBtb2RpZnlPYmplY3RJbnN0YW5jZShUIGluc3RhbmNlKTsNCi0NCi0JLyoqDQotCSAqIE9idGFpbnMgdGhlIG51bWJlciBvZiBjb21wYXJpc29ucyB0aGF0IHdpbGwgYmUgbWFkZSBmb3IgdGhlIHJlZmxleGl2aXR5IHRlc3QuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3NlcyB0byBzcGVjaWZ5IGEgZGlmZmVyZW50DQotCSAqIHZhbHVlLiBCeSBkZWZhdWx0IHRoaXMgbnVtYmVyIGlzIDEwMC4NCi0JICogDQotCSAqIEByZXR1cm4gLSB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIHRoYXQgd2lsbCBiZSBtYWRlIGZvciB0aGUgcmVmbGV4aXZpdHkgdGVzdC4NCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0SXRlcmF0aW9uc0ZvclJlZmxpeGl2aXR5VGVzdCgpDQotCXsNCi0JCXJldHVybiAxMDA7DQotCX0NCi0NCi0JLyoqDQotCSAqIE9iYXRhaW5zIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgdGhhdCB3aWxsIGJlIG1hZGUgZm9yIHRoZSBzeW1pdHJpY2l0eSB0ZXN0LiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGUgYnkgc3ViY2xhc3NlcyB0byBzcGVjaWZ5IGEgZGlmZmVyZW50DQotCSAqIHZhbHVlLiBCeSBkZWZhdWx0IHRoaXMgbnVtYmVyIGlzIDEwMDANCi0JICogDQotCSAqIEByZXR1cm4gLSB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIHRoYXQgd2lsbCBiZSBtYWRlIGZvciB0aGUgcmVmbGl4aXZpdHkgdGVzdC4NCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0SXRlcmF0aW9uc0ZvclN5bWV0cmljaXR5VGVzdCgpDQotCXsNCi0JCXJldHVybiAxMDAwOw0KLQl9DQotDQotCS8qKg0KLQkgKiBPYmF0YWlucyB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIHRoYXQgd2lsbCBiZSBtYWRlIGZvciB0aGUgdHJhbnNpdGl2aXR5IHRlc3QuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZSBieSBzdWJjbGFzc2VzIHRvIHNwZWNpZnkgYQ0KLQkgKiBkaWZmZXJlbnQgdmFsdWUuIEJ5IGRlZmF1bHQgdGhpcyBudW1iZXIgaXMgMjAwMA0KLQkgKiANCi0JICogQHJldHVybiAtIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgdGhhdCB3aWxsIGJlIG1hZGUgZm9yIHRoZSB0cmFuc2l0aXZpdHkgdGVzdC4NCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0SXRlcmF0aW9uc0ZvclRyYW5zaXRpdml0eVRlc3QoKQ0KLQl7DQotCQlyZXR1cm4gMjAwMDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCBlcXVhbHMgaXMgcmVmbGV4aXZlLiBJdCBlbmZvcmNlcyB0aGUgcnVsZSBhLmVxdWFscyhhKSA9PSB0cnVlLiBUaGlzIHRlc3QgYWxzbyB0ZXN0cyB0aGF0IGhhc2hDb2RlIGZ1bmN0aW9uIGlzIHN0YWJsZSgpLiBJLmUuDQotCSAqIGhhc2hDb2RlIGRvZXNuJ3QgY2hhbmdlIGl0J3MgdmFsdWUgYmV0d2VlbiBzZXZlcmFsIGludm9jYXRpb25zLCBhcyB3ZWxsIGFzIHRoYXQgaGFzaENvZGUgaXMgaW1tdXRhYmxlIG92ZXIgb2JqZWN0IGNoYW5nZS4gVGhlIHRlc3Qgc3RyYXRlZ3kgaXMNCi0JICogdG8gY3JlYXRlIGFuIG5ldyBvYmplY3QgaXRlcmF0b3IgYW5kIHRoZW4gZm9yIGVhY2ggcmV0dXJuZWQgaW5zdGFuY2U6DQotCSAqIA0KLQkgKiA8b2w+DQotCSAqIDxsaT5Db21wYXJlIGl0IHdpdGggaXRzZWxmPC9saT4NCi0JICogPGxpPmNoZWNrIHRoYXQgaXRzIGhhc2ggY29kZSBzdGF5cyB0aGUgc2FtZTwvbGk+DQotCSAqIDxsaT5tb2RpZnkgdGhlIHJldHVybmVkIGluc3RhbmNlIGJ5IGNhbGxpbmcgPGM+bW9kaWZ5SW5zdGFuY2U8L2M+IGFuZCB0aGVuIGNoZWNrIHRoZSBoYXNoQ29kZSBhZ2FpbjwvbGk+DQotCSAqIDwvb2w+DQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEVxdWxzUmVmbGV4aXZlKCkNCi0Jew0KLQkJZmluYWwgaW50IGl0ZXJhdGlvbnNGb3JUaGlzVGVzdCA9IGdldEl0ZXJhdGlvbnNGb3JSZWZsaXhpdml0eVRlc3QoKTsNCi0JCWZpbmFsIEl0ZXJhdG9yPFQ+IG9iamVjdFRpdGVyYXRvciA9IG5ld09iamVjdEl0ZXJhdG9yKGl0ZXJhdGlvbnNGb3JUaGlzVGVzdCk7DQotCQl3aGlsZSAob2JqZWN0VGl0ZXJhdG9yLmhhc05leHQoKSkNCi0JCXsNCi0JCQlmaW5hbCBUIG9iamVjdFQgPSBvYmplY3RUaXRlcmF0b3IubmV4dCgpOw0KLQkJCWFzc2VydFRydWUoImVxdWFscyBpcyBub3QgcmVmbGV4aXZlIiwgb2JqZWN0VC5lcXVhbHMob2JqZWN0VCkpOw0KLQkJCWZpbmFsIGludCBpbml0aWFsSGFzaENvZGUgPSBvYmplY3RULmhhc2hDb2RlKCk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zRm9yVGhpc1Rlc3Q7IGkrKykNCi0JCQl7DQotCQkJCWFzc2VydEVxdWFscygiaGFzaENvZGUgaXMgbm90IHN0YWJsZSB1cG9uIG11bHRpcGxlIGNhbGxzIiwgaW5pdGlhbEhhc2hDb2RlLCBvYmplY3RULmhhc2hDb2RlKCkpOw0KLQkJCX0NCi0JCQltb2RpZnlPYmplY3RJbnN0YW5jZShvYmplY3RUKTsNCi0JCQlhc3NlcnRFcXVhbHMoImhhc2hDb2RlIGlzIG5vdCBzdGFibGUgdXBvbiBtb2RpZmljYXRpb24gb2YgdGhlIG9iamVjdCIsIGluaXRpYWxIYXNoQ29kZSwgb2JqZWN0VC5oYXNoQ29kZSgpKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCBlcXVhbHMgaXMgc3ltZXRyaWMgaS5lLiBhLmVxdWFscyhiKSA8PT0+IGIuZXF1YWxzKGEpLiBUaGlzIG1ldGhvZCBhbHNvIHRlc3RzIHRoYXQgaGFzaENvZGUgYmVoYXZlcyBjb3JyZWN0bHkgaW4gc2Vuc2UgYS5xdWFscyhiKSA9Pg0KLQkgKiBhLmhhc2hDb2RlKCkgPT0gYi5oYXNoQ29kZSgpLiBUaGlzIHRlc3QgdXNlcyB0d28gb2JqZWN0IGl0ZXJhdG9ycy4gT25lIGZvciBhIGFuZCBvbmUgZm9yIGIsIHdoZXJlIGEgYW5kIGIgYXJlIGZyb20gdGhlIGFib3ZlIHJ1bGUuIEVhY2ggb2YNCi0JICogdGhlc2UgaXRlcmF0b3JzIGFyZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRoaXMgbWV0aG9kIGFsc28gY2hlY2tzIHRoYXQgd2hlbmV2ZXIgdHdvIGluc3RhbmNlcyByZXR1cm5lZCBieSB0aGUgdHdvDQotCSAqIGl0ZXJhdG9ycyBhcmUgZXF1YWwgdGhlbiB0aGVpciBoYXNjb2RlIGlzIGVxdWFsLg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNTeW1ldHJpYygpDQotCXsNCi0JCWZpbmFsIGludCBpdGVyYXRpb25zRm9yVGhpc1Rlc3QgPSBnZXRJdGVyYXRpb25zRm9yU3ltZXRyaWNpdHlUZXN0KCk7DQotCQlmaW5hbCBJdGVyYXRvcjxUPiBvYmplY3RUSXRlcmF0b3IxID0gbmV3T2JqZWN0SXRlcmF0b3IoaXRlcmF0aW9uc0ZvclRoaXNUZXN0KTsNCi0JCWZpbmFsIEl0ZXJhdG9yPFQ+IG9iamVjdFRJdGVyYXRvcjIgPSBuZXdPYmplY3RJdGVyYXRvcihpdGVyYXRpb25zRm9yVGhpc1Rlc3QpOw0KLQkJd2hpbGUgKG9iamVjdFRJdGVyYXRvcjEuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoIlRoZSB0d28gb2JqZWN0IGl0ZXJhdG9ycyBkb24ndCBoYXZlIGVxdWFsIG51bWJlciBvZiBvYmplY3RzIiwgb2JqZWN0VEl0ZXJhdG9yMi5oYXNOZXh0KCkpOw0KLQkJCWZpbmFsIFQgb2JqZWN0VDEgPSBvYmplY3RUSXRlcmF0b3IxLm5leHQoKTsNCi0JCQlmaW5hbCBUIG9iamVjdFQyID0gb2JqZWN0VEl0ZXJhdG9yMi5uZXh0KCk7DQotCQkJaWYgKG9iamVjdFQxLmVxdWFscyhvYmplY3RUMikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKCJFcXVhbHMgaXMgbm90IHN5bWV0cmljIiwgb2JqZWN0VDIuZXF1YWxzKG9iamVjdFQxKSk7DQotCQkJCWFzc2VydFRydWUoIkhhc2hjb2RlIGlzIG5vdCB0aGUgc2FtZSBmb3IgZXF1YWwgaW5zdGFuY2VzIiwgb2JqZWN0VDEuaGFzaENvZGUoKSA9PSBvYmplY3RUMi5oYXNoQ29kZSgpKTsNCi0JCQl9IGVsc2UgaWYgKG9iamVjdFQyLmVxdWFscyhvYmplY3RUMSkpDQotCQkJew0KLQkJCQlmYWlsKCJFcXVhbHMgaXMgbm90IHN5bWV0cmljIik7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IGVxdWFscyBpcyB0cmFuc2l0aXZlIGkuZS4gYS5lcXVhbHMoYikgJiBiLmVxdWFscyhjKSA9PiBhLmVxdWFscyhjKS4gVGhpcyB0ZXN0IHVzZXMgdGhyZWUgb2JqZWN0IGl0ZXJhdG9ycy4gT25lIGZvciBhLCBvbmUgZm9yIGIsIGFuZA0KLQkgKiBvbmUgZm9yIGMsIHdoZXJlIGEsYixjIGFyZSBmcm9tIHRoZSBhYm92ZSBydWxlLiBFYWNoIG9mIHRoZXNlIGl0ZXJhdG9ycyBhcmUgaW5zdGFudGlhdGVkIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc1RyYW5zaXRpdmUoKQ0KLQl7DQotCQlmaW5hbCBpbnQgaXRlcmF0aW9uc0ZvclRoaXNUZXN0ID0gZ2V0SXRlcmF0aW9uc0ZvclRyYW5zaXRpdml0eVRlc3QoKTsNCi0JCWZpbmFsIEl0ZXJhdG9yPFQ+IG9iamVjdFRJdGVyYXRvcjEgPSBuZXdPYmplY3RJdGVyYXRvcihpdGVyYXRpb25zRm9yVGhpc1Rlc3QpOw0KLQkJZmluYWwgSXRlcmF0b3I8VD4gb2JqZWN0VEl0ZXJhdG9yMiA9IG5ld09iamVjdEl0ZXJhdG9yKGl0ZXJhdGlvbnNGb3JUaGlzVGVzdCk7DQotCQlmaW5hbCBJdGVyYXRvcjxUPiBvYmplY3RUSXRlcmF0b3IzID0gbmV3T2JqZWN0SXRlcmF0b3IoaXRlcmF0aW9uc0ZvclRoaXNUZXN0KTsNCi0NCi0JCXdoaWxlIChvYmplY3RUSXRlcmF0b3IxLmhhc05leHQoKSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKCJUaGUgdGhyZWUgb2JqZWN0IGl0ZXJhdG9ycyBkb24ndCBoYXZlIGVxdWFsIG51bWJlciBvZiBvYmplY3RzIiwgb2JqZWN0VEl0ZXJhdG9yMi5oYXNOZXh0KCkpOw0KLQkJCWFzc2VydFRydWUoIlRoZSB0aHJlZSBvYmplY3QgaXRlcmF0b3JzIGRvbid0IGhhdmUgZXF1YWwgbnVtYmVyIG9mIG9iamVjdHMiLCBvYmplY3RUSXRlcmF0b3IzLmhhc05leHQoKSk7DQotCQkJZmluYWwgVCBvYmplY3RUMSA9IG9iamVjdFRJdGVyYXRvcjEubmV4dCgpOw0KLQkJCWZpbmFsIFQgb2JqZWN0VDIgPSBvYmplY3RUSXRlcmF0b3IyLm5leHQoKTsNCi0JCQlmaW5hbCBUIG9iamVjdFQzID0gb2JqZWN0VEl0ZXJhdG9yMy5uZXh0KCk7DQotDQotCQkJaWYgKG9iamVjdFQxLmVxdWFscyhvYmplY3RUMikgJiYgb2JqZWN0VDEuZXF1YWxzKG9iamVjdFQzKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoImVxdWFscyBpcyBub3QgdHJhbnNpdGl2ZSIsIG9iamVjdFQyLmVxdWFscyhvYmplY3RUMykpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCA8Yz5lcXVhbDwvYz4gcmV0dXJucyBmYWxzZSBpZiA8Yz5udWxsPC9jPiBpcyBwYXNzZWQgYXMgYXJndW1lbnQNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzUmV0dXJuc0ZhbHNlSWZOdWxsUGFzc2VkKCkNCi0Jew0KLQkJZmluYWwgVCBvYmplY3RUID0gdGhpcy5uZXdFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlhc3NlcnRGYWxzZSgiZXF1YWxzIHJldHVybmVkIHRydWUgd2hlbiBudWxsIHBhc3NlZCBmb3Igb3RoZXIgb2JqZWN0Iiwgb2JqZWN0VC5lcXVhbHMobnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IDxjPmVxdWFsPC9jPiByZXR1cm5zIGZhbHNlIGlmIGEgbm9uLWVxdWFsIG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuIFRoZSB0d28gbm9uIGVxdWFsIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBieSBjYWxsaW5nDQotCSAqIDxjPm5ld0VxdWFsSW5zdGFuY2U8L2M+IGFuZCA8Yz4gbmV3Tm9uRXF1YWxJbnN0YW5jZTwvYz4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzUmV0dXJuc0ZhbHNlT25Ob25FcXVhbHMoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQxID0gdGhpcy5uZXdFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlmaW5hbCBUIG9iamVjdFQyID0gdGhpcy5uZXdOb25FcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlhc3NlcnRUcnVlKCJFcXVhbHMgcmVwb3J0ZWQgdHJ1ZSBmb3IgaW5zdGFuY2VzIGFzc3VtZWQgbm9uIGVxdWFsLiIsICFvYmplY3RUMS5lcXVhbHMob2JqZWN0VDIpICYmICFvYmplY3RUMi5lcXVhbHMob2JqZWN0VDEpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCA8Yz5lcXVhbDwvY0wgcmV0dXJucyB0cnVlIGlmIGFuIGVxdWFsIG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuIFRoZSBpbnN0YW5jZXMgdGhhdCBhcmUgY29tcGFyZWQgYXJlIG9idGFpbmVkIGJ5IHR3bw0KLQkgKiBjb25zZWN1dGl2ZSBjYWxscyB0byA8Yz5uZXdFcXVhbEluc3RhbmNlPC9jPg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNSZXR1cm5zVHJ1ZU9uRXF1YWxzKCkNCi0Jew0KLQkJZmluYWwgVCBvYmplY3RUMSA9IHRoaXMubmV3RXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpOw0KLQkJZmluYWwgVCBvYmplY3RUMiA9IHRoaXMubmV3RXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpOw0KLQkJYXNzZXJ0VHJ1ZSgiRXF1YWxzIHJlcG9ydGVkIGZhbHNlIGZvciBpbnN0YW5jZXMgYXNzdW1lZCBlcXVhbC4iLCBvYmplY3RUMS5lcXVhbHMob2JqZWN0VDIpICYmIG9iamVjdFQyLmVxdWFscyhvYmplY3RUMSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IGVxdWFscyByZXR1cm5zIGZhbHNlIGlmIGFuIG9iamVjdCBvZiBhbm90aGVyIGNsYXNzIGlzIHBhc3NlZC4gSW4gY2FzZSB0aGF0IHRoZSB0ZXN0ZWQgY2xhc3MgaXMgbm90IGZpbmFsIHRoaXMgdGVzdCBwYXNzZXMgYSBzdWJjbGFzcw0KLQkgKiBvZiB0aGUgdGVzdCBjbGFzcyBhcyBhbiBhcmd1bWVudCB0byA8Yz5lcXVhbHM8L2M+LiBUaGUgcGFzc2VkIGFuY2VzdG9yIG9iamVjdCBoYXMgdGhlIHNhbWUgdmFsdWUgZm9yIGFsbCBpdHMgZmllbGQuIFRoaXMgaXMgaW50ZW5kZWQgdG8gY2FodGNoDQotCSAqIHdyb25nIGltcGxlbWVudGF0aW9ucyB1c2luZyAiaW5zdGFuY2VvZiIgcmF0aGVyIHRoYW4gPGM+Z2V0Q2xhc3MoKSA9PSBvdGhlci5nZXRDbGFzcygpPC9jPg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNSZXR1cm5zRmFsc2VJZk90aGVyQ2xhc3NQYXNzZWQoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQgPSBuZXdFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlPYmplY3Qgb2JqZWN0ID0gbmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlpZiAob2JqZWN0ID09IG51bGwpDQotCQl7DQotCQkJLy8gY2xhc3MgaXMgZmluYWwuIE5vIGFuY2VzdG9yIGNvdWxkIGJlIGNyZWF0ZWQuIFVzZSBzb21lIG90aGVyIGNsYXNzLg0KLQkJCW9iamVjdCA9IG5ldyBPYmplY3QoKTsNCi0JCX0NCi0JCWFzc2VydEZhbHNlKCJlcXVhbHMgcmV0dXJuZWQgdHJ1ZSB3aGVuIG9iamVjdCBvZiBhbm90aGVyIHR5cGUgcGFzc2VkIiwgb2JqZWN0VC5lcXVhbHMob2JqZWN0KSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRlc3RzIHRoYXQgPGM+ZXF1YWxzPC9jPiBpcyBwcm9wZXJseSBpbXBsZW1lbnRlZCBmb3IgdXNlIGluIHN1YmNsYXNzZXMuIEl0IHRha2VzIHR3byBlcXVhbCBhbmNlc3RvciBpbnN0YW5jZXMgYW5kIGNvbXBhcmVzIHRoZW0gZm9yIGVxdWFsaXR5Lg0KLQkgKiBTaW5jZSB0aGUgYW5jZXN0b3IgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGVxdWFscyBtZXRob2QuIFRoZSB0ZXN0cyBhc3NlcnRzIHRoYXQgZXF1YWxzIHNob3VsZCByZXR1cm4gdHJ1ZS4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzU3VpdGFibGVGb3JBbmNlc3RvcnMoKQ0KLQl7DQotCQlmaW5hbCBUIGFuY2VzdG9yVDEgPSBuZXdBbmNlc3RvckVxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKTsNCi0JCWZpbmFsIFQgYW5jZXN0b3JUMiA9IG5ld0FuY2VzdG9yRXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpOw0KLQkJaWYgKGFuY2VzdG9yVDEgPT0gbnVsbCkNCi0JCXsNCi0JCQlhc3NlcnROdWxsKA0KLQkJCQkJCQkJCQkJIlRoZSBuZXdBbmNlc3Rvckluc3RhbmNlKCkgbWV0aG9kIHJldHVybmVkIG51bGwgb24gdGhlIHNlY29uZCBpbnZvY2F0aW9uLCB3aGlsZSBpdCByZXR1cm4gYSB2YWx1ZSBkaWZmZXJldCB0aGFuIG51bGwgZnJvbSB0aGUgZmlyc3QiLA0KLQkJCQkJCQkJCQkJYW5jZXN0b3JUMik7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJYXNzZXJ0VHJ1ZShhbmNlc3RvclQxLmVxdWFscyhhbmNlc3RvclQyKSAmJiBhbmNlc3RvclQyLmVxdWFscyhhbmNlc3RvclQxKSk7DQotDQotCX0NCi0NCi0JcHJpdmF0ZSBUIG5ld0FuY2VzdG9yRXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpDQotCXsNCi0JCWZpbmFsIFQgYW5jZXN0b3JUID0gbmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlKCk7DQotCQlpZiAoYW5jZXN0b3JUID09IG51bGwpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSgibmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlIHJldHVybmVkIG51bGwsIGFsdGhvdWdoIHRoZSB0ZXN0IGNsYXNzICIsIE1vZGlmaWVyLmlzRmluYWwodGVzdENsYXNzLmdldE1vZGlmaWVycygpKSk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKCJuZXdBbmNlc3RvckVxdWFsSW5zdGFuY2UgcmV0dXJuZWQgb2JqZWN0IG9mIGNsYXNzICIgKyBhbmNlc3RvclQuZ2V0Q2xhc3MoKSArICIsIHdoaWNoIGlzIG5vdCBzdWJ0eXBlIG9mICINCi0JCQkJCQkJCQkJCSsgdGVzdENsYXNzLmdldE5hbWUoKSwgdGVzdENsYXNzLmlzQXNzaWduYWJsZUZyb20oYW5jZXN0b3JULmdldENsYXNzKCkpKTsNCi0JCX0NCi0JCXJldHVybiBhbmNlc3RvclQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBUIG5ld0VxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQgPSBuZXdFcXVhbEluc3RhbmNlKCk7DQotCQlhc3NlcnRUcnVlKCJuZXdFcXVhbEluc3RhbmNlIHJldHVybmVkIG9iamVjdCBvZiBjbGFzcyAiICsgb2JqZWN0VC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJFeHBlY3RlZCB3YXMgY2xhc3MgIiArIHRlc3RDbGFzcy5nZXROYW1lKCksDQotCQkJCQkJCQkJCXRlc3RDbGFzcyA9PSBvYmplY3RULmdldENsYXNzKCkpOw0KLQkJcmV0dXJuIG9iamVjdFQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBUIG5ld05vbkVxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQgPSBuZXdOb25FcXVhbEluc3RhbmNlKCk7DQotCQlhc3NlcnRUcnVlKCJuZXdOb25FcXVhbEluc3RhbmNlIHJldHVybmVkIG9iamVjdCBvZiBjbGFzcyAiICsgb2JqZWN0VC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJFeHBlY3RlZCB3YXMgY2xhc3MgIiArIHRlc3RDbGFzcy5nZXROYW1lKCksDQotCQkJCQkJCQkJCXRlc3RDbGFzcyA9PSBvYmplY3RULmdldENsYXNzKCkpOw0KLQkJcmV0dXJuIG9iamVjdFQ7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvSUJlZm9yZUFmdGVyRW5hYmxlZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvSUJlZm9yZUFmdGVyRW5hYmxlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTE1ZWVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0lCZWZvcmVBZnRlckVuYWJsZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay50ZXN0Y2FzZXM7DQotDQotcHVibGljIGludGVyZmFjZSBJQmVmb3JlQWZ0ZXJFbmFibGVkIHsNCi0NCi0JcHVibGljIHZvaWQgYmVmb3JlVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uOw0KLQkNCi0JcHVibGljIHZvaWQgYWZ0ZXJUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb247DQotCQ0KLQlwdWJsaWMgdm9pZCBydW5CYXJlSW50ZXJuYWwoKSB0aHJvd3MgVGhyb3dhYmxlOw0KLQkNCi0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam9icy9Kb2JVdGlscy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qb2JzL0pvYlV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1ZTIwOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qb2JzL0pvYlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmpvYnM7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guVHlwZU5hbWVSZXF1ZXN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMudGhyZWFkaW5nLlRlc3RDb250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotDQotcHVibGljIGNsYXNzIEpvYlV0aWxzDQotew0KLQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckpvYnNJbnRlcnJ1cHRhYmxlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uDQotCXsNCi0JCXdoaWxlIChQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudEpvYigpICE9IG51bGwpDQotCQl7DQotCQkJZGVsYXkoNSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JKb2JzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl3YWl0Rm9yRHVtbXlKb2IoSm9iLklOVEVSQUNUSVZFKTsNCi0JCQ0KLQkJd2hpbGUgKHRydWUpDQotCQl7DQotCQkJdHJ5DQotCQkJew0KLQkJCQl3YWl0Rm9ySm9ic0ludGVycnVwdGFibGUoKTsNCi0JCQkJYnJlYWs7DQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpDQotCQkJew0KLQ0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIGkwMzY1MDkgYWRkZWQgY291c2Ugd2FpdGluZyBmb3Igam9icyBpcyBub3QgZW5vdWdodA0KLQkJd2FpdEZvckluZGV4ZXIoKTsNCi0JCQ0KLQkJLy8gRm9yY2Ugbm90aWZpY2F0aW9ucw0KLQkJd2FpdEZvck5vdGlmaWNhdGlvbnMoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsYXkoZmluYWwgbG9uZyBtaWxsaXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQl7DQotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsNCi0JCS8vIGlmIHRoaXMgaXMgdGhlIFVJIHRocmVhZCwgdGhlbiBwcm9jZXNzIHRoZSBpbnB1dA0KLQkJaWYgKGRpc3BsYXkgIT0gbnVsbCkNCi0JCXsNCi0JCQlmaW5hbCBsb25nIGVudFRpbWVNaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIG1pbGxpczsNCi0JCQl3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBlbnRUaW1lTWlsbGlzKQ0KLQkJCXsNCi0JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQ0KLQkJCQl7DQotCQkJCQlkaXNwbGF5LnNsZWVwKCk7DQotCQkJCX0NCi0JCQl9DQotCQkJZGlzcGxheS51cGRhdGUoKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCVRocmVhZC5zbGVlcCgxMDAwKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JJbmRleGVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoQWxsVHlwZU5hbWVzKG51bGwsU2VhcmNoUGF0dGVybi5SX0VYQUNUX01BVENILCBudWxsLCANCi0JCQkJU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFLCBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUywgU2VhcmNoRW5naW5lDQotCQkJCQkJCQkJCQkJCQkJCQkJLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50WzBdKSwgbmV3IFR5cGVOYW1lUmVxdWVzdG9yKCkNCi0JCQkJCQkJCQkJew0KLQkJCQkJCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBhY2NlcHRDbGFzcyhjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLA0KLQkJCQkJCQkJCQkJCQkJCQkJCQlTdHJpbmcgcGF0aCkNCi0JCQkJCQkJCQkJCXsNCi0JCQkJCQkJCQkJCX0NCi0JCQkJCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KLQkJCQkJCQkJCQkJcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsDQotCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZyBwYXRoKQ0KLQkJCQkJCQkJCQkJew0KLQkJCQkJCQkJCQkJfQ0KLQkJCQkJCQkJCQl9LCBJSmF2YVNlYXJjaENvbnN0YW50cy5XQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCwgbnVsbCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBTY2hlZHVsZSBhIGR1bW15IGpvYiB3aXRoIHRoZSBwcmlvcml0eSBzcGVjaWZpZWQgYW5kIHdhaXQgZm9yIGl0IGlzIGRvbmUNCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgd2FpdEZvckR1bW15Sm9iKGZpbmFsIGludCBwcmlvcml0eSkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJd2FpdEZvckR1bW15Sm9iV2l0aFByaW8ocHJpb3JpdHkpOw0KLQkJfQ0KLQkJY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQkNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Rm9yRHVtbXlKb2JXaXRoUHJpbyhmaW5hbCBpbnQgcHJpbykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uDQotCXsNCi0JCUpvYiBteUR1bW15Sm9iID0gbmV3IEpvYigiRFVNTVkiKXsNCi0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQkJfX07DQotCQkJDQotCQlteUR1bW15Sm9iLnNldFByaW9yaXR5KHByaW8pOw0KLQkJbXlEdW1teUpvYi5zZXRVc2VyKGZhbHNlKTsNCi0JCW15RHVtbXlKb2Iuc2NoZWR1bGUoKTsNCi0JCQ0KLQkJbXlEdW1teUpvYi5qb2luKCk7DQotCX0NCi0JDQotCQ0KLQkvKioNCi0JICogRm9yY2VzIGRlbGl2ZXJpbmcgb2Ygbm90aWZpY2F0aW9uIGV2ZW50cy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QgaXMgImluc3BpcmVkIiBieSBOb3RpZmljYXRpb25NYW5hZ2VyJ3Mgbm90aWZpY2F0aW9uIGpvYg0KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Rm9yTm90aWZpY2F0aW9ucygpDQotCXsNCi0JCWZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOw0KLQkJZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIGR1bW15UnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCl7DQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JCQl7DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJZmluYWwgSm9iIG5vdGlmRm9yY2luZ0pvYiA9IG5ldyBKb2IoIkRlbGl2ZXJpbmcgbm90aWZpY2F0aW9ucy4uLiIpew0KLQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJew0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJd29ya3NwYWNlLnJ1bihkdW1teVJ1bm5hYmxlLCBudWxsLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCk7DQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRGVidWcoIGUuZ2V0TWVzc2FnZSgpLCBlICk7DQotCQkJCX0NCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQkJfX07DQotCQkNCi0JCXN5bmNFeGVjSm9iKG5vdGlmRm9yY2luZ0pvYiwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckpvYnNTbG93KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl3YWl0Rm9ySm9icygpOw0KLQkJd2FpdEZvckR1bW15Sm9iKEpvYi5ERUNPUkFURSk7DQotCQkNCi0JCXdhaXRGb3JFdmVudExvb3AoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdhaXRGb3JFdmVudExvb3AoKQ0KLQl7DQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsNCi0JCQ0KLQkJZmluYWwgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKXsNCi0NCi0JCQlwdWJsaWMgdm9pZCBydW4oKQ0KLQkJCXsNCi0JCQkJLy8gTGV0IHRoZSBkaXNwbGF5IHByb2Nlc3MgdGhlIGV2ZW50cyBpbiBpdHMgcXVldWUNCi0JCQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7fTsNCi0JCQl9fTsNCi0JCQ0KLQkJaWYoRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkNCi0JCXsNCi0JCQlydW5uYWJsZS5ydW4oKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlkaXNwbGF5LnN5bmNFeGVjKHJ1bm5hYmxlKTsNCi0JCX0NCi0JCQkNCi0JfQ0KLQ0KLQkvKioNCi0JICogRXhlY3V0ZXMgc3luY2hyb25vdXNseSAoc2NoZWR1bGVzIGFuZCBqb2lucykgdGhlIGpvYiBzcGVjaWZpZWQuPGJyPg0KLQkgKiBJZiB0aGUgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQsIHRoZSBqb2IgaXMgc2NoZWR1bGVkIGFuZCBqb2luZWQgaW4gYSBtb2RhbCBjb250ZXh0IHRocmVhZCB0aHVzIGxldHRpbmcgdGhlIGV2ZW50IGxvb3AgcHJvY2VzcyBhc3luY2hyb25vdXMgZXZlbnRzPGJyPg0KLQkgKiBJZiB0aGUgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIGEgd29ya2VyIHRocmVhZCwgdGhlIGpvYiBpcyBzY2hlZHVsZWQgYW5kIGpvaW5lZCBpbiB0aGUgY2FsbGVyIHRocmVhZC4NCi0JICogDQotCSAqIEBwYXJhbSBqb2INCi0JICogQHBhcmFtIGRpc3BsYXkNCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgc3luY0V4ZWNKb2IoZmluYWwgSm9iIGpvYiwgZmluYWwgRGlzcGxheSBkaXNwbGF5KQ0KLQl7DQotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkNCi0JCXsNCi0NCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0JCQl7DQotCQkJCWpvYi5zY2hlZHVsZSgpOw0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJam9iLmpvaW4oKTsNCi0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfTsNCi0JCXRyeQ0KLQkJew0KLQkJCVRlc3RDb250ZXh0LnJ1bihydW5uYWJsZSwgRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgZGlzcGxheSk7DQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyKCkubG9nRGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dEZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvQ2xhc3NMb2FkaW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L0NsYXNzTG9hZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWI2NDIwMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvQ2xhc3NMb2FkaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBFeHRlbmRzIHtAbGluayBQcm9qZWN0QmFzZWRUZXN0fSBieSBhZGRpbmcgZmluY3Rpb25hbGl0aWVzIHRvIGNyZWF0ZSBjbGFzc2VzIGluIHNvbWUgcGFja2FnZSBlaWRlciBieSByZWFkaW5nIGl0IGZyb20gdGV4dCBmaWxlIG9yIHBhc3NlZCBhcwotICogc3RyaW5ncy4KLSAqIAotICogPC9wcmU+Ci0gKiAKLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NMb2FkaW5nVGVzdCBleHRlbmRzIFByb2plY3RCYXNlZFRlc3QKLXsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9FWFQgPSAiLmphdmEiOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhciBTRVBBUkFUT1IgPSAnIyc7Ci0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBkZWZhdWx0UGFja2FnZTsKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBzcmNGb2xkZXIsIFN0cmluZyBkZWZhdWx0UGFja2FnZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQljcmVhdGVKYXZhUHJvamVjdChzcmNGb2xkZXIpOwotCi0JCWlmIChkZWZhdWx0UGFja2FnZU5hbWUgIT0gbnVsbCkKLQkJewotCQkJZGVmYXVsdFBhY2thZ2UgPSBnZXRTb3VyY2VGb2xkZXIoKS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoZGVmYXVsdFBhY2thZ2VOYW1lLCB0cnVlLCBudWxsKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGNsYXNzIGluIHRlc3QgcHJvamVjdC4gPGNvZGU+c291cmNlRmlsZVBhdGg8L2NvZGU+IG11c3QgY29udGFpbiB0aGUgY2xhc3Mgc291cmNlIHdpdGhvdXQgcGFja2FnZSBkZWNsYXJhdGlvbi4gVGhlIGNsYXNzIGlzIGNyZWF0ZWQgaW4KLQkgKiBkZWZhdWx0IHBhY2thZ2UuCi0JICogCi0JICogUHJvamVjdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlRmlsZVBhdGgKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHJldHVybiBJVHlwZSBvYmplY3QgZm9yIHRoZSBjcmVhdGVkIGNsYXNzCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIElUeXBlIGNyZWF0ZUNsYXNzKFN0cmluZyBzb3VyY2VGaWxlUGF0aCwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0JewotCQlpZiAoc291cmNlRmlsZVBhdGggPT0gbnVsbCkKLQkJewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJzb3VyY2VGaWxlUGF0aCBzaG91bGQgbm90IGJlIG51bGwuIik7Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gVGVzdFByb2plY3RzVXRpbHMucmVhZFNvdXJjZSh0aGlzLmdldENsYXNzKCksIHNvdXJjZUZpbGVQYXRoKTsKLQotCQlyZXR1cm4gY3JlYXRlQ2xhc3MoZGVmYXVsdFBhY2thZ2UsIGNsYXNzTmFtZSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNsYXNzIGluIDxjb2RlPnBjazwvY29kZT4gcGFja2FnZSB3aXRoIG5hbWUgYW5kIHNvdXJjZSA8Y29kZT5jbGFzc05hbWUsIHNvdXJjZTwvY29kZT4uIFNvdXJjZSBtdXN0IG5vdCBpbmNsdXNlIHBhY2thZ2UKLQkgKiBkZWNsYXJhdGlvbi4gUHJvamVjdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGNrCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGluIGNhc2Ugc29tZSBvZiB0aGUgcGFyYW1zIGlzIG51bGwuCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgY3JlYXRlQ2xhc3MoSVBhY2thZ2VGcmFnbWVudCBwY2ssIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCi0JCXsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW0gJ2NsYXNzTmFtZScgc2hvdWxkIG5vdCBiZSBudWxsLiIpOwotCQl9Ci0KLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQl7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhcmFtICdzb3VyY2UnIHNob3VsZCBub3QgYmUgbnVsbC4iKTsKLQkJfQotCi0JCWlmIChnZXRUZXN0UHJvamVjdCgpID09IG51bGwpCi0JCXsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJvamVjdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIGNsYXNzZXMgY2FuIGJlIGFkZGVkIHRvIGl0Iik7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0VGVzdFByb2plY3QoKS5jcmVhdGVUeXBlKHBjaywgY2xhc3NOYW1lICsgSkFWQV9FWFQsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIGNvbnRlbnQgb2YgPGNvZGU+c291cmNlc0ZpbGVQYXRoPC9jb2RlPiBhbmQgY3JlYXRlcyBjbGFzc2VzIGluIHRlc3QgcHJvamVjdC4gVGhlIGNvbnRlbnQgb2YgPGNvZGU+c291cmNlc0ZpbGVQYXRoPC9jb2RlPiBzb3VsZCBiZSAtCi0JICogJyMnIGNoYXIgKHNlcGFyYXRvciBmb3IgY2xhc3NlcykgZm9sbG93ZWQgYnkgQ2xhc3MgbmFtZSwgbmV3IGxpbmUgYW5kIGFmdGVyIHRoYXQgY2xhc3Mgc291cmNlIHdpdGhvdXQgcGFja2FnZSBkZWNsYXJhdGlvbi48YnI+Ci0JICogRXhhbXBsZToKLQkgKiAKLQkgKiA8cHJlPgotCSAqICAjSW1wbGVtZW50c1JlbW90ZQotCSAqICBwdWJsaWMgY2xhc3MgSW1wbGVtZW50c1JlbW90ZSBpbXBsZW1lbnRzIGphdmEucm1pLlJlbW90ZQotCSAqICB7Ci0JICogIH0KLQkgKiAJCi0JICogICNOb0RlZmF1bHRDb25zdHJ1Y3RvcgotCSAqICBwdWJsaWMgY2xhc3MgTm9EZWZhdWx0Q29uc3RydWN0b3IgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCSAqICB7Ci0JICogCXB1YmxpYyBOb0RlZmF1bHRDb25zdHJ1Y3RvcihTdHJpbmcgcGFyYW0pIHsKLQkgKiAgCX0KLQkgKiAgfQotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiBsb3RzIG9mIHNtYWxsIGNsYXNzZXMgc2hvdWxkIGJlIGNyZWF0ZWQgZnJvbSBhIHNvdXJjZSBmaWxlLiBQcm9qZWN0IG11c3QgYmUgY3JlYXRlZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VzRmlsZVBhdGgKLQkgKiBAcmV0dXJuIG1hcCBvZiBjbGFzc05hbWUtPklUeXBlLiB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgSVR5cGU+IGNyZWF0ZUNsYXNzZXMoU3RyaW5nIHNvdXJjZXNGaWxlUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJTWFwPFN0cmluZywgSVR5cGU+IHR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJVHlwZT4oKTsKLQkJU3RyaW5nIHNvdXJjZSA9IFRlc3RQcm9qZWN0c1V0aWxzLnJlYWRTb3VyY2UodGhpcy5nZXRDbGFzcygpLCBzb3VyY2VzRmlsZVBhdGgpOwotCi0JCWludCBzdGFydFBvcyA9IDA7Ci0JCXdoaWxlICgoc3RhcnRQb3MgPSBzb3VyY2UuaW5kZXhPZihTRVBBUkFUT1IpKSA+IC0xKQotCQl7Ci0JCQlpbnQgZW5kUG9zID0gc291cmNlLmluZGV4T2YoU0VQQVJBVE9SLCBzdGFydFBvcyArIDEpOwotCQkJaWYgKGVuZFBvcyA9PSAtMSkKLQkJCQllbmRQb3MgPSBzb3VyY2UubGVuZ3RoKCk7Ci0KLQkJCVN0cmluZyBzcmMgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0UG9zICsgMSwgZW5kUG9zKTsKLQkJCXNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoZW5kUG9zKTsKLQotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHNyYy5zdWJzdHJpbmcoMCwgc3JjLmluZGV4T2YoJ1xuJykpLnJlcGxhY2VBbGwoIlxyIiwgIiIpOwotCQkJc3JjID0gc3JjLnN1YnN0cmluZyhzcmMuaW5kZXhPZignXG4nKSArIDEpOwotCi0JCQl0eXBlcy5wdXQoY2xhc3NOYW1lLCBjcmVhdGVDbGFzcyhkZWZhdWx0UGFja2FnZSwgY2xhc3NOYW1lLCBzcmMpKTsKLQkJfQotCi0JCXJldHVybiB0eXBlczsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvUHJvamVjdEJhc2VkVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Byb2plY3RCYXNlZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDRlMDg5OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvUHJvamVjdEJhc2VkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3Q7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLQ0KLS8qKg0KLSAqIEdlbmVyYWwgY2xhc3MgZm9yIHRlc3RzIHRoYXQgc2hvdWxkIGJlIHN0YXJ0ZWQgYXMgSlVuaXQgUGx1Z2luIHRlc3RzLiBQcm92aWRlcyBiYXNpYyBmdW5jdGlvbmFsaXRpZXMgZm9yIGZ1bmN0aW9uYWwgdGVzdGluZzogMS4gQ3JlYXRlIEphdmEgcHJvamVjdA0KLSAqIGluIGp1bml0LXJ1bnRpbWUtd29ya2JlbmNoLiAyLiBDcmVhdGUgZGVmYXVsdCBzb3VyY2UgZm9sZGVyLiAzLiBDcmVhdGUgZGVmYXVsdCBwYWNrYWdlLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdEJhc2VkVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQlwcml2YXRlIFRlc3RQcm9qZWN0IHByb2plY3Q7DQotDQotCS8qKg0KLQkgKiA8Y29kZT5zcmNGb2xkZXJOYW1lPC9jb2RlPiB0aGUgc291cmNlIGZvbGRlciB3aGVyZSBjbGFzc2VzIHdpbGwgYmUgY3JlYXRlZCwgPGNvZGU+cGFja2FnZU5hbWU8L2NvZGU+IGlzIHRoZSBwYWNrYWdlIHdoZXJlIGNsYXNzZXMgd2lsbCBiZQ0KLQkgKiBjcmVhdGVkLg0KLQkgKiANCi0JICogQHBhcmFtIHNyY0ZvbGRlck5hbWUNCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gLQ0KLQkgKiAgICAgICAgICAgICBpbiBjYXNlIHNyY0ZvbGRlck5hbWUgaXMgbnVsbA0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSmF2YVByb2plY3QoU3RyaW5nIHNyY0ZvbGRlck5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWlmIChzcmNGb2xkZXJOYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJzcmNGb2xkZXJOYW1lIHNob3VsZCBub3QgYmUgbnVsbC4iKTsNCi0JCX0NCi0NCi0JCXByb2plY3QgPSBuZXcgVGVzdFByb2plY3QoKTsNCi0JCXByb2plY3QuY3JlYXRlU291cmNlRm9sZGVyKHNyY0ZvbGRlck5hbWUpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHByb2plY3QgIT0gbnVsbCkNCi0JCXsNCi0JCQlwcm9qZWN0LmRpc3Bvc2UoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgZmluYWwgVGVzdFByb2plY3QgZ2V0VGVzdFByb2plY3QoKQ0KLQl7DQotCQlyZXR1cm4gcHJvamVjdDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0U291cmNlRm9sZGVyKCkNCi0Jew0KLQkJcmV0dXJuIHByb2plY3QuZ2V0U291cmNlRm9sZGVyKCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpDQotCXsNCi0JCXJldHVybiBwcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RFamIzUHJvamVjdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RFamIzUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMGE3OWI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9UZXN0RWpiM1Byb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdDsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdEVqYjNQcm9qZWN0DQotew0KLQlwcml2YXRlIElQcm9qZWN0IGVqYlByb2plY3Q7DQotDQotCXB1YmxpYyBUZXN0RWpiM1Byb2plY3QoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZWpiUHJvamVjdCA9IGNyZWF0ZUVqYk1vZHVsZShuYW1lICsgIl8iICsgTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgVGVzdEVqYjNQcm9qZWN0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBib29sZWFuIGFwcGVuZFVpZCwgZmluYWwgYm9vbGVhbiByZXVzZUV4aXN0aW5nKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZ0J1aWxkZXIgcHJvamVjdE5hbWUgPSBuZXcgU3RyaW5nQnVpbGRlcihuYW1lKTsNCi0JCWlmIChhcHBlbmRVaWQpDQotCQl7DQotCQkJcHJvamVjdE5hbWUuYXBwZW5kKCJfIik7DQotCQkJcHJvamVjdE5hbWUuYXBwZW5kKExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsNCi0JCX0NCi0JCUlQcm9qZWN0IGV4aXN0aW5nUHJvamVjdCA9IG51bGw7DQotCQlpZiAocmV1c2VFeGlzdGluZykNCi0JCXsNCi0JCQlleGlzdGluZ1Byb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUudG9TdHJpbmcoKSk7DQotCQl9DQotCQlpZiAoZXhpc3RpbmdQcm9qZWN0ID09IG51bGwpDQotCQl7DQotCQkJdGhpcy5lamJQcm9qZWN0ID0gY3JlYXRlRWpiTW9kdWxlKHByb2plY3ROYW1lLnRvU3RyaW5nKCkpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJdGhpcy5lamJQcm9qZWN0ID0gZXhpc3RpbmdQcm9qZWN0Ow0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIElQcm9qZWN0IGNyZWF0ZUVqYk1vZHVsZShmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlRWpiM1Byb2plY3QobmFtZSk7DQotCX0NCi0NCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQ0KLQl7DQotCQlyZXR1cm4gZWpiUHJvamVjdC5nZXRQcm9qZWN0KCk7DQotCX0NCi0NCi0JcHVibGljIElGb2xkZXIgZ2V0TWV0YUluZkZvbGRlcigpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIGVqYlByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigiZWpiTW9kdWxlIikuZ2V0Rm9sZGVyKCJNRVRBLUlORiIpOw0KLQl9DQotDQotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGNyZWF0ZVBhY2thZ2UoU3RyaW5nIHNvdXJjZUZvbGRlciwgU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShnZXRQcm9qZWN0KCkpOw0KLQkJZmluYWwgSUZvbGRlciBmb2xkZXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKHNvdXJjZUZvbGRlcik7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCBzcmNGb2xkZXIgPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGZvbGRlcik7DQotCQlyZXR1cm4gc3JjRm9sZGVyLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOw0KLQl9DQotDQotCXB1YmxpYyBJRmlsZSBjcmVhdGVGaWxlKGZpbmFsIElGb2xkZXIgZm9sZGVyLCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUsIGZpbmFsIFVSTCBpbnB1dFVybCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmb2xkZXIsICJmb2xkZXIiKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmaWxlTmFtZSwgImZpbGVOYW1lIik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oaW5wdXRVcmwsICJpbnB1dFVybCIpOw0KLQkJDQotCQlmaW5hbCBJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoZmlsZU5hbWUpOw0KLQkJZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBpbnB1dFVybC5vcGVuU3RyZWFtKCk7DQotCQl0cnkNCi0JCXsNCi0JCQlmaWxlLmNyZWF0ZShpbnB1dFN0cmVhbSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOw0KLQkJCXJldHVybiBmaWxlOw0KLQkJfQ0KLQkJZmluYWxseQ0KLQkJew0KLQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7DQotCQl9DQotCX0NCi0JDQotCS8qKiBUbyBnZXQgYSBoYW5kbGUgdG8gYSBmaWxlIGxvY2F0ZWQgaW4gdGhpcyBwcm9qZWN0IHNwZWNpZmllZCBieSB0aGUgcmVsYXRpdmUgZmlsZSBwYXRoLg0KLQkgKiBAcGFyYW0gZmlsZVBhdGggZmlsZSBwYXRoIHJlbGF0aXZlIGluc2lkZSBvZiB0aGUgcHJvamVjdCwgaS5lLiB0aGUgcHJvamVjdCBuYW1lIG11c3QgTk9UDQotCSAqICBiZSBwYXJ0IG9mIHRoZSBwYXRoIA0KLQkgKiBAcmV0dXJuIHRoZSBmaWxlIGhhbmRsZSAqLw0KLQlwdWJsaWMgZmluYWwgSUZpbGUgZ2V0RmlsZShmaW5hbCBTdHJpbmcgZmlsZVBhdGgpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmaWxlUGF0aCwgImZpbGVQYXRoIik7DQotCQlyZXR1cm4gdGhpcy5lamJQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBkZWxldGVGaWxlKGZpbmFsIElGb2xkZXIgZm9sZGVyLCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZm9sZGVyLCAiZm9sZGVyIik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZmlsZU5hbWUsICJmaWxlTmFtZSIpOw0KLQkJDQotCQlmaW5hbCBJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoZmlsZU5hbWUpOw0KLQkJaWYgKGZpbGUuZXhpc3RzKCkpDQotCQl7DQotCQkJZmlsZS5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCQl9DQotCX0NCi0JDQotCS8qKiBUbyBjcmVhdGUgYSBwcm9qZWN0IGZvbGRlciBzcGVjaWZpZWQgYnkgdGhlIHJlbGF0aXZlIGZvbGRlciBwYXRoLiBBbGwgZm9sZGVyIHNlZ21lbnRzDQotCSAqIGhhdmUgYWxyZWFkeSB0byBleGlzdCBhcGFydCBmcm9tIHRoZSBsYXN0IG9uZSwgaS5lLiBwYXJlbnQgZm9sZGVycyBhcmUgbm90IGNyZWF0ZWQgYXV0b21hdGljYWxseS4NCi0JICogQHBhcmFtIGZvbGRlclBhdGggZm9sZGVyIHBhdGggcmVsYXRpdmUgaW5zaWRlIG9mIHRoZSBwcm9qZWN0LCBpLmUuIHRoZSBwcm9qZWN0IG5hbWUgbXVzdCBOT1QNCi0JICogIGJlIHBhcnQgb2YgdGhlIHBhdGggDQotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZm9sZGVyDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAqLw0KLQlwdWJsaWMgZmluYWwgSUZvbGRlciBjcmVhdGVGb2xkZXIoZmluYWwgU3RyaW5nIGZvbGRlclBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmb2xkZXJQYXRoLCAiZm9sZGVyUGF0aCIpOw0KLQkJDQotCQlmaW5hbCBJRm9sZGVyIGZvbGRlciA9IHRoaXMuZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKGZvbGRlclBhdGgpOw0KLQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsNCi0JCXJldHVybiBmb2xkZXI7DQotCX0NCi0NCi0JLyoqIFRvIGdldCBhIGhhbmRsZSB0byBhIHByb2plY3QgZm9sZGVyIHNwZWNpZmllZCBieSB0aGUgcmVsYXRpdmUgZm9sZGVyIHBhdGguDQotCSAqIEBwYXJhbSBmb2xkZXJQYXRoIGZvbGRlciBwYXRoIHJlbGF0aXZlIGluc2lkZSBvZiB0aGUgcHJvamVjdCwgaS5lLiB0aGUgcHJvamVjdCBuYW1lIG11c3QgTk9UDQotCSAqICBiZSBwYXJ0IG9mIHRoZSBwYXRoIA0KLQkgKiBAcmV0dXJuIHRoZSBmb2xkZXIgaGFuZGxlICovDQotCXB1YmxpYyBmaW5hbCBJRm9sZGVyIGdldEZvbGRlcihmaW5hbCBTdHJpbmcgZm9sZGVyUGF0aCkNCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZvbGRlclBhdGgsICJmb2xkZXJQYXRoIik7DQotCQlyZXR1cm4gdGhpcy5lamJQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGb2xkZXIoZm9sZGVyUGF0aCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RQcm9qZWN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODMwMGQxNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5Xb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkFwdENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmpvYnMuSm9iVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy50aHJlYWRpbmcuVGVzdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFdyYXBwZXIgdXRpbGl0eSBmb3IgbWFpbnRhaW5pbmcgcHJvamVjdHMgd2hpY2ggcGFydGljaXBhdGUgaW4gdGVzdHMgZml4dHVyZS4gUmVzb3VyY2UgbW9kaWZpY2F0aW9uIG9wZXJhdGlvbnMgYXJlIGFsd2F5cyBwZXJmb3JtZWQgb3V0c2lkZSB0aGUgVUkgKG1haW4gdGhyZWFkKS4gSWYgdGhlIGNhbGxlciB0aHJlYWQgaXMgdGhlIFVJIHRocmVhZCwgZm9yayBpbiB7QGxpbmsgVGVzdENvbnRleHR9IGlzIHBlcmZvcm1lZC4KLSAqIFJlc291cmNlIGNoYW5nZSBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgd2l0aGluIGEge0BsaW5rIElXb3Jrc3BhY2VSdW5uYWJsZX0gd2l0aCBhIHNjaGVkdWxpbmcgcnVsZSBvZiB0aGUgd29ya3NwYWNlIHJvb3Q8YnI+Ci0gKiBFeGVjdXRpbmcgcmVzb3VyY2UgY2hhbmdlcyBvdXRzaWRlIHRoZSBVSSB0aHJlYWQgYWxsb3dzIHJlc291cmNlIGNoYW5nZSBldmVudHMgcHJvcGFnYXRpb24gZXZlbnQgd2hlbiB0aGUgSlVuaXQgdGVzdHMgcnVuIGluIHRoZSBVSSB0aHJlYWQuIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIFdlYiBzZXJ2aWNlIERPTSB0ZXN0cyBhcyB0aGUgbW9kZWwgaXMgdXBkYXRlZCBvbiByZXNvdXJjZSBjaGFuZ2VzICAgCi0gKiAKLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YsIERhbmFpbCBCcmFuZWtvdgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFRlc3RQcm9qZWN0Ci17Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIENMQVNTX1NFUEFSQVRPUiA9ICcjJzsKLQkKLQlwcml2YXRlIGludCBpZEluTWlsbGlzID0gMDsKLQkKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyOwotCi0JcHVibGljIFRlc3RQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRoaXMoIiIpOwotCX0KLQkKLQlwdWJsaWMgVGVzdFByb2plY3QoU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQkvKgotCQkgKiBDYWxjdWxhdGUgdGhlIG5hbWUgb2YgdGhlIHRlc3QgcHJvamVjdC4gVGhlIGZvcm11bGE6IEphdmFQcm9qXyArIDxjdXJyZW50X3RpbWVfaW5fbWlsbGlzPyArIDxpZEluTWlsbGlzPiBpcyB1c3NlZC4gSW4gdGhpcyBmb3JtdWxhCi0JCSAqIEphdmFQcm9qXyBpcyBhIHN0cmluZyBsaXR0ZXJhbCwgY3VycmVudF90aW1lX2luX21pbGxpcyBpcyBvYnZpb3VzLiBpZEluTWlsbGlzIGlzIGFuIGludGVnZXIgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgcHJvamVjdCBuYW1lIGlzCi0JCSAqIGNhbGN1bGF0ZWQuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHN5c3RlbSB0aW1lciBoYXMgcHJlY2lzaW9uIGFib3V0IDEwIG1zLiBUaHVzIGl0J3MgcG9zc2libGUgdGhhdCB0d28gY29uc2VjdXRpdmUgcHJvamVjdCBjcmVhdGlvbnMKLQkJICogZ2l2ZSB0aGUgc2FtZSBwcm9qZWN0IG5hbWUuIEZvciBleGFtcGxlIHRoZSBwcm9qZWN0IGlzIGNyZXRlZCB0aGVuIHRoZSB0ZXN0IGV4ZWN1dGVzIHZlcnkgZmFzdCBhbmQgYSBuZXcgcHJvamVjdCBpcyBjcmVhdGVkIGFnYWluLiBJbiB0aGUKLQkJICogc2FtZSB0aW1lIHNpbXBseSB0aGUgaWQgaXMgbm90IGVub3VnaCBhcyBhIGRpZmZlcmVudCB0ZXN0IHJ1biBtaWdodCBwcm9kdWNlIHRoZSBzYW1lIHByb2plY3QgbmFtZS4gVGh1cyB0aGUgY29tYmluYXRpb24gdGltX21pbGxpcyArCi0JCSAqIGlkSW5NaWxsaXMgZ2l2ZXMgYSB1bmlxdWUgcHJvamVjdCBuYW1lCi0JCSAqLwotCQlmaW5hbCBTdHJpbmcgdGVzdFByb2plY3ROYW1lID0gIkphdmFQcm9qXyIgKyBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSArICJfIiArIGlkSW5NaWxsaXMrKyArIG5hbWU7Ci0JCXByb2plY3QgPSB3b3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh0ZXN0UHJvamVjdE5hbWUpOwotCQkKLQkJZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIGNyZWF0ZVByb2plY3RPcGVyYXRpb24gPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkKLQkJewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJCXsKLQkJCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkJCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0KLQkJCQljb25maWd1cmVKYXZhUHJvamVjdCgpOwotCQkJfQotCQl9OwotCQkKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKGNyZWF0ZVByb2plY3RPcGVyYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb25maWd1cmVKYXZhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQotCQlJRm9sZGVyIGJpbkZvbGRlciA9IGNyZWF0ZUJpbkZvbGRlcigpOwotCi0JCXNldEphdmFOYXR1cmUoKTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbMF0sIG51bGwpOwotCi0JCWNyZWF0ZU91dHB1dEZvbGRlcihiaW5Gb2xkZXIpOwotCQlhZGRTeXN0ZW1MaWJyYXJpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdFByb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCXsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJvamVjdCBzaG91bGQgbm90IGJlIG51bGwiKTsKLQkJfQotCi0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCXRoaXMuc291cmNlRm9sZGVyID0gZmluZFNvdXJjZUZvbGRlcigpOwotCX0KLQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZmluZFNvdXJjZUZvbGRlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3QgcGZyIDogamF2YVByb2plY3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKSkKLQkJewotCQkJaWYgKHBmci5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpCi0JCQl7Ci0JCQkJcmV0dXJuIHBmcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLQl7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKQotCXsKLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEphcihTdHJpbmcgcGx1Z2luLCBTdHJpbmcgamFyKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbgotCXsKLQkJUGF0aCByZXN1bHQgPSBmaW5kRmlsZUluUGx1Z2luKHBsdWdpbiwgamFyKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRFbnRyaWVzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsKLQkJbmV3RW50cmllc1tvbGRFbnRyaWVzLmxlbmd0aF0gPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocmVzdWx0LCBudWxsLCBudWxsKTsKLQkJCi0JCXNldENsYXNzcGF0aChuZXdFbnRyaWVzKTsKLQl9Ci0KLQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBjcmVhdGVQYWNrYWdlKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudFtdIGNyZWF0ZWRQYWNrYWdlID0gbmV3IElQYWNrYWdlRnJhZ21lbnRbMV07Ci0JCQotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgY3JlYXRlUGFja2FnZVJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJaWYgKHNvdXJjZUZvbGRlciA9PSBudWxsKQotCQkJCQlzb3VyY2VGb2xkZXIgPSBjcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOwotCQkJCWNyZWF0ZWRQYWNrYWdlWzBdID0gc291cmNlRm9sZGVyLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChuYW1lLCBmYWxzZSwgbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JCVRlc3RQcm9qZWN0c1V0aWxzLmV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShjcmVhdGVQYWNrYWdlUnVubmFibGUpOwotCQkKLQkJcmV0dXJuIGNyZWF0ZWRQYWNrYWdlWzBdOwotCX0KLQotCXB1YmxpYyBJVHlwZSBjcmVhdGVUeXBlKGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGFjaywgZmluYWwgU3RyaW5nIGN1TmFtZSwgZmluYWwgU3RyaW5nIHNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoInBhY2thZ2UgIiArIHBhY2suZ2V0RWxlbWVudE5hbWUoKSArICI7XG4iKTsKLQkJYnVmLmFwcGVuZCgiXG4iKTsKLQkJYnVmLmFwcGVuZChzb3VyY2UpOwotCQkKLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdFtdIGNyZWF0ZWRDdSA9IG5ldyBJQ29tcGlsYXRpb25Vbml0WzFdOwotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgY3JlYXRlQ3VSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCWNyZWF0ZWRDdVswXSA9IHBhY2suY3JlYXRlQ29tcGlsYXRpb25Vbml0KGN1TmFtZSwgYnVmLnRvU3RyaW5nKCksIGZhbHNlLCBudWxsKTsKLQkJCX0KLQkJfTsKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKGNyZWF0ZUN1UnVubmFibGUpOwotCQkKLQkJcmV0dXJuIGNyZWF0ZWRDdVswXS5nZXRUeXBlcygpWzBdOwotCX0KLQotCQotCS8qKgotCSAqIENyZWF0ZXMgbXVsdGlwbGUgY2xhc3NlcyBpbiBwcm9qZWN0LiBUaGUgY29udGVudCBvZiA8Y29kZT5zb3VyY2U8L2NvZGU+IHNob3VsZCBiZSBpbiBmb3JtIC0KLQkgKiAnIycgY2hhciAoc2VwYXJhdG9yIGZvciBjbGFzc2VzKSBmb2xsb3dlZCBieSBDbGFzcyBuYW1lLCBuZXcgbGluZSBhbmQgYWZ0ZXIgdGhhdCBjbGFzcyBzb3VyY2Ugd2l0aG91dCBwYWNrYWdlIGRlY2xhcmF0aW9uLjxicj4KLQkgKiBFeGFtcGxlOgotCSAqIAotCSAqIDxwcmU+Ci0JICogICNJbXBsZW1lbnRzUmVtb3RlCi0JICogIHB1YmxpYyBjbGFzcyBJbXBsZW1lbnRzUmVtb3RlIGltcGxlbWVudHMgamF2YS5ybWkuUmVtb3RlCi0JICogIHsKLQkgKiAgfQotCSAqIAkKLQkgKiAgI05vRGVmYXVsdENvbnN0cnVjdG9yCi0JICogIHB1YmxpYyBjbGFzcyBOb0RlZmF1bHRDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0JICogIHsKLQkgKiAJcHVibGljIE5vRGVmYXVsdENvbnN0cnVjdG9yKFN0cmluZyBwYXJhbSkgewotCSAqICAJfQotCSAqICB9Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGlmIGxvdHMgb2Ygc21hbGwgY2xhc3NlcyBzaG91bGQgYmUgY3JlYXRlZCBmcm9tIGEgc291cmNlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZXNGaWxlUGF0aAotCSAqIEByZXR1cm4gbWFwIG9mIGNsYXNzTmFtZS0+SVR5cGUuIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLCBJVHlwZT4gY3JlYXRlVHlwZXMoSVBhY2thZ2VGcmFnbWVudCBwYWNrLCBTdHJpbmcgc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlNYXA8U3RyaW5nLCBJVHlwZT4gdHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElUeXBlPigpOwotCQlpbnQgc3RhcnRQb3MgPSAwOwotCQl3aGlsZSAoKHN0YXJ0UG9zID0gc291cmNlLmluZGV4T2YoQ0xBU1NfU0VQQVJBVE9SKSkgPiAtMSkKLQkJewotCQkJaW50IGVuZFBvcyA9IHNvdXJjZS5pbmRleE9mKENMQVNTX1NFUEFSQVRPUiwgc3RhcnRQb3MgKyAxKTsKLQkJCWlmIChlbmRQb3MgPT0gLTEpIHsKLQkJCQllbmRQb3MgPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBzcmMgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0UG9zICsgMSwgZW5kUG9zKTsKLQkJCXNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoZW5kUG9zKTsKLQotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHNyYy5zdWJzdHJpbmcoMCwgc3JjLmluZGV4T2YoJ1xuJykpLnJlcGxhY2VBbGwoIlxyIiwgIiIpLnRyaW0oKTsKLQkJCXNyYyA9IHNyYy5zdWJzdHJpbmcoc3JjLmluZGV4T2YoJ1xuJykgKyAxKTsKLQotCQkJdHlwZXMucHV0KGNsYXNzTmFtZSwgY3JlYXRlVHlwZShwYWNrLCBjbGFzc05hbWUgKyAiLmphdmEiLCBzcmMpKTsKLQkJfQotCi0JCXJldHVybiB0eXBlczsKLQl9CQkKLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgZGlzcG9zZVByb2plY3RSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCXRyeSB7Ci0JCQkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCQkJCXByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCX0gY2F0Y2ggKFJlc291cmNlRXhjZXB0aW9uIHJlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIHNpbGVudGx5IHN3YWxsb3cgdGhlIHJlc291cmNlIGV4Y2VwdGlvbi4gRm9yIHNvbWUgcmVhc29uIHRoaXMgZXhjZXB0aW9uIGdldHMgdGhyb3duCi0JCQkJCSAqIGZyb20gdGltZSB0byB0aW1lIGFuZCByZXBvcnRzIHRoZSB0ZXN0IGZhaWxpbmcuIFRoZSBwcm9qZWN0IGRlbGV0aW9uIGl0c2VsZiBoYXBwZW5zCi0JCQkJCSAqIGFmdGVyIHRoZSB0ZXN0IGhhcyBjb21wbGV0ZWQgYW5kIGEgZmFpbHVyZSB3aWxsIG5vdCByZXBvcnQgYSBwcm9ibGVtIGluIHRoZSB0ZXN0LgotCQkJICAgIAkgKiBPbmx5IFJlc291cmNlRXhjZXB0aW9uIGlzIGNhdWdodCBpbiBvcmRlciBub3QgdG8gaGlkZSB1bmV4cGVjdGVkIGVycm9ycy4JCi0JCQkJCSAqLwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9OwotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUoZGlzcG9zZVByb2plY3RSdW5uYWJsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCQotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgY2xvc2VSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7CQkKLQkJCX0KLQkJfTsKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKGNsb3NlUnVubmFibGUpOwotCX0KLQotCXByaXZhdGUgSUZvbGRlciBjcmVhdGVCaW5Gb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSUZvbGRlciBiaW5Gb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcigiYmluIik7Ci0JCWJpbkZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG51bGwpOwotCQlyZXR1cm4gYmluRm9sZGVyOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRKYXZhTmF0dXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXcgU3RyaW5nW10geyBKYXZhQ29yZS5OQVRVUkVfSUQgfSk7Ci0JCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVPdXRwdXRGb2xkZXIoSUZvbGRlciBiaW5Gb2xkZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlQYXRoIG91dHB1dExvY2F0aW9uID0gYmluRm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0JCWphdmFQcm9qZWN0LnNldE91dHB1dExvY2F0aW9uKG91dHB1dExvY2F0aW9uLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgY3JlYXRlU291cmNlRm9sZGVyKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBjcmVhdGVkUm9vdCA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFsxXTsKLQkJZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIGNyZWF0ZVJvb3RSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihuYW1lKTsKLQkJCQlmb2xkZXIuY3JlYXRlKGZhbHNlLCB0cnVlLCBudWxsKTsKLQkJCQljcmVhdGVkUm9vdFswXSA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZm9sZGVyKTsKLQotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRFbnRyaWVzLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkRW50cmllcywgMCwgbmV3RW50cmllcywgMCwgb2xkRW50cmllcy5sZW5ndGgpOwotCQkJCW5ld0VudHJpZXNbb2xkRW50cmllcy5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkoY3JlYXRlZFJvb3RbMF0uZ2V0UGF0aCgpKTsKLQkJCQlzZXRDbGFzc3BhdGgobmV3RW50cmllcyk7Ci0JCQl9Ci0JCX07Ci0JCVRlc3RQcm9qZWN0c1V0aWxzLmV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShjcmVhdGVSb290UnVubmFibGUpOwotCQl0aGlzLnNvdXJjZUZvbGRlciA9IGNyZWF0ZWRSb290WzBdOwotCQkKLQkJcmV0dXJuIHNvdXJjZUZvbGRlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU3lzdGVtTGlicmFyaWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkRW50cmllcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBvbGRFbnRyaWVzLmxlbmd0aCk7Ci0JCW5ld0VudHJpZXNbb2xkRW50cmllcy5sZW5ndGhdID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCk7Ci0JCXNldENsYXNzcGF0aChuZXdFbnRyaWVzKTsKLQl9Ci0KLQlwcml2YXRlIFBhdGggZmluZEZpbGVJblBsdWdpbihTdHJpbmcgcGx1Z2luLCBTdHJpbmcgZmlsZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQl7Ci0JCUJ1bmRsZSBwbHVnaW5CdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luKTsKLQkJVVJMIGphclVSTCA9IG5ldyBVUkwocGx1Z2luQnVuZGxlLmdldEVudHJ5KCIvIiksIGZpbGUpOwotCQlVUkwgbG9jYWxKYXJVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoamFyVVJMKTsKLQkJcmV0dXJuIG5ldyBQYXRoKGxvY2FsSmFyVVJMLmdldFBhdGgoKSk7Ci0JfQotCi0JcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFNvdXJjZUZvbGRlcigpCi0JewotCQlyZXR1cm4gc291cmNlRm9sZGVyOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250YWluZXIgY29ycmVzcG9uZGluZyB0byB0aGUgcGFja2FnZSBmcmFnbWVudCByb290LCBpLmUuIHRoZSBzb3VyY2UgZm9sZGVyLjxicj4KLQkgKiBJZiB0aGlzIHByb2plY3QgaXMgYSBqYXIvemlwIChpZiB0aGlzIGlzIHBvc3NpYmxlIGF0IGFsbCksIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lciBnZXRTb3VyY2VGb2xkZXJDb250YWluZXIoKQotCXsKLQkJdHJ5ewotCQkJSVJlc291cmNlIHJlcyA9IGdldFNvdXJjZUZvbGRlcigpLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQkJaWYocmVzPT1udWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9ZWxzZSB7Ci0JCQkJSUNvbnRhaW5lciByZXRWYWwgPSAoSUNvbnRhaW5lcikgcmVzOwotCQkJCXJldHVybiByZXRWYWw7Ci0JCQl9Ci0JCX1jYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Y2F0Y2goQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJRm9sZGVyIGNyZWF0ZUZvbGRlcihmaW5hbCBTdHJpbmcgZm9sZGVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmb2xkZXJOYW1lLCAiZm9sZGVyTmFtZSIpOwotCQlmaW5hbCBJRm9sZGVyIGZvbGRlciA9IHRoaXMucHJvamVjdC5nZXRGb2xkZXIoZm9sZGVyTmFtZSk7Ci0JCWZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBjcmVhdGVGb2xkZXJSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCWZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG1vbml0b3IpOwotCQkJfQotCQl9OwotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUoY3JlYXRlRm9sZGVyUnVubmFibGUpOwotCQkKLQkJcmV0dXJuIGZvbGRlcjsJCQotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHByb2plY3Qgcm9vdCBhcyBzb3VyY2UgZm9sZGVyCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gCi0JICovCi0JcHVibGljIHZvaWQgYXNzaWduUHJvamVjdFJvb3RBc1NvdXJjZUZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlJQ2xhc3NwYXRoRW50cnkgZGVmYXVsdFNyY0ZvbGRlckVudHJ5ID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkocHJvamVjdC5nZXRGdWxsUGF0aCgpKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkQ3AgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q3AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZENwLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZENwLCAwLCBuZXdDcCwgMCwgb2xkQ3AubGVuZ3RoKTsKLQkJbmV3Q3BbbmV3Q3AubGVuZ3RoIC0gMV0gPSBkZWZhdWx0U3JjRm9sZGVyRW50cnk7Ci0JCQotCQlzZXRDbGFzc3BhdGgobmV3Q3ApOwotCQl0aGlzLnNvdXJjZUZvbGRlciA9ICBUZXN0UHJvamVjdHNVdGlscy5nZXRTb3VyY2VGb2xkZXIocHJvamVjdCwgIiIpOwotCX0KLQkKLQlwcml2YXRlIElXb3Jrc3BhY2Ugd29ya3NwYWNlKCkKLQl7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgc2V0Q2xhc3NwYXRoUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkKLQkJewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJCXsKLQkJCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKHNldENsYXNzcGF0aFJ1bm5hYmxlKTsKLQkJCi0JCVN0cmluZyBsb2cgPSAiXG4iK2phdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkrIlxuIitTdHJpbmcudmFsdWVPZihqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGgpKyJcbiI7IAotCi0JCWZvcihpbnQgaWk9MDsgaWkgPCBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGg7IGlpKyspCi0JCXsKLQkJCWxvZyA9IGxvZyArICBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKVtpaV0uZ2V0UGF0aCgpLnRvU3RyaW5nKCkrIlxuIjsKLQkJfQotCQkKLQkJaWYoamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkubGVuZ3RoPT0wKQotCQl7Ci0JCQlsb2cgPSBsb2cgKyAiQ2xhc3NwYXRoIG5vdCBpbml0aWFsaXplZCAhXG4iOwotCQl9Ci0JCQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoMCwidGVzdE91dHB1dCIsbG9nKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFwdFByb2Nlc3NpbmdFbmFibGVkKGZpbmFsIGJvb2xlYW4gZW5hYmxlZCwgZmluYWwgYm9vbGVhbiBlbmFibGVSZWNvbmNpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgc2V0UHJvY2Vzc2luZ1J1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJCXsKLQkJCQlBcHRDb25maWcuc2V0RW5hYmxlZChUZXN0UHJvamVjdC50aGlzLmphdmFQcm9qZWN0LCBlbmFibGVkKTsKLQkJCQlBcHRDb25maWcuc2V0UHJvY2Vzc0R1cmluZ1JlY29uY2lsZShUZXN0UHJvamVjdC50aGlzLmphdmFQcm9qZWN0LCBlbmFibGVSZWNvbmNpbGUpOwotCQkJCVRlc3RQcm9qZWN0LnRoaXMuamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG1vbml0b3IpOwotCQkJfQotCQl9OwotCQkKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKHNldFByb2Nlc3NpbmdSdW5uYWJsZSk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkcyBhIHByb2plY3QKLQkgKiBAcGFyYW0ga2luZCBidWlsZCBraW5kLiBTZWUge0BsaW5rIElQcm9qZWN0I2J1aWxkKGludCwgSVByb2dyZXNzTW9uaXRvcil9IGZvciBkZXRhaWxzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGQoZmluYWwgaW50IGtpbmQpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgYnVpbGRSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCVRlc3RQcm9qZWN0LnRoaXMucHJvamVjdC5idWlsZChraW5kLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQkJCi0JCVRlc3RQcm9qZWN0c1V0aWxzLmV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShidWlsZFJ1bm5hYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgcmVmcmVzaFJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJVGVzdFByb2plY3QudGhpcy5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX07Ci0JCQotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUocmVmcmVzaFJ1bm5hYmxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RQcm9qZWN0c1V0aWxzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3RzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2YyNDQ3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3RzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMudGhyZWFkaW5nLlRlc3RDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdHNVdGlscwotewotCS8qKgotCSAqIFJlYWRzIGNvbnRlbnQgb2YgdGV4dCBmaWxlIGFuZCByZXR1cm5zIGl0IGFzIFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3MgY29udGV4dAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkU291cmNlKENsYXNzPD8+IGNsYXNzQ29udGV4dCwgU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjbGFzc0NvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlUGF0aCkpOwotCQl0cnkKLQkJewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJY2hhcltdIGJ1ZmYgPSBuZXcgY2hhcls1MTJdOwotCi0JCQlpbnQgbGVuID0gMDsKLQkJCXdoaWxlICgobGVuID0gaXNyLnJlYWQoYnVmZikpID4gMCkKLQkJCXsKLQkJCQlzYi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoYnVmZiwgMCwgbGVuKSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCi0JCX0gZmluYWxseQotCQl7Ci0JCQlpc3IuY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyBhbiBpbmRleGVyIGpvYi4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCB3b3JrYmVuY2ggcmVmcmVzaC9idWlsZCBwcm9jZXNzZXMgYXJlIG92ZXIgCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckluZGV4ZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoQWxsVHlwZU5hbWVzKG51bGwsIFNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSCwgCi0JCQkJCQkJCQkJCSAgbnVsbCwgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFLCAKLQkJCQkJCQkJCQkJICBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUywgCi0JCQkJCQkJCQkJCSAgU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50WzBdKSwgbmV3IFR5cGVOYW1lUmVxdWVzdG9yKCkKLQkJCQkJCQkJCQkJICB7Ci0JCQkJCQkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQkJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZyBwYXRoKQotCQkJCQkJCQkJCQkJCXsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQkJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIGFjY2VwdEludGVyZmFjZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLAotCQkJCQkJCQkJCQkJCQkJCQkJCQlTdHJpbmcgcGF0aCkKLQkJCQkJCQkJCQkJCQl7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkgIH0sCi0JCQkJCQkJCQkJCSAgSUphdmFTZWFyY2hDb25zdGFudHMuV0FJVF9VTlRJTF9SRUFEWV9UT19TRUFSQ0gsIG51bGwpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlSmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCUpvYlV0aWxzLndhaXRGb3JJbmRleGVyKCk7Ci0JCQotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3IFN0cmluZ1tdIHsgSmF2YUNvcmUuTkFUVVJFX0lEIH0pOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJSUphdmFQcm9qZWN0IGphdmFQID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQlhZGRUb0NsYXNzcGF0aChqYXZhUCwgSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCkpOwotCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvQ2xhc3NwYXRoKGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwRW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkRW50cmllcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBvbGRFbnRyaWVzLmxlbmd0aCk7Ci0JCW5ld0VudHJpZXNbb2xkRW50cmllcy5sZW5ndGhdID0gY3BFbnRyeTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0U291cmNlRm9sZGVyKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmb2xkZXJOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWZvcihJUGFja2FnZUZyYWdtZW50Um9vdCByb290IDogamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSkKLQkJewotCQkJaWYocm9vdC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhmb2xkZXJOYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcm9vdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgY3JlYXRlU291cmNlRm9sZGVyKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmb2xkZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYoZ2V0U291cmNlRm9sZGVyKHByb2plY3QsIGZvbGRlck5hbWUpICE9IG51bGwpCi0JCXsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNvdXJjZSBmb2xkZXIgYWxyZWFkeSBleGlzdHM6ICIgKyBmb2xkZXJOYW1lKTsKLQkJfQotCi0JCUlGb2xkZXIgc3JjRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoZm9sZGVyTmFtZSk7Ci0JCXNyY0ZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCUlDbGFzc3BhdGhFbnRyeSBzcmNDcEVudHJ5ID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkoc3JjRm9sZGVyLmdldEZ1bGxQYXRoKCkubWFrZUFic29sdXRlKCkpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0VudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZEVudHJpZXMubGVuZ3RoICsgMV07IAotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsKLQkJbmV3RW50cmllc1tuZXdFbnRyaWVzLmxlbmd0aCAtIDFdID0gc3JjQ3BFbnRyeTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMsIG51bGwpOwotCi0JCXJldHVybiBnZXRTb3VyY2VGb2xkZXIocHJvamVjdCwgZm9sZGVyTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSW1wb3J0cyBhIGZpbGUgaW50byBhIHByb2plY3QKLQkgKiBAcGFyYW0gY2xhc3NDb250ZXh0IHRoZSBjbGFzcyB3aGljaCBjbGFzc2xvYWRlciBpcyB1c2VkIHRvIGdldCB0aGUgc291cmNlIHJlc291cmNlIAotCSAqIEBwYXJhbSByZWxhdGl2ZVNyY0ZpbGVMb2NhdGlvbiBzb3VyY2UgZmlsZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgPGNvZGU+Y2xhc3NDb250ZXh0PC9jb2RlPiBwYXJhbWV0ZXIKLQkgKiBAcGFyYW0gdGFyZ2V0UmVzb3VyY2UgdGhlIHRhcmdldCByZXNvdXJjZTsgCi0JICogQHBhcmFtIHRhcmdldEZpbGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHJldHVybnMgdGhlIGZpbGUgaW1wb3J0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgaW1wb3J0RmlsZUludG9Qcm9qZWN0KENsYXNzPD8+IGNsYXNzQ29udGV4dCwgU3RyaW5nIHJlbGF0aXZlU3JjRmlsZUxvY2F0aW9uLCBJQ29udGFpbmVyIHRhcmdldFJlc291cmNlLCBTdHJpbmcgdGFyZ2V0RmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIHNyYyA9IFRlc3RQcm9qZWN0c1V0aWxzLnJlYWRTb3VyY2UoY2xhc3NDb250ZXh0LCByZWxhdGl2ZVNyY0ZpbGVMb2NhdGlvbik7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHRhcmdldFJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpICsgIlxcIiArIHRhcmdldEZpbGVOYW1lKTsKLQkJCi0JCWlmKGYuZXhpc3RzKCkpCi0JCXsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZpbGUgYWxyZWFkeSBleGlzdHM6ICIgKyBmLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQkKLQkJaWYoZi5pc0RpcmVjdG9yeSgpKQotCQl7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGlzIGEgZGlyZWN0b3J5Iik7Ci0JCX0KLQkJaWYoIGYuY3JlYXRlTmV3RmlsZSgpICkKLQkJewotCQkJQnVmZmVyZWRXcml0ZXIgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZikpKTsKLQkJCW91dC53cml0ZShzcmMpOwotCQkJb3V0LmZsdXNoKCk7Ci0JCQlvdXQuY2xvc2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGY7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVXb3Jrc3BhY2VQcm9qZWN0cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7Ci0JCWZvcihJUHJvamVjdCBwcm9qZWN0IDogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlwcm9qZWN0LmRlbGV0ZShmYWxzZSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJKG5ldyBMb2dnZXIoKSkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlRWpiM1Byb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVByb2plY3QgZWpiUHJvamVjdCA9IGNyZWF0ZVByb2plY3RXaXRoRmFjZXQocHJvamVjdE5hbWUsIG5ldyBTdHJpbmdbXXsianN0LmphdmEiLCAianN0LmVqYiJ9LCBuZXcgU3RyaW5nW117IjUuMCIsICIzLjAifSk7Ci0JCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUCA9IEphdmFDb3JlLmNyZWF0ZShlamJQcm9qZWN0KTsKLQkJCi0JCXJlbW92ZUFsbFNvdXJjZUZvbGRlcnMoamF2YVApOwotCi0JCS8vIFNldCBlamJNb2R1bGUgZm9sZGVyIChjcmVhdGVkIGR1cmluZyBqc3QuZWpiIGZhY2V0IGluc3RhbGxhdGlvbikgYXMgc291cmNlIGZvbGRlcgotCQlmaW5hbCBJRm9sZGVyIHNyY0ZvbGRlciA9IGVqYlByb2plY3QuZ2V0Rm9sZGVyKCJlamJNb2R1bGUiKTsKLQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVqYk1vZHVsZUNwRW50cnkgPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShzcmNGb2xkZXIuZ2V0RnVsbFBhdGgoKS5tYWtlQWJzb2x1dGUoKSk7Ci0JCWFkZFRvQ2xhc3NwYXRoKEphdmFDb3JlLmNyZWF0ZShlamJQcm9qZWN0KSwgZWpiTW9kdWxlQ3BFbnRyeSk7Ci0JCQotCQlyZXR1cm4gZWpiUHJvamVjdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxTb3VyY2VGb2xkZXJzKGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJZmluYWwgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IG5ld0NsYXNzcGF0aCA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwotCQlmb3IoSUNsYXNzcGF0aEVudHJ5IGNwRW50cnkgOiBqYXZhUC5nZXRSYXdDbGFzc3BhdGgoKSkKLQkJewotCQkJaWYoY3BFbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkKLQkJCXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCW5ld0NsYXNzcGF0aC5hZGQoY3BFbnRyeSk7Ci0JCX0KLQkJamF2YVAuc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3Q2xhc3NwYXRoLnNpemUoKV0pLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgY3JlYXRlUHJvamVjdFdpdGhGYWNldChmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsIGZpbmFsIFN0cmluZ1tdIGZhY2V0SWQsIGZpbmFsIFN0cmluZ1tdIGZhY2V0VmVyc2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWFzc2VydCBmYWNldElkLmxlbmd0aCA9PSBmYWNldFZlcnNpb24ubGVuZ3RoOwotCQlmaW5hbCBJUHJvamVjdFtdIHJlc3VsdCA9IG5ldyBJUHJvamVjdFsxXTsKLQkJdHJ5Ci0JCXsKLQkJCVRlc3RDb250ZXh0LnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0JCQkJewotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJcmVzdWx0WzBdID0gY3JlYXRlSmF2YVByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCQkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHJlc3VsdFswXSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCi0JCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgZmFjZXRJZC5sZW5ndGg7IGkrKykKLQkJCQkJCXsKLQkJCQkJCQlmaW5hbCBJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGZhY2V0SWRbaV0pOwotCQkJCQkJCWZhY2V0ZWRQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQoZmFjZXQuZ2V0VmVyc2lvbihmYWNldFZlcnNpb25baV0pLCBudWxsLCBtb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJCXsKLQkJCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfX0sIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlpZihlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJewotCQkJCXRocm93IChDb3JlRXhjZXB0aW9uKWUuZ2V0Q2F1c2UoKTsKLQkJCX0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZHluYW1pYyB3ZWIgbW9kdWxlIHByb2plY3Qgd2l0aCAianN0LndlYiIgZmFjZXQgdmVyLiAyLjUgaW5zdGFsbGVkCi0JICogQHBhcmFtIHByb2plY3ROYW1lCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlV2ViMjVQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElQcm9qZWN0IHdlYlByb2plY3QgPSBjcmVhdGVQcm9qZWN0V2l0aEZhY2V0KHByb2plY3ROYW1lLCBuZXcgU3RyaW5nW117ImpzdC5qYXZhIiwgImpzdC53ZWIifSwgbmV3IFN0cmluZ1tdeyI1LjAiLCAiMi41In0pOwotCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVAgPSBKYXZhQ29yZS5jcmVhdGUod2ViUHJvamVjdCk7Ci0KLQkJcmVtb3ZlQWxsU291cmNlRm9sZGVycyhqYXZhUCk7Ci0KLQkJcmV0dXJuIHdlYlByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGVzIGEgd29ya3NwYWNlIHJ1bm5hYmxlIG91dHNpZGUgdGhlIG1haW4gdGhyZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlleGVjdXRlV29ya3NwYWNlUnVubmFibGUocnVubmFibGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpCi0JCXsKLQkJCS8vIEV4ZWN1dGUgdGhlIHJ1bm5hYmxlIGluIHRoZSBjdXJyZW50IChub24tVUkpIHRocmVhZAotCQkJd29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBtb25pdG9yKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJ1bkluVGVzdENvbnRleHQocnVubmFibGUsIG1vbml0b3IpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcnVuSW5UZXN0Q29udGV4dChmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgdGV4dEN0eFJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKHJ1bm5hYmxlLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeQotCQl7Ci0JCQlUZXN0Q29udGV4dC5ydW4odGV4dEN0eFJ1bm5hYmxlLCB0cnVlLCBwbSwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0JCXsKLQkJCWlmKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0JCQl7Ci0JCQkJdGhyb3cgKENvcmVFeGNlcHRpb24pZS5nZXRDYXVzZSgpOwotCQkJfQotCQkJCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4ZWN0ZWQgZXhjZXB0aW9uIHRocm93biBieSBydW5uYWJsZSIsIGUuZ2V0Q2F1c2UoKSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludGVycnVwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlIHdvcmtzcGFjZSgpCi0JewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3RocmVhZGluZy9UZXN0Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Zjc2ODg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZzsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5Nb2RhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotDQotLyoqDQotICogVXRpbGl0eSB0byBleGVjdXRlIHJ1bm5hYmxlIGluc3RhbmNlcyBpbiBhIHNlcGFyYXRlIHRocmVhZC4gSW1wbGVtZW50YXRpb24gaXMgcHJldHR5IHNpbWlsYXIgdG8ge0BsaW5rIE1vZGFsQ29udGV4dH0gYnV0IGl0IHVzZXMge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfSB0byBwZXJmb3JtIGZvcmtpbmcNCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUZXN0Q29udGV4dA0KLXsNCi0JLyoqDQotCSAqIEV4ZWN1dGVzIHRoZSBvcGVyYXRpb24gc3BlY2lmaWVkIGluIHRoZSBjYWxsZXIgb3IgaW4gYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9IHRocmVhZCBkZXBlbmRpbmcgb24gdGhlIDxjb2RlPmZvcms8L2NvZGU+IHZhbHVlLiBJbiBjYXNlIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgaXMgYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9IGluc3RhbmNlLCB0aGUgZXhlY3V0aW9uIG9mIHRoZSA8Y29kZT5vcGVyYXRpb248L2NvZGU+IGlzIHBlcmZvcm1lZCBpbiB0aGUgY3VycmVudCB0aHJlYWQgbm8gbWF0dGVyDQotCSAqIG9mIHRoZSA8Y29kZT5mb3JrPC9jb2RlPiB2YWx1ZQ0KLQkgKiANCi0JICogQHBhcmFtIG9wZXJhdGlvbg0KLQkgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb247IG11c3Qgbm90IGJlIG51bGwNCi0JICogQHBhcmFtIGZvcmsNCi0JICogICAgICAgICAgICB0cnVlIHRvIHBlcmZvcm0gdGhlIDxjb2RlPm9wZXJhdGlvbjwvY29kZT4gaW4gYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9OyBmYWxzZSB0byBwZXJmb3JtIHRoZSA8Y29kZT5vcGVyYXRpb248L2NvZGU+IGluIHRoZSBjdXJyZW50IHRocmVhZA0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIHByb2dyZXNzIG1vbml0b3INCi0JICogQHBhcmFtIGRpc3BsYXkgVE9ETw0KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCi0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bihmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uLCBmaW5hbCBib29sZWFuIGZvcmssIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgRGlzcGxheSBkaXNwbGF5KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKG9wZXJhdGlvbiwgIm9wZXJhdGlvbiIpOw0KLQ0KLQkJZmluYWwgYm9vbGVhbiB3aWxsRm9yayA9ICFpc0luVGVzdENvbnRleHRUaHJlYWQoKSAmJiBmb3JrOw0KLQkJaWYgKHdpbGxGb3JrKQ0KLQkJew0KLQkJCXJ1bkluVGVzdENvbnRleHRUaHJlYWQob3BlcmF0aW9uLCBtb25pdG9yLCBkaXNwbGF5KTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXJ1bkluQ3VycmVudFRocmVhZChvcGVyYXRpb24sIG1vbml0b3IpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSdW5zIHRoZSBvcGVyYXRpb24gaW4gdGhlIGN1cnJlbnQgdGhyZWFkDQotCSAqIA0KLQkgKiBAcGFyYW0gb3BlcmF0aW9uDQotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaWYgYSB7QGxpbmsgVGhyb3dhYmxlfSBoYXMgYmVlbiB0aHJvd24gZHVyaW5nIG9wZXJhdGlvbiBleGVjdXRpb24uIFRoZSBleGNlcHRpb24gd3JhcHMgdGhhdCB7QGxpbmsgVGhyb3dhYmxlfQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5JbkN1cnJlbnRUaHJlYWQoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkJb3BlcmF0aW9uLnJ1bihtb25pdG9yKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUnVucyB0aGUgb3BlcmF0aW9uIGluIGEge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfS4NCi0JICogDQotCSAqIEBwYXJhbSBydW5uYWJsZQ0KLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaWYgdGhlIHtAbGluayBUZXN0Q29udGV4dFRocmVhZH0gZmluaXNoZWQgd2l0aCBlcnJvcg0KLQkgKiBAc2VlIFRlc3RDb250ZXh0VGhyZWFkI2dldEVycm9yKCkNCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgcnVuSW5UZXN0Q29udGV4dFRocmVhZChmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgRGlzcGxheSBkaXNwbGF5KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBUZXN0Q29udGV4dFRocmVhZCBjb250ZXh0VGhyZWFkID0gbmV3IFRlc3RDb250ZXh0VGhyZWFkKHJ1bm5hYmxlLCBtb25pdG9yLCBkaXNwbGF5KTsNCi0JCWNvbnRleHRUaHJlYWQuc3RhcnQoKTsNCi0JCWNvbnRleHRUaHJlYWQuYmxvY2soKTsNCi0NCi0JCWlmIChjb250ZXh0VGhyZWFkLmdldEVycm9yKCkgIT0gbnVsbCkNCi0JCXsNCi0JCQlpZihjb250ZXh0VGhyZWFkLmdldEVycm9yKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7DQotCQkJCXRocm93IChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKWNvbnRleHRUaHJlYWQuZ2V0RXJyb3IoKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGNvbnRleHRUaHJlYWQuZ2V0RXJyb3IoKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW5zdGFuY2Ugb2Yge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luVGVzdENvbnRleHRUaHJlYWQoKQ0KLQl7DQotCQlmaW5hbCBUaHJlYWQgdCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7DQotCQlyZXR1cm4gdCBpbnN0YW5jZW9mIFRlc3RDb250ZXh0VGhyZWFkOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0VGhyZWFkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3RocmVhZGluZy9UZXN0Q29udGV4dFRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDFiYjkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0VGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi0NCi0vKioNCi0gKiB7QGxpbmsgVGhyZWFkfSBleHRlbmRlciB3aGljaCBpcyBjYXBhYmxlIG9mIHByb3ZpZGluZyBldmVudCBsb29wIHByb2Nlc3Npbmcgd2hpbGUgdGhlIHJ1bm5hYmxlIGlzIGV4ZWN1dGVkPGJyPg0KLSAqIEEgdHlwaWNhbCB1c2FnZSBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZToNCi0gKiANCi0gKiA8cHJlPg0KLSAqIFRlc3RDb250ZXh0VGhyZWFkIHQgPSBuZXcgVGVzdENvbnRleHRUaHJlYWQoc29tZVJ1bm5hYmxlKCkpOw0KLSAqIHQuc3RhcnQoKTsNCi0gKiB0LmJsb2NrKCk7DQotICogPC9wcmU+DQotICogDQotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdGhyZWFkIHJlc2VtYmxlcyB0byB0aGUgTW9kYWxDb250ZXh0VGhyZWFkIHdpdGggdGhlIGRpZmZlcmVuY2UgdGhhdCBpdCBkb2VzIG5vdCBjYWxsIHtAbGluayBEaXNwbGF5I3NsZWVwKCl9IGFuZCBpcyBzaW1wbGlmaWVkIGluIG9yZGVyIHRvIG1lZXQgdGVzdCByZXF1aXJlbWVudHMuIFRoZSByZWFzb24gbm90IHRvIGNhbGwge0BsaW5rIERpc3BsYXkjc2xlZXAoKX0gaXMgdGhhdCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgcHV0dGluZyB0aGUgZGlzcGxheSB0bw0KLSAqIHNsZWVwIGNhdXNlcyBqdW5pdCB0ZXN0cyB0byB3YWl0IGZvcmV2ZXINCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqLw0KLWNsYXNzIFRlc3RDb250ZXh0VGhyZWFkIGV4dGVuZHMgVGhyZWFkDQotew0KLQlwcml2YXRlIGJvb2xlYW4gaXNSdW5uaW5nOw0KLQlwcml2YXRlIFRocm93YWJsZSBlcnJvclRocm93YWJsZTsNCi0JcHJpdmF0ZSBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7DQotCXByaXZhdGUgZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlOw0KLQlwcml2YXRlIGZpbmFsIERpc3BsYXkgZGlzcGxheTsNCi0NCi0JVGVzdENvbnRleHRUaHJlYWQoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIERpc3BsYXkgZGlzcGxheSkNCi0Jew0KLQkJc3VwZXIoKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShydW5uYWJsZSwgInJ1bm5hYmxlIik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0obW9uaXRvciwgIm1vbml0b3IiKTsNCi0JCQ0KLQkJaXNSdW5uaW5nID0gdHJ1ZTsNCi0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7DQotCQl0aGlzLnJ1bm5hYmxlID0gcnVubmFibGU7DQotCQl0aGlzLnNldE5hbWUoIlRlc3RDb250ZXh0Iik7DQotCQl0aGlzLnNldERhZW1vbih0cnVlKTsNCi0JCXRoaXMuZGlzcGxheSA9IGRpc3BsYXk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyB0aGUgZXJyb3IgdGhyb3dhYmxlIHdoaWNoIGhhcHBlbmVkIGR1cmluZyBleGVjdXRpb24NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGVycm9yIHRocm93YWJsZSBvciBudWxsIGlmIG5vbmUNCi0JICovDQotCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXJyb3IoKQ0KLQl7DQotCQlyZXR1cm4gZXJyb3JUaHJvd2FibGU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHJ1bigpDQotCXsNCi0JCWlzUnVubmluZyA9IHRydWU7DQotCQl0cnkNCi0JCXsNCi0JCQlydW5uYWJsZS5ydW4obW9uaXRvcik7DQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkNCi0JCXsNCi0JCQllcnJvclRocm93YWJsZSA9IHQ7DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQkvLyBNYWtlIHN1cmUgdGhhdCBhc3luY2hyb25vdXMgZXZlbnRzIGFyZSBwcm9jZXNzZWQgYnkgdGhlIGV2ZW50IGxvb3AgdmlhIHN5bmMgZXhlY3V0aW9uIG9mIGFuICJlbXB0eSIgcnVubmFibGUNCi0JCQlkaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkNCi0JCQl7DQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpDQotCQkJCXsNCi0JCQkJfQ0KLQkJCX0pOw0KLQkJCWlzUnVubmluZyA9IGZhbHNlOw0KLQ0KLQkJCS8vIEZvcmNlIHRoZSBkaXNwbGF5IHRvIHdha2UgdXANCi0JCQlkaXNwbGF5KCkuYXN5bmNFeGVjKG51bGwpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBCbG9ja3MgdGhlIGNhbGxlciB3aGlsZSB0aGUge0BsaW5rIFJ1bm5hYmxlfSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGlzIGJlaW5nIGV4ZWN1dGVkLjxicj4NCi0JICogSWYgdGhlIGNhbGxlciBpcyB0aGUgVUkgdGhyZWFkLCB7QGxpbmsgRGlzcGxheSNyZWFkQW5kRGlzcGF0Y2goKX0gaXMgaW52b2tlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgZXZlbnQgbG9vcCBpcyBwcm9jZXNzZWQ8YnI+DQotCSAqIElmIHRoZSBjYWxsZXIgaXMgbm90IGEgVUkgdGhyZWFkLCB0aGlzIG1ldGhvZCBzaW1wbHkgam9pbnMuIDxicj4NCi0JICogDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGluIGNhc2UgdGhlIG1ldGhvZCBpcyBpbnZva2VkIHdpdGhpbiBpdHMgb3duIHRocmVhZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYmxvY2soKQ0KLQl7DQotCQlpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSB0aGlzKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgdGhlIHNhbWUgdGhyZWFkIik7DQotCQl9DQotDQotCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkNCi0JCXsNCi0JCQl0cnkNCi0JCQl7DQotCQkJCWpvaW4oKTsNCi0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkNCi0JCQl7DQotCQkJCWVycm9yVGhyb3dhYmxlID0gZTsNCi0JCQl9DQotCQl9IGVsc2UNCi0JCXsNCi0JCQl3aGlsZSAoaXNSdW5uaW5nKQ0KLQkJCXsNCi0JCQkJaWYoIWRpc3BsYXkoKS5yZWFkQW5kRGlzcGF0Y2goKSkNCi0JCQkJew0KLQkJCQkJdHJ5DQotCQkJCQl7DQotCQkJCQkJVGhyZWFkLnNsZWVwKDUwKTsNCi0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpDQotCQkJCQl7DQotCQkJCQkJLy8gaWdub3JlDQotCQkJCQkJKG5ldyBMb2dnZXIoKSkubG9nRGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIERpc3BsYXkgZGlzcGxheSgpDQotCXsNCi0JCXJldHVybiBkaXNwbGF5Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGZiMDMwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmMjAxOTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMsCi0gb3JnLmptb2NrLAotIG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5jbGF6egpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiN2FjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BdWd1c3QgMjAsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzg4ZWZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0ZDE1OTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUJ1bmRsZS1OYW1lLjA9SkFYLVdTIFV0aWxzIFRlc3RzDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1N0cmluZ0lucHV0U3RyZWFtQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyYmZkOWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1N0cmluZ0lucHV0U3RyZWFtQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBUZXN0IGNhc2UgZm9yIFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlciBjbGFzcw0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICogDQotICovDQotcHVibGljIGNsYXNzIFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0aW9uKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJbmV3IFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcihudWxsKTsNCi0JCQlmYWlsKCJOUEUgZXhwZWN0ZWQiKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJLy8gZXhwZWN0ZWQNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQkJU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKCJBQkMiKTsNCi0JCWFzc2VydE5vdE51bGwoYWRhcHRlcik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlYWQoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIoIkFCQyIpOw0KLQkJCWFzc2VydFRydWUoYWRhcHRlci5yZWFkKCkgPiAwKTsNCi0NCi0JCQlhZGFwdGVyID0gbmV3IFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcigiIik7DQotCQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLnJlYWQoKSA9PSAtMSk7DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjhjMWJmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0czsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLkZpbGVVdGlsc1VuaXRUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuSmF4V3NVdGlsc1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeVRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvblV0aWxzVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkFubm90YXRpb25zQmFzZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQXJyYXlWYWx1ZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQm9vbGVhblZhbHVlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5DbGFzc1ZhbHVlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5JbnRlZ2VyVmFsdWVJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLlBhcmFtVmFsdWVQYWlySW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5RdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLlN0cmluZ1ZhbHVlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5jbGF6ei5BU1RVdGlsc1Rlc3Q7DQotDQotDQotcHVibGljIGNsYXNzIEFsbFRlc3RzU3VpdGUNCi17DQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgdGVzdCBzdWl0ZSBjb250YWluaW5nIHRoZSB0ZXN0cyB0byBiZSBydW4gYnkgSmF2YSBEZXZlbG9wZXIgVGVzdCBEaXNwYXRjaGVyDQotCSAqIA0KLQkgKiBAcmV0dXJuIC0gYSBzdWl0ZSBvZiBqdW5pdCBwZGUgdGVzdA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0Jew0KLQkJZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQ0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25GYWN0b3J5VGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlWYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uc0Jhc2VJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQW5ub3RhdGlvbkluc3BlY3RvckltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uVXRpbHNUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCb29sZWFuVmFsdWVJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSW50ZWdlclZhbHVlSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBhcmFtVmFsdWVQYWlySW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFF1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdHJpbmdWYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDbGFzc1ZhbHVlSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFTVFV0aWxzVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsZVV0aWxzVW5pdFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpheFdzVXRpbHNUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXJUZXN0LmNsYXNzKTsNCi0JCQ0KLQkJcmV0dXJuIHN1aXRlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL0ZpbGVVdGlsc1VuaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9GaWxlVXRpbHNVbml0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZDRhOTE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL0ZpbGVVdGlsc1VuaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLlN0YXR1c1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLkZpbGVVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5JRmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5jb25zdHJhaW50LklzRXF1YWw7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLmNvbnN0cmFpbnQuSXNTYW1lOw0KLQ0KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbHNVbml0VGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZQ0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBJRmlsZVV0aWxzIGZpbGVVdGlscyA9IEZpbGVVdGlscy5nZXRJbnN0YW5jZSgpOw0KLQlwcml2YXRlIE1vY2s8SUNvbXBpbGF0aW9uVW5pdD4gY3VNb2NrOw0KLQlwcml2YXRlIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWN1TW9jayA9IG1vY2soSUNvbXBpbGF0aW9uVW5pdC5jbGFzcyk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb21waWxhdGlvblVuaXRDb250ZW50RGVhbHNDb3JyZWN0bHlXaXRoV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZyB0ZXN0Q29udGVudCA9ICJNeVRlc3RDb250ZW50IjsNCi0JCWZpbmFsIE1vY2s8SUJ1ZmZlcj4gYnVmZmVyTW9jayA9IG1vY2soSUJ1ZmZlci5jbGFzcyk7DQotCQlidWZmZXJNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoInNldENvbnRlbnRzIikud2l0aChuZXcgSXNTYW1lKHRlc3RDb250ZW50KSk7DQotCQkNCi0JCWN1TW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJiZWNvbWVXb3JraW5nQ29weSIpOw0KLQkJY3VNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldEJ1ZmZlciIpLndpbGwocmV0dXJuVmFsdWUoYnVmZmVyTW9jay5wcm94eSgpKSk7DQotCQljdU1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiY29tbWl0V29ya2luZ0NvcHkiKS53aXRoKG5ldyBJc0VxdWFsKHRydWUpLCBuZXcgSXNTYW1lKG1vbml0b3IpKTsNCi0JCWN1TW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJkaXNjYXJkV29ya2luZ0NvcHkiKTsNCi0NCi0JCWZpbGVVdGlscy5zZXRDb21waWxhdGlvblVuaXRDb250ZW50KGN1TW9jay5wcm94eSgpLCB0ZXN0Q29udGVudCwgdHJ1ZSwgbW9uaXRvcik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb21waWxhdGlvblVuaXRDb250ZW50RG9lc05vdERpc2NhcmRXb3JraW5nQ29weU9uSk1FKCkNCi0Jew0KLQkJZmluYWwgSmF2YU1vZGVsRXhjZXB0aW9uIHRlc3RFeGNlcHRpb24gPSBuZXcgSmF2YU1vZGVsRXhjZXB0aW9uKG5ldyBDb3JlRXhjZXB0aW9uKFN0YXR1c1V0aWxzLnN0YXR1c0Vycm9yKCJURVNUIikpKTsNCi0JCWN1TW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJiZWNvbWVXb3JraW5nQ29weSIpLndpbGwodGhyb3dFeGNlcHRpb24odGVzdEV4Y2VwdGlvbikpOw0KLQkJY3VNb2NrLmV4cGVjdHMobmV2ZXIoKSkubWV0aG9kKCJkaXNjYXJkV29ya2luZ0NvcHkiKTsNCi0JCWN1TW9jay5leHBlY3RzKG5ldmVyKCkpLm1ldGhvZCgiY29tbWl0V29ya2luZ0NvcHkiKTsNCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJZmlsZVV0aWxzLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoY3VNb2NrLnByb3h5KCksICIxMjMiLCB0cnVlLCBtb25pdG9yKTsNCi0JCX0NCi0JCWNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoIlRlc3QgZXhjZXB0aW9uIHdhcyBub3QgY2F1Z2h0IiwgZSA9PSB0ZXN0RXhjZXB0aW9uKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFNldEN1Q29udGVudFNhdmVzRGlydHlFZGl0b3JzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBib29sZWFuW10gc2F2ZUVkaXRvckludm9rZWQgPSBuZXcgYm9vbGVhbltde2ZhbHNlfTsNCi0JCWZpbmFsIGJvb2xlYW5bXSBzZXRDb250ZW50c0ludm9rZWQgPSBuZXcgYm9vbGVhbltde2ZhbHNlfTsNCi0JCQ0KLQkJZmluYWwgSUZpbGVVdGlscyBteUZpbGVVdGlscyA9IG5ldyBGaWxlVXRpbHMoKXsNCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBpbGF0aW9uVW5pdERpc3BsYXllZEluRGlydHlFZGl0b3IoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoIlVuZXhwZWN0ZWQgY29tcGlsYXRpb24gdW5pdCIsIGN1ID09IGN1TW9jay5wcm94eSgpKTsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyB2b2lkIHNhdmVFZGl0b3IoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoIlNhdmUgZWRpdG9ycyBpbnZva2VkIGJlZm9yZSBzZXQgQ1UgY29udGVudCIsIHNldENvbnRlbnRzSW52b2tlZFswXSk7DQotCQkJCWFzc2VydFRydWUoIlVuZXhwZWN0ZWQgY29tcGlsYXRpb24gdW5pdCIsIGN1ID09IGN1TW9jay5wcm94eSgpKTsNCi0JCQkJc2F2ZUVkaXRvckludm9rZWRbMF0gPSB0cnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgdm9pZCBzZXRDb21waWxhdGlvblVuaXRDb250ZW50KElDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCQkJCQkJCQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JCQl7DQotCQkJCWFzc2VydEZhbHNlKCJTZXQgQ1UgY29udGVudCBpbnZva2VkIGFmdGVyIGVkaXRvciBzYXZlZCIsIHNhdmVFZGl0b3JJbnZva2VkWzBdKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIENVIGNvbnRlbnQiLCAiTXlDb250ZW50IiwgY29udGVudCk7DQotCQkJCXNldENvbnRlbnRzSW52b2tlZFswXSA9IHRydWU7DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJbXlGaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoY3VNb2NrLnByb3h5KCksICJNeUNvbnRlbnQiLCB0cnVlLCBudWxsKTsNCi0JCWFzc2VydFRydWUoIlNldCBjb250ZW50cyBub3QgaW52b2tlZCIsIHNldENvbnRlbnRzSW52b2tlZFswXSk7DQotCQlhc3NlcnRUcnVlKCJTYXZlIGVkaXRvcnMgbm90IGludm9rZWQiLCBzYXZlRWRpdG9ySW52b2tlZFswXSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDdUNvbnRlbnREb2VzTm90U2F2ZXNDbGVhbkVkaXRvcnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIGJvb2xlYW5bXSBpc0Rpc3BsYXllZEludm9rZWQgPSBuZXcgYm9vbGVhbltde2ZhbHNlfTsNCi0JCWZpbmFsIGJvb2xlYW5bXSBzZXRDb250ZW50c0ludm9rZWQgPSBuZXcgYm9vbGVhbltde2ZhbHNlfTsNCi0JCQ0KLQkJZmluYWwgSUZpbGVVdGlscyBteUZpbGVVdGlscyA9IG5ldyBGaWxlVXRpbHMoKXsNCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBpbGF0aW9uVW5pdERpc3BsYXllZEluRGlydHlFZGl0b3IoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoIlVuZXhwZWN0ZWQgY29tcGlsYXRpb24gdW5pdCIsIGN1ID09IGN1TW9jay5wcm94eSgpKTsNCi0JCQkJaXNEaXNwbGF5ZWRJbnZva2VkWzBdID0gdHJ1ZTsNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgdm9pZCBzYXZlRWRpdG9yKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpDQotCQkJew0KLQkJCQlmYWlsKCJVbmV4cGVjdGVkIGludm9jYXRpb24iKTsNCi0JCQl9DQotCQkJDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIHZvaWQgc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChJQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyBjb250ZW50LCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJCQkJCQkJCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCQkJew0KLQkJCQlhc3NlcnRGYWxzZSgiU2V0IENVIGNvbnRlbnQgaW52b2tlZCBhZnRlciBlZGl0b3Igc2F2ZWQiLCBpc0Rpc3BsYXllZEludm9rZWRbMF0pOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgQ1UgY29udGVudCIsICJNeUNvbnRlbnQiLCBjb250ZW50KTsNCi0JCQkJc2V0Q29udGVudHNJbnZva2VkWzBdID0gdHJ1ZTsNCi0JCQl9DQotCQl9Ow0KLQkJDQotCQlteUZpbGVVdGlscy5zZXRDb21waWxhdGlvblVuaXRDb250ZW50QW5kU2F2ZURpcnR5RWRpdG9ycyhjdU1vY2sucHJveHkoKSwgIk15Q29udGVudCIsIHRydWUsIG51bGwpOw0KLQkJYXNzZXJ0VHJ1ZSgiU2V0IGNvbnRlbnRzIG5vdCBpbnZva2VkIiwgc2V0Q29udGVudHNJbnZva2VkWzBdKTsNCi0JCWFzc2VydFRydWUoIklzIGRpc3BsYXllZCBpbiBkaXJ0eSBlZGl0b3Igbm90IGludm9rZWQiLCBpc0Rpc3BsYXllZEludm9rZWRbMF0pOw0KLQl9DQotCQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9KYXhXc1V0aWxzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvSmF4V3NVdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDEwZjRiNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9KYXhXc1V0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi0NCi1wdWJsaWMgY2xhc3MgSmF4V3NVdGlsc1Rlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gIlRlc3RCZWFuIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0ZRX05BTUUgPSAib3JnLmVjbGlwc2UudGVzdC4iICsgQ0xBU1NfTkFNRTsNCi0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlX1dpdGhOdWxsKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UobnVsbCk7DQotCQkJZmFpbCgiTlBFIGV4cGVjdGVkIik7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQkvLyBleHBlY3RlZA0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSgpDQotCXsNCi0JCVN0cmluZyBucyA9IEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKCIiKTsNCi0JCWFzc2VydFRydWUobnMuZXF1YWxzKCJodHRwOi8vLyIpKTsNCi0JCW5zID0gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoImEiKTsNCi0JCWFzc2VydFRydWUobnMuZXF1YWxzKCJodHRwOi8vYS8iKSk7DQotCQlucyA9IEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKCJhLmIuYyIpOw0KLQkJYXNzZXJ0VHJ1ZShucy5lcXVhbHMoImh0dHA6Ly9iLmEvYy8iKSk7DQotCQlucyA9IEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKCJhLmIuYy5kIik7DQotCQlhc3NlcnRUcnVlKG5zLmVxdWFscygiaHR0cDovL2IuYS9jL2QvIikpOw0KLQkJbnMgPSBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSgiYS5iLmMuZC5lIik7DQotCQlhc3NlcnRUcnVlKG5zLmVxdWFscygiaHR0cDovL2IuYS9jL2QvZS8iKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2VydmljZU5hbWUoKQ0KLQl7DQotCQl0cnkgew0KLQkJCUpheFdzVXRpbHMuZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pe30NCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKENMQVNTX05BTUUgKyAiU2VydmljZSIsICBKYXhXc1V0aWxzLmdldERlZmF1bHRTZXJ2aWNlTmFtZShDTEFTU19GUV9OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UG9ydHR5cGVOYW1lKCkNCi0Jew0KLQkJdHJ5IHsNCi0JCQlKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0dHlwZU5hbWUobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gXyl7fQ0KLQkJDQotCQlhc3NlcnRFcXVhbHMoQ0xBU1NfTkFNRSwgIEpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZShDTEFTU19GUV9OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UG9ydE5hbWUoKQ0KLQl7DQotCQl0cnkgew0KLQkJCUpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnROYW1lKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pe30NCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKENMQVNTX05BTUUgKyAiUG9ydCIsICBKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZShDTEFTU19GUV9OQU1FKSk7DQotCX0NCi0JDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRkMGNiOTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLS8qKg0KLSAqIEFubm90YXRpb25GYWN0b3J5IGNsYXNzIHRlc3QgY2FzZXMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmFjdG9yeVRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTdHJpbmdWYWx1ZSgpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQlJVmFsdWUgc3RyVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0JCWFzc2VydE5vdE51bGwoc3RyVmFsdWUpOw0KLQkJYXNzZXJ0VHJ1ZShzdHJWYWx1ZS50b1N0cmluZygpLmVxdWFscygidmFsdWUiKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVBhcmFtVmFsdWVQYWlyKCkNCi0Jew0KLQkJSVZhbHVlIHN0clZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKG51bGwsIHN0clZhbHVlKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiIiwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJDQotCQlJUGFyYW1WYWx1ZVBhaXIgdmFsdWVQYWlyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBzdHJWYWx1ZSk7DQotCQlhc3NlcnROb3ROdWxsKHZhbHVlUGFpcik7DQotCQlhc3NlcnRUcnVlKHZhbHVlUGFpci5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSVZhbHVlKTsNCi0JCWFzc2VydFRydWUodmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJwYXJhbSIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ29tcGxleEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIA0KLQl7DQotCQlJVmFsdWUgc3RyVmFsdWUxID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotCQlJUGFyYW1WYWx1ZVBhaXIgdmFsdWVQYWlyMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgc3RyVmFsdWUxKTsNCi0NCi0JCUlWYWx1ZSBzdHJWYWx1ZTIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUxIik7DQotCQlJUGFyYW1WYWx1ZVBhaXIgdmFsdWVQYWlyMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtMSIsIHN0clZhbHVlMik7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhcmFtVmFsdWVzLmFkZCh2YWx1ZVBhaXIxKTsNCi0JCXBhcmFtVmFsdWVzLmFkZCh2YWx1ZVBhaXIyKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24obnVsbCwgcGFyYW1WYWx1ZXMsIGVuZHBvaW50KTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiIiwgbnVsbCwgZW5kcG9pbnQpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQkNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIk15TmFtZSIsIG51bGwsIGVuZHBvaW50KTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0vLwkJdHJ5DQotLy8JCXsNCi0vLwkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIk15TmFtZSIsIG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKSk7DQotLy8JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLS8vCQl9DQotLy8JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0vLwkJew0KLS8vCQl9DQotDQotCQkNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gY2EgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJuYW1lIiwgcGFyYW1WYWx1ZXMsIGVuZHBvaW50KTsNCi0JCWFzc2VydE5vdE51bGwoY2EpOw0KLQkJYXNzZXJ0RXF1YWxzKGNhLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSwgMik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVZhbHVlUGFpcigpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIiIsIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKG51bGwsIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFycmF5VmFsdWUoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBcnJheVZhbHVlKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBcnJheVZhbHVlKG5ldyBIYXNoU2V0PElWYWx1ZT4oKSk7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJSVZhbHVlIHN0clZhbHVlMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZTEiKTsNCi0JCUlWYWx1ZSBzdHJWYWx1ZTIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUyIik7DQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMuYWRkKHN0clZhbHVlMSk7DQotCQl2YWx1ZXMuYWRkKHN0clZhbHVlMik7DQotCQkNCi0JCQ0KLQkJSVZhbHVlIGFyclZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQXJyYXlWYWx1ZSh2YWx1ZXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChhcnJWYWx1ZSk7DQotCQlhc3NlcnRUcnVlKGFyclZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKCJbdmFsdWUxLCB2YWx1ZTJdIikpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoKQ0KLQl7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoIlFOYW1lIik7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQlJVmFsdWUgcU5hbWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoIm9yZy5lY2xpcHNlLmRlbW8uVGVzdCIpOw0KLQkJYXNzZXJ0Tm90TnVsbChxTmFtZSk7DQotCQlhc3NlcnRUcnVlKHFOYW1lLnRvU3RyaW5nKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5kZW1vLlRlc3QiKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUJvb2xlYW5WYWx1ZSgpDQotCXsNCi0JCUlWYWx1ZSBib29sVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVCb29sZWFuVmFsdWUodHJ1ZSk7DQotCQlhc3NlcnROb3ROdWxsKGJvb2xWYWx1ZSk7DQotCQlhc3NlcnRFcXVhbHMoYm9vbFZhbHVlLnRvU3RyaW5nKCksICJ0cnVlIik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25zRnJvbUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotCX0NCi0NCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotLy8Jew0KLS8vCQlwcmVwYXJlUHJvamVjdCgpOw0KLS8vDQotLy8JCUlGaWVsZCBmaWVsZCA9IGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChmaWVsZCk7DQotLy8NCi0vLwkJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXR0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCkgZ2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoZmllbGQpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0vLwkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5sZW5ndGggPT0gMSk7DQotLy8JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbnNGcm9tTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTs7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uc0lUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQkJDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50LmdldFBhY2thZ2VGcmFnbWVudCgpKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJDQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS4gaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTWV0aG9kID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25zSVR5cGVTZXRPZlN0cmluZygpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0NCi0JCVNldDxTdHJpbmc+IHRvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOw0KLQkJdG9SZW1vdmUuYWRkKCJXZWJTZXJ2aWNlIik7DQotCQl0b1JlbW92ZS5hZGQoIldlYk1ldGhvZCIpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnMobnVsbCwgdG9SZW1vdmUpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnMoZW5kcG9pbnQuZ2V0UGFja2FnZUZyYWdtZW50KCksIHRvUmVtb3ZlKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJDQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9ucyhlbmRwb2ludCwgdG9SZW1vdmUpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc01ldGhvZCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNZXRob2Quc2l6ZSgpID09IDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uc0lGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0NCi0JCUlGaWVsZCBmaWVsZCA9IGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0JCWFzc2VydE5vdE51bGwoZmllbGQpOw0KLQ0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZmllbGQpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDIpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc01ldGhvZCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNZXRob2Quc2l6ZSgpID09IDEpOw0KLQ0KLS8vCQlhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUZpZWxkKGZpZWxkKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotLy8JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMubGVuZ3RoID09IDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uc0lNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCWVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0NCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KG1ldGhvZCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc01ldGhvZCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNZXRob2Quc2l6ZSgpPT0gMCk7DQotDQotLy8JCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuZ2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoZmllbGQpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0vLwkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5sZW5ndGggPT0gMCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVQcm9qZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25JbnNwZWN0b3JJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDg0NWI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25JbnNwZWN0b3JJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkluc3BlY3RvckltcGxUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcFNwZWNpZmljKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50QW5uSW5zcGVjdG9yLnNyYyIsICJFbmRwb2ludEFubkluc3BlY3RvciIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJbnNwZWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IobnVsbCkuaW5zcGVjdFR5cGUoKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duISIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24hIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duISIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0obnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQkJDQotCQlJVmFsdWUgc3YgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiTXkgVmFsdWUiKTsNCi0NCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgc3YpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SUZpZWxkPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SUZpZWxkPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0RmllbGQoZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJRmllbGQ+IGFublAgPSBhbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uUCk7DQotCQkNCi0JCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdEZpZWxkKGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQkJDQotDQotCQlJTWV0aG9kW10gbWV0aG9kcyA9IGVuZHBvaW50LmdldE1ldGhvZHMoKTsNCi0JCWZvciAoSU1ldGhvZCBtZXRob2QgOiBtZXRob2RzKQ0KLQkJew0KLQkJCWlmKG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpICE9IG51bGwgJiYgbWV0aG9kLmdldFJhd1BhcmFtZXRlck5hbWVzKCkubGVuZ3RoID4gMCkNCi0JCQl7DQotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKS5sZW5ndGg7IGkrKykNCi0JCQkJew0KLQkJCQkJSVR5cGVQYXJhbWV0ZXIgcGFyYW0gPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcihtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKVtpXSk7DQotDQotCQkJCQlJVmFsdWUgc3ZQYXJhbSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJTdHJpbmcgVmFsdSBQYXJhbSIpOw0KLQkJCQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHZQYXJhbSA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCQkJCXB2UGFyYW0uYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIlBhcmFtQXRyaWJ1dGUiLCBzdlBhcmFtKSk7DQotCQkJCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5uUGFtID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiUGFyYW1Bbm5vdGF0aW9uIiwgcHZQYXJhbSwgcGFyYW0pOw0KLQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFublBhbSwgcGFyYW0pOw0KLQkJCQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4+IHBhcmFtQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0ocGFyYW0pOw0KLQkJCQkJYXNzZXJ0Tm90TnVsbChwYXJhbUFubm90YXRpb25zKTsNCi0JCQkJCWFzc2VydFRydWUocGFyYW1Bbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQkJCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gdG1wQW5uID0gcGFyYW1Bbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCQkJCQ0KLQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZSh0bXBBbm4pOw0KLQkJCQkJcGFyYW1Bbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbShwYXJhbSk7DQotCQkJCQlhc3NlcnROb3ROdWxsKHBhcmFtQW5ub3RhdGlvbnMpOw0KLQkJCQkJYXNzZXJ0VHJ1ZShwYXJhbUFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0JCQkJCQ0KLQkJCQkJYW5uUGFtID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiUGFyYW1Bbm5vdGF0aW9uMiIsIHB2UGFyYW0sIHBhcmFtKTsNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5QYW0sIHBhcmFtKTsNCi0JCQkJCXBhcmFtQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0ocGFyYW0pOw0KLQkJCQkJYXNzZXJ0Tm90TnVsbChwYXJhbUFubm90YXRpb25zKTsNCi0JCQkJCWFzc2VydFRydWUocGFyYW1Bbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQkJCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChwYXJhbSk7DQotCQkJCQlwYXJhbUFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHBhcmFtKTsNCi0JCQkJCWFzc2VydE5vdE51bGwocGFyYW1Bbm5vdGF0aW9ucyk7DQotCQkJCQlhc3NlcnRUcnVlKHBhcmFtQW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zcGVjdG9yU3BlY2lmaWNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcFNwZWNpZmljKCk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCJvcmcuZWNsaXBzZS5kZW1vLk15QW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbik7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibXlWYWx1ZSIpLCAiTXlTdHJpbmciKTsgDQotCQkNCi0JCWluc3BlY3RlZFR5cGVBbm5vdGF0aW9uID0gbnVsbDsNCi0JCQkJDQotCQlpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCJqYXZheC5qd3MuV2ViU2VydmljZSIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbik7DQotCQlhc3NlcnRUcnVlKCJqYXZheC5qd3MuV2ViU2VydmljZSIuZW5kc1dpdGgoaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInNlcnZpY2VOYW1lIiksICJXU0ltcGxCZWFuU2VydmljZSIpOyANCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIiksICJXU0ltcGxCZWFuIik7IA0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInRhcmdldE5hbWVzcGFjZSIpLCAiaHR0cDovL2RlbW8vZWNsaXBzZS9vcmcvIik7IA0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBvcnROYW1lIiksICJXU0ltcGxCZWFuUG9ydCIpOyANCi0NCi0JCUlGaWVsZCBmaWVsZCA9IGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0JCUlBbm5vdGF0aW9uPElGaWVsZD4gaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdEZpZWxkKGZpZWxkLCAib3JnLmVjbGlwc2UuZGVtby5NeUZpZWxkQW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgib3JnLmVjbGlwc2UuZGVtby5NeUZpZWxkQW5ub3RhdGlvbiIuZW5kc1dpdGgoaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLCAiZmllbGQxIik7DQotCQkNCi0JCWluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbiA9IG51bGw7DQotCQkNCi0JCWluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChmaWVsZCwgImphdmF4Lmp3cy5XZWJGaWVsZCIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgiamF2YXguandzLldlYkZpZWxkIi5lbmRzV2l0aChpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIiksICJNeUZpZWxkIik7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZHMoKVswXTsNCi0JCUlBbm5vdGF0aW9uPElNZXRob2Q+IGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCwgIm9yZy5lY2xpcHNlLmRlbW8uTXlNZXRob2RBbm5vdGF0aW9uIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgib3JnLmVjbGlwc2UuZGVtby5NeU1ldGhvZEFubm90YXRpb24iLmVuZHNXaXRoKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLCAiYW5ub3RhdGVkTWV0aG9kIik7DQotCQkNCi0JCWluc3BlY3RlZE1ldGhvZEFubm90YXRpb24gPSBudWxsOw0KLQkJDQotCQlpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QsICJqYXZheC5qd3MuV2ViTWV0aG9kIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgiamF2YXguandzLldlYk1ldGhvZCIuZW5kc1dpdGgoaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJleGNsdWRlIiksICJmYWxzZSIpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgib3BlcmF0aW9uTmFtZSIpLCAidGVzdCIpOw0KLQ0KLQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKCJhbm5vdGF0ZWRQYXJhbSIpOw0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbSh0eXBlUGFyYW1ldGVyLCAib3JnLmVjbGlwc2UuZGVtby5NeVBhcmFtQW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgib3JnLmVjbGlwc2UuZGVtby5NeVBhcmFtQW5ub3RhdGlvbiIuZW5kc1dpdGgoaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLCAiYW5ub3RhdGVkTXlQYXJhbSIpOw0KLQkJDQotCQlpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24gPSBudWxsOw0KLQkJDQotCQlpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0odHlwZVBhcmFtZXRlciwgImphdmF4Lmp3cy5XZWJQYXJhbSIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgiamF2YXguandzLldlYlBhcmFtIi5lbmRzV2l0aChpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIiksICJhbm5vdGF0ZWRQYXJhbSIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zcGVjdG9yTG9jYXRvclJldHJpZXZlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXBTcGVjaWZpYygpOwkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCJqYXZheC5qd3MuV2ViU2VydmljZSIpOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsNCi0NCi0JCWFzc2VydEVxdWFscygxMSwgYW5ub3RhdGlvbi5nZXRMb2NhdG9yKCkuZ2V0TGluZU51bWJlcigpKTsNCi0JCWFzc2VydEVxdWFscygyMjYsIGFubm90YXRpb24uZ2V0TG9jYXRvcigpLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoMTM0LCBhbm5vdGF0aW9uLmdldExvY2F0b3IoKS5nZXRMZW5ndGgoKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscygxMSwgZ2V0UGFyYW0oInBvcnROYW1lIiwgYW5ub3RhdGlvbikuZ2V0TG9jYXRvcigpLmdldExpbmVOdW1iZXIoKSk7DQotCQlhc3NlcnRFcXVhbHMoMzM0LCBnZXRQYXJhbSgicG9ydE5hbWUiLCBhbm5vdGF0aW9uKS5nZXRMb2NhdG9yKCkuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygyNSwgZ2V0UGFyYW0oInBvcnROYW1lIiwgYW5ub3RhdGlvbikuZ2V0TG9jYXRvcigpLmdldExlbmd0aCgpKTsJCQ0KLQl9DQotCQ0KLQlwcml2YXRlIElQYXJhbVZhbHVlUGFpciBnZXRQYXJhbShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbikgDQotCXsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtIDogYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKSkgew0KLQkJCWlmKHBhcmFtLmdldFBhcmFtKCkuZXF1YWxzKG5hbWUpKSB7DQotCQkJCXJldHVybiBwYXJhbTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwZGJlN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uUHJvcGVydHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQXR0cmlidXRlVHlwZUVudW07DQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lclRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17DQotCXByaXZhdGUgTW9jazxJVHlwZT4gdHlwZSA9IG1vY2soSVR5cGUuY2xhc3MpOw0KLQlwcml2YXRlIE1vY2s8SU1ldGhvZD4gbWV0aG9kID0gbW9jayhJTWV0aG9kLmNsYXNzKTsNCi0JcHJpdmF0ZSBNb2NrPElUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyID0gbW9jayhJVHlwZVBhcmFtZXRlci5jbGFzcyk7DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCXRyeSANCi0JCXsNCi0JCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KG51bGwsIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duISIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCXRyeSANCi0JCXsNCi0JCQlBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZSIsICJ2YWx1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duISIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCXRyeSANCi0JCXsNCi0JCQlBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZSIsICJ2YWx1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBQ0tBR0UpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgbm90IHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQlBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZUJvb2xlYW4iLCAidHJ1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVTdHJpbmciLCAidmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gMSk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlTZXQ8SUFubm90YXRpb248SVR5cGU+PiB0eXBlQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSk7DQotCQkNCi0JCWZvciAoSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gOiB0eXBlQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDQpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygidHJ1ZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMCIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ2YWx1ZVN0cmluZyIpKTsNCi0JCX0NCi0NCi0JCWNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMSIsICJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJ0cnVlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTIiLCAiYXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTMiLCAiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTQiLCAiYXR0cmlidXRlTmFtZVN0cmluZyIsICJ2YWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQkNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpLnNpemUoKSA9PSA0KTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCXR5cGVBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKTsNCi0NCi0JCVNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOw0KLQkJbmFtZXMuY2xlYXIoKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUxIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMiIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTMiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWU0Iik7DQotCQkNCi0JCWZvciAoSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gOiB0eXBlQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucyhhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCQluYW1lcy5yZW1vdmUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTEiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMiIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAwIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTMiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTQiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ2YWx1ZVN0cmluZyIpKTsJCQkJDQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQlBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZUJvb2xlYW4iLCAidHJ1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxMDAiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVTdHJpbmciLCAidmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQkNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpLnNpemUoKSA9PSAxKTsNCi0JCVNldDxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gbWV0aG9kQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpOw0KLQkJDQotCQlmb3IgKElBbm5vdGF0aW9uPElNZXRob2Q+IGFubm90YXRpb24gOiBtZXRob2RBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gNCk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJ0cnVlIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAwIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInZhbHVlU3RyaW5nIikpOw0KLQkJfQ0KLQ0KLQkJY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUxIiwgImF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgInRydWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUyIiwgImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMCIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTMiLCAiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lNCIsICJhdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gNCk7DQotCQltZXRob2RBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSk7DQotDQotCQlTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0JCW5hbWVzLmNsZWFyKCk7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMSIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTIiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUzIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lNCIpOw0KLQkJDQotCQlmb3IgKElBbm5vdGF0aW9uPElNZXRob2Q+IGFubm90YXRpb24gOiBtZXRob2RBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKG5hbWVzLmNvbnRhaW5zKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJCW5hbWVzLnJlbW92ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMSIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygidHJ1ZSIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUyIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDAiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMyIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lNCIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInZhbHVlU3RyaW5nIikpOwkJCQkNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlckxldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgInRydWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSAxKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlTZXQ8SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBwYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpOw0KLQkJDQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uIDogcGFyYW1ldGVyQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDQpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygidHJ1ZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMCIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ2YWx1ZVN0cmluZyIpKTsNCi0JCX0NCi0NCi0JCWNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMSIsICJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJ0cnVlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMiIsICJhdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxMDAiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUzIiwgImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTQiLCAiYXR0cmlidXRlTmFtZVN0cmluZyIsICJ2YWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKS5zaXplKCkgPT0gNCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJcGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKTsNCi0NCi0JCVNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOw0KLQkJbmFtZXMuY2xlYXIoKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUxIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMiIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTMiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWU0Iik7DQotCQkNCi0JCWZvciAoSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubm90YXRpb24gOiBwYXJhbWV0ZXJBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKG5hbWVzLmNvbnRhaW5zKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJCW5hbWVzLnJlbW92ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMSIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygidHJ1ZSIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUyIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDAiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMyIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lNCIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInZhbHVlU3RyaW5nIikpOwkJCQkNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENvbWJpbmVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInBhcmFtQW5ub3RhdGlvbk5hbWUiLCAicGFyYW1BdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJ0cnVlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInBhcmFtQW5ub3RhdGlvbk5hbWUiLCAicGFyYW1BdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxMDAiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgicGFyYW1Bbm5vdGF0aW9uTmFtZSIsICJwYXJhbUF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlBBUkFNX1ZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJwYXJhbUFubm90YXRpb25OYW1lIiwgInBhcmFtQXR0cmlidXRlTmFtZVN0cmluZyIsICJwYXJhbVZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQ0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgibWV0aG9kQW5ub3RhdGlvbk5hbWUiLCAibWV0aG9kQXR0cmlidXRlTmFtZUJvb2xlYW4iLCAiZmFsc2UiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgibWV0aG9kQW5ub3RhdGlvbk5hbWUiLCAibWV0aG9kQXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAxIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoIm1ldGhvZEFubm90YXRpb25OYW1lIiwgIm1ldGhvZEF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLk1FVEhPRF9WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgibWV0aG9kQW5ub3RhdGlvbk5hbWUiLCAibWV0aG9kQXR0cmlidXRlTmFtZVN0cmluZyIsICJtZXRob2RWYWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0NCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInR5cGVBbm5vdGF0aW9uTmFtZSIsICJ0eXBlQXR0cmlidXRlTmFtZUJvb2xlYW4iLCAiZmFsc2UiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInR5cGVBbm5vdGF0aW9uTmFtZSIsICJ0eXBlQXR0cmlidXRlTmFtZUludGVnZXIiLCAiMSIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgidHlwZUFubm90YXRpb25OYW1lIiwgInR5cGVBdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5UWVBFX1ZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgidHlwZUFubm90YXRpb25OYW1lIiwgInR5cGVBdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInR5cGVWYWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gMSk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSAxKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gMSk7DQotCQkNCi0JCVNldDxJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4+IHBhcmFtZXRlckFubm90YXRpb25zID0gY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSk7DQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uIDogcGFyYW1ldGVyQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJwYXJhbUFubm90YXRpb25OYW1lIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gNCk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtQXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtQXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMCIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW1BdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uUEFSQU1fVkFMVUUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtQXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygicGFyYW1WYWx1ZVN0cmluZyIpKTsNCi0JCX0NCi0NCi0JCVNldDxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gbWV0aG9kQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpOw0KLQkJZm9yIChJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5vdGF0aW9uIDogbWV0aG9kQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJtZXRob2RBbm5vdGF0aW9uTmFtZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDQpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJtZXRob2RBdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygiZmFsc2UiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm1ldGhvZEF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDEiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm1ldGhvZEF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5NRVRIT0RfVkFMVUUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm1ldGhvZEF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoIm1ldGhvZFZhbHVlU3RyaW5nIikpOw0KLQkJfQ0KLQ0KLQkJU2V0PElBbm5vdGF0aW9uPElUeXBlPj4gdHlwZUFubm90YXRpb25zID0gY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpOw0KLQkJZm9yIChJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA6IHR5cGVBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoInR5cGVBbm5vdGF0aW9uTmFtZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDQpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ0eXBlQXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoImZhbHNlIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ0eXBlQXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInR5cGVBdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVFlQRV9WQUxVRSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgidHlwZUF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInR5cGVWYWx1ZVN0cmluZyIpKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uVXRpbHNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVkMjQ1MmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblV0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25VdGlsc1Rlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCUlWYWx1ZSBzdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJNeSBTdHJpbmcgVmFsdWUiKTsNCi0NCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIlBhcmFtIiwgc3YpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SUZpZWxkPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0QXBwbGllZEVsZW1lbnQoKSwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm4pOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25zQmFzZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc0Jhc2VJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MTVkMTQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25zQmFzZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uSW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNCYXNlSW1wbFRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwV2l0b3V0UmVtb3ZlKCk7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0VXBXaXRvdXRSZW1vdmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwV2l0b3V0UmVtb3ZlMigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludEFubkluc3BlY3Rvci5zcmMiLCAiRW5kcG9pbnRBbm5JbnNwZWN0b3IiKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEJhc2VBbm5vdGF0dGlvbkZ1bmN0aW9uYWxpdHkoKQ0KLQl7DQotCQlBbm5vdGF0aW9uSW1wbDxJVHlwZT4gYW5uID0gbmV3IEFubm90YXRpb25JbXBsPElUeXBlPigiY29tLnNwYS50ZXN0Lk15QW5ub3RhdGlvbiIsIG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKSk7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldEFubm90YXRpb25OYW1lKCksICJjb20uc3BhLnRlc3QuTXlBbm5vdGF0aW9uIik7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldFNpbXBsZUFubm90YXRpb25OYW1lKCksICJNeUFubm90YXRpb24iKTsNCi0JCS8vYXNzZXJ0RXF1YWxzKGFubi5nZXRWYWx1ZVR5cGUoKSwgSVZhbHVlLkFOTk9UQVRJT05fVkFMVUUpOw0KLQkJDQotCQlhbm4gPSBuZXcgQW5ub3RhdGlvbkltcGw8SVR5cGU+KCJNeU5ld0Fubm90YXRpb24iLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRBbm5vdGF0aW9uTmFtZSgpLCAiTXlOZXdBbm5vdGF0aW9uIik7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldFNpbXBsZUFubm90YXRpb25OYW1lKCksICJNeU5ld0Fubm90YXRpb24iKTsNCi0JCS8vYXNzZXJ0RXF1YWxzKGFubi5nZXRWYWx1ZVR5cGUoKSwgSVZhbHVlLkFOTk9UQVRJT05fVkFMVUUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHF2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiB0bXBBbm4gPSBhbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZSh0bXBBbm4pOw0KLQkJDQotCQlhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0JCQ0KLQkJSU1ldGhvZFtdIG1ldGhvZHMgPSBlbmRwb2ludC5nZXRNZXRob2RzKCk7DQotCQlmb3IgKElNZXRob2QgbWV0aG9kIDogbWV0aG9kcykNCi0JCXsNCi0JCQlpZihtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKSAhPSBudWxsICYmIG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpLmxlbmd0aCA+IDApDQotCQkJew0KLQkJCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5NID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb25NZXRob2QiLCBwdiwgbWV0aG9kKTsNCi0JCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubk0sIG1ldGhvZCk7DQotCQkJCWFzc2VydEVxdWFscygiZnVsbC5xdWFsaWZpZWQuTmFtZSIsIGFubk0uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW0iKSk7DQotCQkJCWFzc2VydE51bGwoYW5uTS5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbU5vdEV4aXN0cyIpKTsNCi0JCQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5vdGF0TSA9IGFubm90YXRpb25zTS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJxdWFsaWZpZWQuTmFtZSIsIGFubm90YXRNLmdldFByb3BlcnR5VmFsdWUoInBhcmFtIikpOw0KLQkJCQkNCi0JCQkJSVZhbHVlIHN2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIk5ldyBTdHJpbmcgVmFsdWUiKTsNCi0JCQkJYW5uTS5nZXRQYXJhbVZhbHVlUGFpcnMoKS5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiTmV3UGFyYW0iLCBzdikpOw0KLQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKGFubk0pOw0KLQkJCQlhbm5vdGF0aW9uc00gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNLnNpemUoKSA9PSAxKTsNCi0JCQkJYW5ub3RhdE0gPSBhbm5vdGF0aW9uc00uaXRlcmF0b3IoKS5uZXh0KCk7DQotCQkJCWFzc2VydEVxdWFscygiTmV3IFN0cmluZyBWYWx1ZSIsIGFubm90YXRNLmdldFByb3BlcnR5VmFsdWUoIk5ld1BhcmFtIikpOw0KLQkJCQlhc3NlcnRFcXVhbHMoInF1YWxpZmllZC5OYW1lIiwgYW5ub3RhdE0uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW0iKSk7DQotCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5ub3RhdE0pOw0KLQkJCQlhbm5vdGF0aW9uc00gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNLnNpemUoKSA9PSAwKTsNCi0NCi0JCQkJSVZhbHVlIHN2MyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJOZXcgU3RyaW5nIFZhbHVlMyIpOw0KLQkJCQlhbm5NLmdldFBhcmFtVmFsdWVQYWlycygpLmNsZWFyKCk7DQotCQkJCWFubk0uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIk5ld1BhcmFtIiwgc3YzKSk7DQotCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUoYW5uTSk7DQotCQkJCWFubm90YXRpb25zTSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc00uc2l6ZSgpID09IDEpOw0KLQkJCQlhbm5vdGF0TSA9IGFubm90YXRpb25zTS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJOZXcgU3RyaW5nIFZhbHVlMyIsIGFubm90YXRNLmdldFByb3BlcnR5VmFsdWUoIk5ld1BhcmFtIikpOw0KLQ0KLQkJCQkvLyBjbGVhciBhbm5vdGF0aW9uDQotCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uTSk7DQotDQotCQkJCWFubm90YXRpb25zTSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc00uc2l6ZSgpID09IDApOw0KLQkJCQkNCi0JCQkJZm9yKGludCBpID0gMDsgaSA8IG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpLmxlbmd0aDsgaSsrKQ0KLQkJCQl7DQotCQkJCQlJVHlwZVBhcmFtZXRlciBwYXJhbSA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpW2ldKTsNCi0NCi0JCQkJCUlWYWx1ZSBzdlBhcmFtID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIlN0cmluZyBWYWx1IFBhcmFtIik7DQotCQkJCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdlBhcmFtID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJCQkJcHZQYXJhbS5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiUGFyYW1BdHJpYnV0ZSIsIHN2UGFyYW0pKTsNCi0JCQkJCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5QID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiUGFyYW1Bbm5vdGF0aW9uIiwgcHZQYXJhbSwgcGFyYW0pOw0KLQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFublAsIHBhcmFtKTsNCi0JCQkJCQ0KLQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm5QKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXR0aW9uVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlJVmFsdWUgc3YgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiU3RyaW5nVmFsdWUiKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHNwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXNwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgic3RyaW5nUGFyYW0iLCBzdikpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHR5cGVBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeVR5cGVBbm5vdGF0aW9uIiwgc3B2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQodHlwZUFubm90YXRpb24sIGVuZHBvaW50KTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiB0eXBlQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZSh0eXBlQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHRlbXBUeXBlQW5ub3RhdGlvbiA9IHR5cGVBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgic3RyaW5nUGFyYW0iKSwgIlN0cmluZ1ZhbHVlIik7DQotCQkNCi0JCUlWYWx1ZSBuZXdTViA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJOZXdTdHJpbmdWYWx1ZSIpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gbmV3U1BWID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJbmV3U1BWLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJzdHJpbmdQYXJhbSIsIG5ld1NWKSk7DQotCQlBbm5vdGF0aW9uSW1wbDxJVHlwZT4gbmV3VHlwZUFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGw8SVR5cGU+KCJvcmcuZWNsaXBzZS50ZXN0Lk15VHlwZUFubm90YXRpb24iLCBuZXdTUFYpOw0KLQkJbmV3VHlwZUFubm90YXRpb24uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShlbmRwb2ludCk7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUobmV3VHlwZUFubm90YXRpb24pOw0KLQkJDQotCQl0eXBlQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZSh0eXBlQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJdGVtcFR5cGVBbm5vdGF0aW9uID0gdHlwZUFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJzdHJpbmdQYXJhbSIpLCAiTmV3U3RyaW5nVmFsdWUiKTsNCi0NCi0JCW5ld1NWID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIk5ld2VzdFN0cmluZ1ZhbHVlIik7DQotCQluZXdTUFYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQluZXdTUFYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIm5ld2VzdFN0cmluZ1BhcmFtIiwgbmV3U1YpKTsNCi0JCW5ld1R5cGVBbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsPElUeXBlPigib3JnLmVjbGlwc2UudGVzdC5NeVR5cGVBbm5vdGF0aW9uIiwgbmV3U1BWKTsNCi0JCW5ld1R5cGVBbm5vdGF0aW9uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoZW5kcG9pbnQpOw0KLQkJDQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKG5ld1R5cGVBbm5vdGF0aW9uKTsNCi0NCi0JCXR5cGVBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnROb3ROdWxsKHR5cGVBbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKHR5cGVBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQl0ZW1wVHlwZUFubm90YXRpb24gPSB0eXBlQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnROdWxsKHRlbXBUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJzdHJpbmdQYXJhbSIpKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmV3ZXN0U3RyaW5nUGFyYW0iKSwgIk5ld2VzdFN0cmluZ1ZhbHVlIik7DQotDQotCQlJTWV0aG9kIGZpcnN0TWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kcygpWzBdOw0KLQ0KLQkJSVZhbHVlIGl2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlSW50ZWdlclZhbHVlKCIxMCIpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gaXB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJaXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJpbnRlZ2VyUGFyYW0iLCBpdikpOw0KLQkJSUFubm90YXRpb248SU1ldGhvZD4gbWV0aG9kQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlNZXRob2RBbm5vdGF0aW9uIiwgaXB2LCBmaXJzdE1ldGhvZCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQobWV0aG9kQW5ub3RhdGlvbiwgZmlyc3RNZXRob2QpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gbWV0aG9kQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKGZpcnN0TWV0aG9kKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShtZXRob2RBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiB0ZW1wTWV0aG9kQW5ub3RhdGlvbiA9IG1ldGhvZEFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBNZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImludGVnZXJQYXJhbSIpLCAiMTAiKTsNCi0JCQ0KLQkJSVZhbHVlIG5ld0lWID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlSW50ZWdlclZhbHVlKCIxMSIpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gbmV3SVBWID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJbmV3SVBWLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJpbnRlZ2VyUGFyYW0iLCBuZXdJVikpOw0KLQkJQW5ub3RhdGlvbkltcGw8SU1ldGhvZD4gbmV3TWV0aG9kQW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJTWV0aG9kPigib3JnLmVjbGlwc2UudGVzdC5NeU1ldGhvZEFubm90YXRpb24iLCBuZXdJUFYpOw0KLQkJbmV3TWV0aG9kQW5ub3RhdGlvbi5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKGZpcnN0TWV0aG9kKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShuZXdNZXRob2RBbm5vdGF0aW9uKTsNCi0JCQ0KLQkJbWV0aG9kQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKGZpcnN0TWV0aG9kKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShtZXRob2RBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQl0ZW1wTWV0aG9kQW5ub3RhdGlvbiA9IG1ldGhvZEFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBNZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImludGVnZXJQYXJhbSIpLCAiMTEiKTsNCi0NCi0JCW5ld0lWID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlSW50ZWdlclZhbHVlKCIxMDAiKTsNCi0JCW5ld0lQViA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCW5ld0lQVi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgibmV3ZXN0SW50ZWdlclBhcmFtIiwgbmV3SVYpKTsNCi0JCW5ld01ldGhvZEFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGw8SU1ldGhvZD4oIm9yZy5lY2xpcHNlLnRlc3QuTXlNZXRob2RBbm5vdGF0aW9uIiwgbmV3SVBWKTsNCi0JCW5ld01ldGhvZEFubm90YXRpb24uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShmaXJzdE1ldGhvZCk7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUobmV3TWV0aG9kQW5ub3RhdGlvbik7DQotDQotCQltZXRob2RBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QoZmlyc3RNZXRob2QpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RBbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKG1ldGhvZEFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCXRlbXBNZXRob2RBbm5vdGF0aW9uID0gbWV0aG9kQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnROdWxsKHRlbXBNZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImludGVnZXJQYXJhbSIpKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wTWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuZXdlc3RJbnRlZ2VyUGFyYW0iKSwgIjEwMCIpOw0KLQ0KLQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IGZpcnN0TWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIoImFubm90YXRlZFBhcmFtIik7DQotDQotCQlJVmFsdWUgYnYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVCb29sZWFuVmFsdWUodHJ1ZSk7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBicHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlicHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoImJvb2xlYW5QYXJhbSIsIGJ2KSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gcGFyYW1ldGVyQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlQYXJhbWV0ZXJBbm5vdGF0aW9uIiwgYnB2LCB0eXBlUGFyYW1ldGVyKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChwYXJhbWV0ZXJBbm5vdGF0aW9uLCB0eXBlUGFyYW1ldGVyKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBwYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbSh0eXBlUGFyYW1ldGVyKTsNCi0JCWFzc2VydE5vdE51bGwocGFyYW1ldGVyQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShwYXJhbWV0ZXJBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gdGVtcFBhcmFtZXRlckFubm90YXRpb24gPSBwYXJhbWV0ZXJBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJib29sZWFuUGFyYW0iKSwgInRydWUiKTsNCi0JCQ0KLQkJSVZhbHVlIG5ld0JWID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKGZhbHNlKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IG5ld0JQViA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCW5ld0JQVi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiYm9vbGVhblBhcmFtIiwgbmV3QlYpKTsNCi0JCUFubm90YXRpb25JbXBsPElUeXBlUGFyYW1ldGVyPiBuZXdQYXJhbWV0ZXJBbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsPElUeXBlUGFyYW1ldGVyPigib3JnLmVjbGlwc2UudGVzdC5NeVBhcmFtZXRlckFubm90YXRpb24iLCBuZXdCUFYpOw0KLQkJbmV3UGFyYW1ldGVyQW5ub3RhdGlvbi5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKHR5cGVQYXJhbWV0ZXIpOw0KLQkJDQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKG5ld1BhcmFtZXRlckFubm90YXRpb24pOw0KLQkJDQotCQlwYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbSh0eXBlUGFyYW1ldGVyKTsNCi0JCWFzc2VydE5vdE51bGwocGFyYW1ldGVyQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShwYXJhbWV0ZXJBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQl0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbiA9IHBhcmFtZXRlckFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBQYXJhbWV0ZXJBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImJvb2xlYW5QYXJhbSIpLCAiZmFsc2UiKTsNCi0NCi0JCW5ld0JWID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKHRydWUpOw0KLQkJbmV3QlBWID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJbmV3QlBWLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJuZXdlc3RCb29sZWFuUGFyYW0iLCBuZXdCVikpOw0KLQkJbmV3UGFyYW1ldGVyQW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJVHlwZVBhcmFtZXRlcj4oIm9yZy5lY2xpcHNlLnRlc3QuTXlQYXJhbWV0ZXJBbm5vdGF0aW9uIiwgbmV3QlBWKTsNCi0JCW5ld1BhcmFtZXRlckFubm90YXRpb24uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZSh0eXBlUGFyYW1ldGVyKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShuZXdQYXJhbWV0ZXJBbm5vdGF0aW9uKTsNCi0NCi0JCXBhcmFtZXRlckFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHR5cGVQYXJhbWV0ZXIpOw0KLQkJYXNzZXJ0Tm90TnVsbChwYXJhbWV0ZXJBbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKHBhcmFtZXRlckFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCXRlbXBQYXJhbWV0ZXJBbm5vdGF0aW9uID0gcGFyYW1ldGVyQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnROdWxsKHRlbXBQYXJhbWV0ZXJBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImJvb2xlYW5QYXJhbSIpKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuZXdlc3RCb29sZWFuUGFyYW0iKSwgInRydWUiKTsNCi0JCQ0KLQkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHF2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgbm90IHRocm93bi4iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0eUFkZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwV2l0b3V0UmVtb3ZlKCk7DQotCQkNCi0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQ0KLQkJew0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCQkJew0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJU2V0PFN0cmluZz4gYW5ub1NldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0JCQkJCWFubm9TZXQuYWRkKCJTdGF0ZWxlc3MiKTsNCi0JCQkJCQ0KLQkJCQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnMoZW5kcG9pbnQsIGFubm9TZXQpOw0KLQkJCQkJDQotCQkJCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJCQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgcXYpKTsNCi0JCQkJCQ0KLQkJCQkJSUFubm90YXRpb248SVR5cGU+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50KTsNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50KTsNCi0NCi0JCQkJCUlWYWx1ZSBzdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJTdHJpbmdWYWx1ZSIpOw0KLQ0KLQkJCQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gc3B2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJCQkJc3B2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJzdHJpbmdQYXJhbSIsIHN2KSk7DQotCQkJCQkNCi0JCQkJCUlBbm5vdGF0aW9uPElUeXBlPiBzQW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeVN0cmluZ0Fubm90YXRpb24iLCBzcHYsIGVuZHBvaW50KTsNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChzQW5uLCBlbmRwb2ludCk7DQotCQkJCQkNCi0JCQkJCQ0KLQkJCQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQkJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMyk7DQotCQkJCQlJQW5ub3RhdGlvbjxJVHlwZT4gdG1wQW5uID0gYW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQkJCQkNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUodG1wQW5uKTsNCi0JCQkJCQ0KLQkJCQkJYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotCQkJCQkNCi0JCQkJCUlNZXRob2RbXSBtZXRob2RzID0gZW5kcG9pbnQuZ2V0TWV0aG9kcygpOw0KLQkJCQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpDQotCQkJCQl7DQotCQkJCQkJSVZhbHVlIHNtdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJTdHJpbmdWYWx1ZSIpOw0KLQkJCQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHNtcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQkJCQkJc21wdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgic3RyaW5nUGFyYW0iLCBzbXYpKTsNCi0JCQkJCQkNCi0JCQkJCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBzbUFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uTWV0aG9kIiwgc21wdiwgbWV0aG9kKTsNCi0JCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoc21Bbm4sIG1ldGhvZCk7DQotCQkJCQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJCQkJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnNNKTsNCi0JCQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTS5zaXplKCkgPT0gMik7DQotDQotCQkJCQkJYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJCQkJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDIpOw0KLQ0KLQkJCQkJfQ0KLQkNCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpDQotCQkJCXsNCi0JCQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJZ2V0VGVzdFByb2plY3QoKS5nZXRTb3VyY2VGb2xkZXIoKS5nZXRSZXNvdXJjZSgpLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbnVsbCk7DQotDQotCQkNCi0JCQ0KLQkJDQotCX0NCi0JCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkNCi0Jew0KLQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHF2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4xID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24xIiwgcHYsIGVuZHBvaW50KTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24yIiwgcHYsIGVuZHBvaW50KTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24xIiwgcHYsIGVuZHBvaW50KTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShhbm4xLmVxdWFscyhhbm4xKSk7DQotCQlhc3NlcnRGYWxzZShhbm4xLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShhbm4xLmVxdWFscyhxdikpOw0KLQkJYXNzZXJ0RmFsc2UoYW5uMS5lcXVhbHMoYW5uMikpOw0KLQkJYXNzZXJ0VHJ1ZShhbm4xLmVxdWFscyhhbm4zKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgcXYpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SUZpZWxkPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0QXBwbGllZEVsZW1lbnQoKSwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdExvY2F0b3IoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwV2l0b3V0UmVtb3ZlMigpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gaW5zcGVjdGVkVHlwZUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgib3JnLmVjbGlwc2UuZGVtby5NeUFubm90YXRpb24iKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkVHlwZUFubm90YXRpb24pOw0KLQkJSUxvY2F0b3IgbG9jYXRvciA9IGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhbm5vdGF0aW9uIHN0YXJ0IHBvc2l0aW9uIiwgMTkxLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbGVuZ3RoIiwgMzMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFybVZhbHVlcyA9IGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJteVZhbHVlIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCAyMDUsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDE4LCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotDQotCQlpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCJqYXZheC5qd3MuV2ViU2VydmljZSIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbik7DQotCQlsb2NhdG9yID0gaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gc3RhcnQgcG9zaXRpb24iLCAyMjYsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBAV2ViU2VydmljZSBhbm5vdGF0aW9uIGxlbmd0aCIsIDEzNCwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlwYXJtVmFsdWVzID0gaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoInNlcnZpY2VOYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc2VydmljZU5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCAyMzgsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHNlcnZpY2VOYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDMxLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotDQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzZXJ2aWNlTmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDI3MSwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc2VydmljZU5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMTcsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0NCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygidGFyZ2V0TmFtZXNwYWNlIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdGFyZ2V0TmFtZXNwYWNlIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgMjkwLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCB0YXJnZXROYW1lc3BhY2UgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgNDIsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0NCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygicG9ydE5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBwb3J0TmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDMzNCwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcG9ydE5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMjUsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCUlGaWVsZCBmaWVsZCA9IGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0JCUlBbm5vdGF0aW9uPElGaWVsZD4gaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdEZpZWxkKGZpZWxkLCAib3JnLmVjbGlwc2UuZGVtby5NeUZpZWxkQW5ub3RhdGlvbiIpOw0KLQkJbG9jYXRvciA9IGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgTXlGaWVsZEFubm90YXRpb24gYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA0MDEsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBNeUZpZWxkQW5ub3RhdGlvbiBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAzMywgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlwYXJtVmFsdWVzID0gaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJuYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDQyMCwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAxMywgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdEZpZWxkKGZpZWxkLCAiamF2YXguandzLldlYkZpZWxkIik7DQotCQlsb2NhdG9yID0gaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBXZWJGaWVsZCBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDQzNywgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIFdlYkZpZWxkIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDI1LCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCXBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNDQ3LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDE0LCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZHMoKVswXTsNCi0JCUlBbm5vdGF0aW9uPElNZXRob2Q+IGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCwgIm9yZy5lY2xpcHNlLmRlbW8uTXlNZXRob2RBbm5vdGF0aW9uIik7DQotCQlsb2NhdG9yID0gaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgTXlNZXRob2RBbm5vdGF0aW9uIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNDkyLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgTXlNZXRob2RBbm5vdGF0aW9uIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDQzLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCXBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJuYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDUxMiwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAyMiwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kLCAiamF2YXguandzLldlYk1ldGhvZCIpOw0KLQkJbG9jYXRvciA9IGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIFdlYk1ldGhvZCBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDUzOCwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIFdlYk1ldGhvZCBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCA0NiwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlwYXJtVmFsdWVzID0gaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygiZXhjbHVkZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGV4Y2x1ZGUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA1NDksIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGV4Y2x1ZGUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMTMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0NCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygib3BlcmF0aW9uTmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG9wZXJhdGlvbk5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA1NjMsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG9wZXJhdGlvbk5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMjAsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcigiYW5ub3RhdGVkUGFyYW0iKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0odHlwZVBhcmFtZXRlciwgIm9yZy5lY2xpcHNlLmRlbW8uTXlQYXJhbUFubm90YXRpb24iKTsNCi0JCWxvY2F0b3IgPSBpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIE15UGFyYW1Bbm5vdGF0aW9uIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNjQ5LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgTXlQYXJhbUFubm90YXRpb24gYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgNDMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJcGFybVZhbHVlcyA9IGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygibmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA2NjgsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMjMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHR5cGVQYXJhbWV0ZXIsICJqYXZheC5qd3MuV2ViUGFyYW0iKTsNCi0JCWxvY2F0b3IgPSBpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIFdlYlBhcmFtIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNjE2LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgV2ViUGFyYW0gYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMzIsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJcGFybVZhbHVlcyA9IGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygibmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA2MjYsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMjEsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25zVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMTQzM2E3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25zVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25JbnNwZWN0b3JJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1Rlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb21wbGV4QW5ub3RhdGlvblFOVmFsdWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJSVBhcmFtVmFsdWVQYWlyIHB2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBxdik7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChwdik7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImphdmF4Lmp3cy5XZWJTZXJ2aWNlIiwgcGFyYW1WYWx1ZXMsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5vdGF0aW9uLCBlbmRwb2ludCk7DQotDQotCQlhc3NlcnRUcnVlKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCkuc2l6ZSgpID4gMCk7DQotCX0NCi0NCi0vLwlwdWJsaWMgdm9pZCB0ZXN0QWRkU2luZ2xlRWxlbWVudEFubm90YXRpb25BcnJheVZhbHVlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0vLwl7DQotLy8JCUlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTaW5nbGVFbGVtZW50QW5ub3RhdGlvbigiamF2YXguandzLldlYlNlcnZpY2UiLCBuZXcgU3RyaW5nW10geyAidmFsMSIsICJ2YWwyIiB9KTsNCi0vLwkJYW5ub3RhdGlvbi5hZGRUb0NsYXNzKGVuZHBvaW50KTsNCi0vLw0KLS8vCQlhc3NlcnRUcnVlKEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUNsYXNzKGVuZHBvaW50KS5sZW5ndGggPiAwKTsNCi0vLwl9DQotLy8NCi0vLwlwdWJsaWMgdm9pZCB0ZXN0QWRkU2ltcGxlQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0vLwl7DQotLy8JCUlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTaW1wbGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViU2VydmljZSIpOw0KLS8vCQlhbm5vdGF0aW9uLmFkZFRvQ2xhc3MoZW5kcG9pbnQpOw0KLS8vDQotLy8JCWFzc2VydFRydWUoQW5ub3RhdGlvbkZhY3RvcnkuZ2V0QW5ub3RhdGlvbnNGcm9tQ2xhc3MoZW5kcG9pbnQpLmxlbmd0aCA+IDApOw0KLS8vCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgY29tcGxleCBhbm5vdGF0aW9uIGFuZCBhZGRzIGl0IHRvIGNsYXNzLiBUaGUgYW5ub3RhdGlvbiBoYXMgdGhlIGZvcm06DQotCSAqIA0KLQkgKiA8cHJlPg0KLQkgKiAJIEBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSZxdW90O3NlcnZpY2VOYW1lJnF1b3Q7LA0KLQkgKiAJIG5hbWU9JnF1b3Q7cG9ydFR5cGVOYW1lJnF1b3Q7LA0KLQkgKiAJIHRhcmdldE5hbWVzcGFjZT0mcXVvdDtodHRwOi8vZGVtby5zYXAuY29tLyZxdW90OywNCi0JICogCSB3c2RsTG9jYXRpb249JnF1b3Q7aHR0cDovL3dzZGwvdXJsLyZxdW90OywNCi0JICogCSBwb3J0TmFtZT0mcXVvdDtwb3J0TmFtZSZxdW90OywNCi0JICogCSBlbmRwb2ludEludGVyZmFjZT0mcXVvdDtvcmcuZWNsaXBzZS5kZW1vLklTZWkmcXVvdDspDQotCSAqIDwvcHJlPg0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29tcGxleENsYXNzQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotDQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgInNlcnZpY2VOYW1lIiwgInNlcnZpY2VOYW1lIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgIm5hbWUiLCAicG9ydFR5cGVOYW1lIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZGVtby5zYXAuY29tLyIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJ3c2RsTG9jYXRpb24iLCAiaHR0cDovL3dzZGwvdXJsLyIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJwb3J0TmFtZSIsICJwb3J0TmFtZSIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJlbmRwb2ludEludGVyZmFjZSIsICJvcmcuZWNsaXBzZS5kZW1vLklTZWkiKTsNCi0NCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiamF2YXguandzLldlYlNlcnZpY2UiLCBwYXJhbVZhbHVlcywgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIGVuZHBvaW50KTsNCi0NCi0JCUFubm90YXRpb25JbnNwZWN0b3JJbXBsIGFubm90YXRpb25JbnNwZWN0b3IgPSBuZXcgQW5ub3RhdGlvbkluc3BlY3RvckltcGwoZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IHR5cGVBbm5vdGF0aW9ucyA9IGFubm90YXRpb25JbnNwZWN0b3IuaW5zcGVjdFR5cGUoKTsNCi0NCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlPiB0eXBlQW5ub3RhdGlvbiA6IHR5cGVBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlpZih0eXBlQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiamF2YXguandzLldlYlNlcnZpY2UiKSB8fCB0eXBlQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiV2ViU2VydmljZSIpKQ0KLQkJCXsNCi0JCQkJaWYodHlwZUFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpICE9IDYpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJzZXJ2aWNlTmFtZSIpLmVxdWFscygic2VydmljZU5hbWUiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKS5lcXVhbHMoInBvcnRUeXBlTmFtZSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgidGFyZ2V0TmFtZXNwYWNlIikuZXF1YWxzKCJodHRwOi8vZGVtby5zYXAuY29tLyIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgid3NkbExvY2F0aW9uIikuZXF1YWxzKCJodHRwOi8vd3NkbC91cmwvIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwb3J0TmFtZSIpLmVxdWFscygicG9ydE5hbWUiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImVuZHBvaW50SW50ZXJmYWNlIikuZXF1YWxzKCJvcmcuZWNsaXBzZS5kZW1vLklTZWkiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQ0KLQkJCQlyZXN1bHQgPSB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWFzc2VydFRydWUoIkNsYXNzIGlzIG5vdCBhbm5vdGF0ZWQgY29ycmVjdGx5IiwgcmVzdWx0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBjb21wbGV4IGFubm90YXRpb24gYW5kIGFkZHMgaXQgdG8gbWV0aG9kIGRlY2xhcmF0aW9uLiBBbm5vdGF0aW9uIGhhcyB0aGUgZm9ybToNCi0JICogDQotCSAqIDxwcmU+DQotCSAqICBcQFdlYk1ldGhvZChleGNsdWRlPWZhbHNlLG9wZXJhdGlvbk5hbWU9JnF1b3Q7YW5ub3RhdGVkTWV0aG9kJnF1b3Q7LGFjdGlvbj0mcXVvdDtnbyZxdW90OykJDQotCSAqIDwvcHJlPg0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29tcGxleE1ldGhvZEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQ0KLQkJSVZhbHVlIGVtVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVCb29sZWFuVmFsdWUoZmFsc2UpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoImV4Y2x1ZGUiLCBlbVZhbHVlKSk7DQotDQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgIm9wZXJhdGlvbk5hbWUiLCAiYW5ub3RhdGVkTWV0aG9kIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgImFjdGlvbiIsICJnbyIpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQkJCQ0KLQkJSUFubm90YXRpb248SU1ldGhvZD4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImphdmF4Lmp3cy5XZWJNZXRob2QiLCBwYXJhbVZhbHVlcywgbWV0aG9kKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5vdGF0aW9uLCBtZXRob2QpOw0KLQ0KLQkJQW5ub3RhdGlvbkluc3BlY3RvckltcGwgYW5ub3RhdGlvbkluc3BlY3RvciA9IG5ldyBBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbChlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBtZXRob2RBbm5vdGF0aW9ucyA9IGFubm90YXRpb25JbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJIAkJDQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KLQkJZm9yIChJQW5ub3RhdGlvbjxJTWV0aG9kPiBtZXRob2RBbm5vdGF0aW9uIDogbWV0aG9kQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJaWYobWV0aG9kQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiamF2YXguandzLldlYk1ldGhvZCIpIHx8IG1ldGhvZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoIldlYk1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJaWYobWV0aG9kQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgIT0gMykNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIW1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiZXhjbHVkZSIpLmVxdWFscygiZmFsc2UiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIW1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgib3BlcmF0aW9uTmFtZSIpLmVxdWFscygiYW5ub3RhdGVkTWV0aG9kIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCFtZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImFjdGlvbiIpLmVxdWFscygiZ28iKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQ0KLQkJCQlyZXN1bHQgPSB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWFzc2VydFRydWUoIk1ldGhvZCBpcyBub3QgYW5ub3RhdGVkIGNvcnJlY3RseSIsIHJlc3VsdCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgY29tcGxleCBhbm5vdGF0aW9uIGFuZCBhZGRzIGl0IHRvIGEgbWV0aG9kIHBhcmFtZXRlci4gVGhlIGFubm90YXRpb24gaGFzIHRoZSBmb3JtOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogIFxAV2ViUGFyYW0ob3BlcmF0aW9uTmFtZT0mcXVvdDthbm5vdGF0ZWRQYXJhbSZxdW90OywgdGFyZ2V0TmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9kZW1vLnNhcC5jb20vcGFyYW1zLyZxdW90OywgcGFydE5hbWU9JnF1b3Q7cGFydE5hbWUmcXVvdDspDQotCSAqIDwvcHJlPg0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29tcGxleFBhcmFtQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIoImFubm90YXRlZFBhcmFtIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0NCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAiYW5ub3RhdGVkUGFyYW0iLCAicGFyYW0iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9kZW1vLnNhcC5jb20vcGFyYW1zLyIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJwYXJ0TmFtZSIsICJwYXJ0TmFtZSIpOw0KLQ0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViUGFyYW0iLCBwYXJhbVZhbHVlcywgdHlwZVBhcmFtZXRlcik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgdHlwZVBhcmFtZXRlcik7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGFkZFN0cmluZ1Byb3BlcnR5KFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzLCBTdHJpbmcgcHJvcGVydHksIFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJSVZhbHVlIHBWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKHZhbHVlKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwYWlyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShwcm9wZXJ0eSwgcFZhbHVlKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChwYWlyKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9BcnJheVZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0FycmF5VmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZjVlNGRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0FycmF5VmFsdWVJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFycmF5VmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5TdHJpbmdWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIEFycmF5VmFsdWVJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkNCi0Jew0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMSA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczEuY2xlYXIoKTsNCi0JCXZhbHVlczEuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDEiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjEgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMSk7DQotCQkNCi0JCVNldDxJVmFsdWU+IHZhbHVlczIgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMyLmNsZWFyKCk7DQotCQl2YWx1ZXMyLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwyIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYyID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczIpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShhdjEuaGFzaENvZGUoKSAhPSBhdjIuaGFzaENvZGUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEFycmF5VmFsdWVJbXBsKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJbmV3IEFycmF5VmFsdWVJbXBsKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMSA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczEuY2xlYXIoKTsNCi0JCXZhbHVlczEuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDEiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjEgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMSk7DQotDQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMyID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzMi5jbGVhcigpOw0KLQkJdmFsdWVzMi5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMiIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2MiA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMyKTsNCi0NCi0JCVNldDxJVmFsdWU+IHZhbHVlczMgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMzLmNsZWFyKCk7DQotCQl2YWx1ZXMzLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwxIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYzID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczMpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoYXYxLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShhdjEuZXF1YWxzKDEyMykpOw0KLQkJYXNzZXJ0RmFsc2UoYXYxLmVxdWFscyhhdjIpKTsNCi0NCi0JCWFzc2VydFRydWUoYXYxLmVxdWFscyhhdjMpKTsNCi0JCWFzc2VydFRydWUoYXYxLmVxdWFscyhhdjEpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFycmF5cygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzLmNsZWFyKCk7DQotCQl2YWx1ZXMuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDEiKSk7DQotCQl2YWx1ZXMuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDIiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdiA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMpOw0KLQkJCQkNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgYXYpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gcmVhZEFubm90YXRpb24gPSBhbm5vdGF0dGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlyZWFkQW5ub3RhdGlvbi5lcXVhbHMoYW5uKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uKTsNCi0JCWFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAwKTsNCi0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Cb29sZWFuVmFsdWVJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQm9vbGVhblZhbHVlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmRhZDhlYTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQm9vbGVhblZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFycmF5VmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Cb29sZWFuVmFsdWVJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBCb29sZWFuVmFsdWVJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEJvb2xlYW5WYWx1ZUltcGwoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQluZXcgQXJyYXlWYWx1ZUltcGwobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFucygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJQm9vbGVhblZhbHVlSW1wbCBidiA9IG5ldyBCb29sZWFuVmFsdWVJbXBsKHRydWUpOw0KLQkJCQkNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgYnYpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gcmVhZEFubm90YXRpb24gPSBhbm5vdGF0dGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlyZWFkQW5ub3RhdGlvbi5lcXVhbHMoYW5uKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uKTsNCi0JCWFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAwKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUJvb2xlYW5WYWx1ZUltcGwgYnYxID0gbmV3IEJvb2xlYW5WYWx1ZUltcGwodHJ1ZSk7DQotCQlCb29sZWFuVmFsdWVJbXBsIGJ2MiA9IG5ldyBCb29sZWFuVmFsdWVJbXBsKGZhbHNlKTsNCi0JCUJvb2xlYW5WYWx1ZUltcGwgYnYzID0gbmV3IEJvb2xlYW5WYWx1ZUltcGwodHJ1ZSk7DQotDQotCQlhc3NlcnRGYWxzZShidjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKGJ2MS5lcXVhbHMoMTIzKSk7DQotCQlhc3NlcnRGYWxzZShidjEuZXF1YWxzKGJ2MikpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShidjEuZXF1YWxzKGJ2MykpOw0KLQkJYXNzZXJ0VHJ1ZShidjEuZXF1YWxzKGJ2MSkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0NsYXNzVmFsdWVJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ2xhc3NWYWx1ZUltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI0MDBhMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ2xhc3NWYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5DbGFzc1ZhbHVlSW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgQ2xhc3NWYWx1ZUltcGxUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlcnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCUNsYXNzVmFsdWVJbXBsIGN2ID0gbmV3IENsYXNzVmFsdWVJbXBsKGVuZHBvaW50LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIGN2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHJlYWRBbm5vdGF0aW9uID0gYW5ub3RhdHRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJcmVhZEFubm90YXRpb24uZXF1YWxzKGFubik7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtIikudG9TdHJpbmcoKSwgZW5kcG9pbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm4pOw0KLQkJYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJQ2xhc3NWYWx1ZUltcGwgY3YxID0gbmV3IENsYXNzVmFsdWVJbXBsKGVuZHBvaW50LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCUNsYXNzVmFsdWVJbXBsIGN2MiA9IG5ldyBDbGFzc1ZhbHVlSW1wbChudWxsKTsNCi0JCUNsYXNzVmFsdWVJbXBsIGN2MyA9IG5ldyBDbGFzc1ZhbHVlSW1wbChlbmRwb2ludC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotDQotCQlhc3NlcnRGYWxzZShjdjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKGN2MS5lcXVhbHModHJ1ZSkpOw0KLQkJYXNzZXJ0RmFsc2UoY3YxLmVxdWFscyhjdjIpKTsNCi0NCi0JCWFzc2VydFRydWUoY3YxLmVxdWFscyhjdjMpKTsNCi0JCWFzc2VydFRydWUoY3YxLmVxdWFscyhjdjEpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Db21wbGV4QW5ub3RhdGlvbkltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Db21wbGV4QW5ub3RhdGlvbkltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmNTZkMmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ29tcGxleEFubm90YXRpb25JbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIENvbXBsZXhBbm5vdGF0aW9uSW1wbFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17CQ0KLQlwcml2YXRlIE1vY2s8SVR5cGU+IHR5cGVFbGVtZW50ID0gbW9jayhJVHlwZS5jbGFzcyk7DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKQ0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwdnAgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHZhbHVlKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHB2cCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZSIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lMiIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0NCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbjEuaGFzaENvZGUoKSAhPSBhbm5vdGF0aW9uMi5oYXNoQ29kZSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJSVZhbHVlIHZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotCQlJUGFyYW1WYWx1ZVBhaXIgcHZwID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCB2YWx1ZSk7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChwdnApOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24xID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3RhdGlvbk5hbWUiLCBwYXJhbVZhbHVlcywgdHlwZUVsZW1lbnQucHJveHkoKSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZTIiLCBwYXJhbVZhbHVlcywgdHlwZUVsZW1lbnQucHJveHkoKSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZSIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0NCi0JCWFzc2VydEZhbHNlKGFubm90YXRpb24xLmVxdWFscyhhbm5vdGF0aW9uMikpOw0KLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKGFubm90YXRpb24xLmVxdWFscygxMjMpKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbjEuZXF1YWxzKGFubm90YXRpb24zKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRW5kcG9pbnQuc3JjIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRW5kcG9pbnQuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYjY5OWI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0VuZHBvaW50LnNyYworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iV1NJbXBsQmVhblNlcnZpY2UiLCBuYW1lPSJXU0ltcGxCZWFuIiwgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVtby9lY2xpcHNlL29yZy8iLCBwb3J0TmFtZT0iV1NJbXBsQmVhblBvcnQiKQ0KLUBTdGF0ZWxlc3MNCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnQNCi17DQotCUBNeUFubm90YXRpb24obmFtZT0iZmllbGQxIikNCi0JcHVibGljIFN0cmluZyBmaWVsZDE7DQotCQ0KLQlAV2ViTWV0aG9kKGV4Y2x1ZGU9ZmFsc2Usb3BlcmF0aW9uTmFtZT0idGVzdCIpDQotCXB1YmxpYyB2b2lkIGFubm90YXRlZE1ldGhvZCggQFdlYlBhcmFtKG5hbWU9ImFubm90YXRlZFBhcmFtIikgU3RyaW5nIGFubm90YXRlZFBhcmFtKSANCi0Jew0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0VuZHBvaW50QW5uSW5zcGVjdG9yLnNyYyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0VuZHBvaW50QW5uSW5zcGVjdG9yLnNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDI1MGQ1Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9FbmRwb2ludEFubkluc3BlY3Rvci5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViRmllbGQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi0NCi1ATXlBbm5vdGF0aW9uKG15VmFsdWU9Ik15U3RyaW5nIikNCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iV1NJbXBsQmVhblNlcnZpY2UiLCBuYW1lPSJXU0ltcGxCZWFuIiwgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVtby9lY2xpcHNlL29yZy8iLCBwb3J0TmFtZT0iV1NJbXBsQmVhblBvcnQiKQ0KLUBTdGF0ZWxlc3MNCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnQNCi17DQotCUBNeUZpZWxkQW5ub3RhdGlvbihuYW1lPSJmaWVsZDEiKQ0KLQlAV2ViRmllbGQobmFtZT0iTXlGaWVsZCIpDQotCXB1YmxpYyBTdHJpbmcgZmllbGQxOw0KLQkNCi0JQE15TWV0aG9kQW5ub3RhdGlvbihuYW1lPSJhbm5vdGF0ZWRNZXRob2QiKQ0KLQlAV2ViTWV0aG9kKGV4Y2x1ZGU9ZmFsc2Usb3BlcmF0aW9uTmFtZT0idGVzdCIpDQotCXB1YmxpYyB2b2lkIGFubm90YXRlZE1ldGhvZCggQFdlYlBhcmFtKG5hbWU9ImFubm90YXRlZFBhcmFtIikgQE15UGFyYW1Bbm5vdGF0aW9uKG5hbWU9ImFubm90YXRlZE15UGFyYW0iKSBTdHJpbmcgYW5ub3RhdGVkUGFyYW0pIA0KLQl7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSW50ZWdlclZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0ludGVnZXJWYWx1ZUltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4ZDhjYzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSW50ZWdlclZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkludGVnZXJWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIEludGVnZXJWYWx1ZUltcGxUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlcnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCUludGVnZXJWYWx1ZUltcGwgaXYgPSBuZXcgSW50ZWdlclZhbHVlSW1wbCgiMTAiKTsNCi0JCQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIGl2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHJlYWRBbm5vdGF0aW9uID0gYW5ub3RhdHRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJcmVhZEFubm90YXRpb24uZXF1YWxzKGFubik7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtIikudG9TdHJpbmcoKSwgIjEwIik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubik7DQotCQlhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlJbnRlZ2VyVmFsdWVJbXBsIGl2MSA9IG5ldyBJbnRlZ2VyVmFsdWVJbXBsKCIxMCIpOw0KLQkJSW50ZWdlclZhbHVlSW1wbCBpdjIgPSBuZXcgSW50ZWdlclZhbHVlSW1wbCgiMTEiKTsNCi0JCUludGVnZXJWYWx1ZUltcGwgaXYzID0gbmV3IEludGVnZXJWYWx1ZUltcGwoIjEwIik7DQotDQotCQlhc3NlcnRGYWxzZShpdjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKGl2MS5lcXVhbHModHJ1ZSkpOw0KLQkJYXNzZXJ0RmFsc2UoaXYxLmVxdWFscyhpdjIpKTsNCi0NCi0JCWFzc2VydFRydWUoaXYxLmVxdWFscyhpdjMpKTsNCi0JCWFzc2VydFRydWUoaXYxLmVxdWFscyhpdjEpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9QYXJhbVZhbHVlUGFpckltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9QYXJhbVZhbHVlUGFpckltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyZWI2MjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuUGFyYW1WYWx1ZVBhaXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5TdHJpbmdWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIFBhcmFtVmFsdWVQYWlySW1wbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0NCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkNCi0Jew0KLQkJSVZhbHVlIHZhbHVlID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbSIsIHZhbHVlKTsNCi0NCi0JCUlWYWx1ZSB2YWx1ZTEgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWx1ZTEiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAxID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0xIiwgdmFsdWUxKTsNCi0NCi0JCWFzc2VydEZhbHNlKHB2cC5oYXNoQ29kZSgpID09IHB2cDEuaGFzaENvZGUoKSk7DQotCQlhc3NlcnRGYWxzZShwdnAuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMoMTIzKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlIik7DQotCQlQYXJhbVZhbHVlUGFpckltcGwgcHZwID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0iLCB2YWx1ZSk7DQotDQotCQlJVmFsdWUgdmFsdWUxID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAxID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0iLCB2YWx1ZTEpOw0KLQ0KLQkJSVZhbHVlIHZhbHVlMiA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlMiIpOw0KLQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHB2cDIgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbTIiLCB2YWx1ZTIpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShwdnAuZXF1YWxzKHB2cDEpKTsNCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMocHZwMikpOw0KLQkJYXNzZXJ0VHJ1ZShwdnAuZXF1YWxzKHB2cCkpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UocHZwLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShwdnAuZXF1YWxzKDEyMykpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1F1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9RdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzYxMTlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1F1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIFF1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotDQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpDQotCXsNCi0JCUlWYWx1ZSBxdjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUxIik7DQotCQlJVmFsdWUgcXYyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlhc3NlcnRGYWxzZShxdjEuaGFzaENvZGUoKSA9PSBxdjIuaGFzaENvZGUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQkJSVZhbHVlIHF2MSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZTEiKTsNCi0JCUlWYWx1ZSBxdjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCWFzc2VydEZhbHNlKHF2LmVxdWFscyhxdjEpKTsNCi0JCWFzc2VydFRydWUocXYuZXF1YWxzKHF2MikpOw0KLQkJYXNzZXJ0VHJ1ZShxdi5lcXVhbHMocXYpKTsNCi0JCWFzc2VydEZhbHNlKHF2LmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShxdi5lcXVhbHMoMTIzKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvU3RyaW5nVmFsdWVJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvU3RyaW5nVmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDE5YjAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1N0cmluZ1ZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlN0cmluZ1ZhbHVlSW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgU3RyaW5nVmFsdWVJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlTdHJpbmdWYWx1ZUltcGwgc3YgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCIxMCIpOw0KLQkJCQkNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgc3YpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gcmVhZEFubm90YXRpb24gPSBhbm5vdGF0dGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlyZWFkQW5ub3RhdGlvbi5lcXVhbHMoYW5uKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW0iKS50b1N0cmluZygpLCAiMTAiKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uKTsNCi0JCWFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAwKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCVN0cmluZ1ZhbHVlSW1wbCBzdjEgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCIxMCIpOw0KLQkJU3RyaW5nVmFsdWVJbXBsIHN2MiA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoIjExIik7DQotCQlTdHJpbmdWYWx1ZUltcGwgc3YzID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgiMTAiKTsNCi0NCi0JCWFzc2VydEZhbHNlKHN2MS5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2Uoc3YxLmVxdWFscyh0cnVlKSk7DQotCQlhc3NlcnRGYWxzZShzdjEuZXF1YWxzKHN2MikpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShzdjEuZXF1YWxzKHN2MykpOw0KLQkJYXNzZXJ0VHJ1ZShzdjEuZXF1YWxzKHN2MSkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2NsYXp6L0FTVFV0aWxzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvY2xhenovQVNUVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjZDU4YzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvY2xhenovQVNUVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuY2xheno7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuZmlsZXMuVGVzdEZpbGVVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuY2xhenouQVNUVXRpbHM7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBBU1RVdGlsc30gY2xhc3MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBU1RVdGlsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS50ZXN0IjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9IA0KLQkJCSJpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsiICsgIlxuIiArDQotCQkJInB1YmxpYyBjbGFzcyBUZXN0IHsiICsgIlxuIiArDQotCQkJIglwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgbmFtZSA9IFwiYXJlXCI7IiArICJcbiIgKw0KLQkJCSIgICBwdWJsaWMgVGVzdCgpIHt9IiArICJcbiIgKw0KLQkJCSIJcHVibGljIGludCBjcmVhdGVJbnQoKSB7cmV0dXJuIDA7fSIgKyAiXG4iICsNCi0JCQkifSI7CQ0KLQ0KLQlwcml2YXRlIFRlc3RQcm9qZWN0IHByb2plY3Q7DQotCQ0KLQlwdWJsaWMgdm9pZCBtYW51YWxTZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJcHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdCgiSmF2YVByb2pfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCXByb2plY3QuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7DQotCQkJcHJvamVjdC5kaXNwb3NlKCk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBU1RGaWxlTnBlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0cnkgew0KLQkJCUFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQVNUKChGaWxlKW51bGwsIG51bGwpOw0KLQkJfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKSB7fQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBU1RGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBGaWxlIHRlbXBKYXZhRmlsZSA9IGNyZWF0ZVRlbXBKYXZhRmlsZSgpOw0KLQkJQVNUTm9kZSBub2RlID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVBU1QodGVtcEphdmFGaWxlLCBudWxsKTsNCi0JCWFzc2VydE5vdE51bGwobm9kZSk7DQotCQlhc3NlcnRUcnVlKG5vZGUgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOwkNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQVNUSVR5cGVOcGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRyeSB7DQotCQkJQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoKElDb21waWxhdGlvblVuaXQpbnVsbCwgbnVsbCk7DQotCQl9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pIHt9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBU1RJVHlwZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJbWFudWFsU2V0VXAoKTsNCi0JCWZpbmFsIElUeXBlIHNvdXJjZVR5cGUgPSBwcm9qZWN0LmNyZWF0ZVR5cGUocHJvamVjdC5jcmVhdGVQYWNrYWdlKFBDSyksICJUZXN0LmphdmEiLCBTUkMpOw0KLQkJQVNUTm9kZSBub2RlID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoc291cmNlVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbnVsbCk7DQotCQlhc3NlcnROb3ROdWxsKG5vZGUpOw0KLQkJYXNzZXJ0VHJ1ZShub2RlIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlRGVjbGFyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCW1hbnVhbFNldFVwKCk7DQotCQlmaW5hbCBJVHlwZSBzb3VyY2VUeXBlID0gcHJvamVjdC5jcmVhdGVUeXBlKHByb2plY3QuY3JlYXRlUGFja2FnZShQQ0spLCAiVGVzdC5qYXZhIiwgU1JDKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoc291cmNlVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbnVsbCk7DQotCQkNCi0JCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZSA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCJUZXN0IiwgdW5pdCk7DQotCQlhc3NlcnROb3ROdWxsKGFic3RyYWN0VHlwZSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlRGVjbGFyYXRpb25Gb3JJbm5lclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCW1hbnVhbFNldFVwKCk7DQotCQlTdHJpbmcgc291cmNlID0gInB1YmxpYyBjbGFzcyBUZXN0IHsiICsNCi0JCQkicHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbWV0ZXJzIHt9IiArDQotCQkifSI7CQkNCi0JCQ0KLQkJZmluYWwgSVR5cGUgc291cmNlVHlwZSA9IHByb2plY3QuY3JlYXRlVHlwZShwcm9qZWN0LmNyZWF0ZVBhY2thZ2UoUENLKSwgIlRlc3QuamF2YSIsIHNvdXJjZSk7DQotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHNvdXJjZVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIG51bGwpOw0KLQkJDQotCQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhYnN0cmFjdFR5cGUgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbigiUGFyYW1ldGVycyIsIHVuaXQpOw0KLQkJYXNzZXJ0Tm90TnVsbChhYnN0cmFjdFR5cGUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlU2lnbmF0dXJlRm9yU2ltcGxlVHlwZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nIHZhckFyZ1NpZ25hdHVyZSA9IGdldFR5cGVTaWduYXR1cmVGb3JQYXJhbWV0ZXIoIlN0cmluZyBwIik7DQotCQlhc3NlcnRGYWxzZSgiU2lnbmF0dXJlIHNob3VsZCBub3Qgc3RhcnQgd2l0aCAnWyciLCB2YXJBcmdTaWduYXR1cmUudG9DaGFyQXJyYXkoKVswXSA9PSBTaWduYXR1cmUuQ19BUlJBWSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVTaWduYXR1cmVGb3JBcnJheSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nIHZhckFyZ1NpZ25hdHVyZSA9IGdldFR5cGVTaWduYXR1cmVGb3JQYXJhbWV0ZXIoIlN0cmluZ1tdIHAiKTsNCi0JCWFzc2VydFRydWUoIlNpZ25hdHVyZSBzaG91bGQgc3RhcnQgd2l0aCAnWyciLCB2YXJBcmdTaWduYXR1cmUudG9DaGFyQXJyYXkoKVswXSA9PSBTaWduYXR1cmUuQ19BUlJBWSk7DQotCQlhc3NlcnRGYWxzZSgiU2lnbmF0dXJlIHNlY29uZCBjYWhhcmFjdGVyIG11c3Qgbm90IGJlICdbJyIsIHZhckFyZ1NpZ25hdHVyZS50b0NoYXJBcnJheSgpWzFdID09IFNpZ25hdHVyZS5DX0FSUkFZKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZVNpZ25hdHVyZUZvclZhckFyZygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nIHZhckFyZ1NpZ25hdHVyZSA9IGdldFR5cGVTaWduYXR1cmVGb3JQYXJhbWV0ZXIoIlN0cmluZy4uLiBwIik7DQotCQlhc3NlcnRUcnVlKCJTaWduYXR1cmUgc2hvdWxkIHN0YXJ0IHdpdGggJ1snIiwgdmFyQXJnU2lnbmF0dXJlLnRvQ2hhckFycmF5KClbMF0gPT0gU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQkJYXNzZXJ0RmFsc2UoIlNpZ25hdHVyZSBzZWNvbmQgY2FoYXJhY3RlciBtdXN0IG5vdCBiZSAnWyciLCB2YXJBcmdTaWduYXR1cmUudG9DaGFyQXJyYXkoKVsxXSA9PSBTaWduYXR1cmUuQ19BUlJBWSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVTaWduYXR1cmVGb3JNdWx0aURpbWVuc2lvbmFsVmFyQXJnKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFyQXJnU2lnbmF0dXJlID0gZ2V0VHlwZVNpZ25hdHVyZUZvclBhcmFtZXRlcigiU3RyaW5nW11bXS4uLiBwIik7DQotCQlhc3NlcnRUcnVlKCJTaWduYXR1cmUgc2hvdWxkIHN0YXJ0IHdpdGggJ1snIiwgdmFyQXJnU2lnbmF0dXJlLnRvQ2hhckFycmF5KClbMF0gPT0gU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQkJYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlIHNlY29uZCBjYWhhcmFjdGVyIG11c3QgYmUgJ1snIiwgdmFyQXJnU2lnbmF0dXJlLnRvQ2hhckFycmF5KClbMV0gPT0gU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQkJYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlIHRoaXJkIGNhaGFyYWN0ZXIgbXVzdCBiZSAnWyciLCB2YXJBcmdTaWduYXR1cmUudG9DaGFyQXJyYXkoKVsyXSA9PSBTaWduYXR1cmUuQ19BUlJBWSk7DQotCQlhc3NlcnRGYWxzZSgiU2lnbmF0dXJlIGZvdXJ0aCBjaGFyYWN0ZWQgbXVzdCBub3QgYmUgJ1snIiwgdmFyQXJnU2lnbmF0dXJlLnRvQ2hhckFycmF5KClbM10gPT0gU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQl9DQotDQotCXByaXZhdGUgU3RyaW5nIGdldFR5cGVTaWduYXR1cmVGb3JQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIHBhcmFtRGVmaW5pdGlvbikgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBBU1RVdGlscyBhc3RVdGlscyA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCk7DQotDQotCQltYW51YWxTZXRVcCgpOw0KLQkJU3RyaW5nIHNvdXJjZSA9ICJwdWJsaWMgY2xhc3MgVGVzdCB7IHB1YmxpYyB2b2lkIHZhckFyZ01ldGhvZCgiICsgcGFyYW1EZWZpbml0aW9uICsgIil7fSB9IjsNCi0NCi0JCWZpbmFsIElUeXBlIHNvdXJjZVR5cGUgPSBwcm9qZWN0LmNyZWF0ZVR5cGUocHJvamVjdC5jcmVhdGVQYWNrYWdlKFBDSyksICJUZXN0LmphdmEiLCBzb3VyY2UpOw0KLQkJZmluYWwgSU1ldGhvZCB2YXJhcmdNZXRob2QgPSBzb3VyY2VUeXBlLmdldE1ldGhvZHMoKVswXTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXRob2QgbmFtZSIsICJ2YXJBcmdNZXRob2QiLCB2YXJhcmdNZXRob2QuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlmaW5hbCBDb21waWxhdGlvblVuaXQgdW5pdCA9IGFzdFV0aWxzLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChzb3VyY2VUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBudWxsKTsNCi0JCWZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wgPSBhc3RVdGlscy5nZXRNZXRob2REZWNsYXJhdGlvbih2YXJhcmdNZXRob2QsIChUeXBlRGVjbGFyYXRpb24pIGFzdFV0aWxzLmdldFR5cGVEZWNsYXJhdGlvbigiVGVzdCIsIHVuaXQpKTsNCi0JCWFzc2VydEVxdWFscygiT25lIHBhcmFtZXRlciBleHBlY3RlZCIsIDEsIG1ldGhvZERlY2wucGFyYW1ldGVycygpLnNpemUoKSk7DQotDQotCQlyZXR1cm4gYXN0VXRpbHMuZ2V0VHlwZVNpZ25hdHVyZSgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgbWV0aG9kRGVjbC5wYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOw0KLQl9CQ0KLQkNCi0JcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlbXBKYXZhRmlsZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJRmlsZSBkaXIgPSBUZXN0RmlsZVV0aWxzLmNyZWF0ZVRlbXBEaXJlY3RvcnkoIiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQlGaWxlIHRlbXBDbGFzc0ZpbGUgPSBuZXcgRmlsZShkaXIsICJUZXN0LmphdmEiKTsNCi0JCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcih0ZW1wQ2xhc3NGaWxlKTsNCi0JCWZ3LndyaXRlKCJwYWNrYWdlICIgKyBQQ0sgKyAiO1xuIiArIFNSQyk7DQotCQlmdy5jbG9zZSgpOw0KLQkJDQotCQlyZXR1cm4gdGVtcENsYXNzRmlsZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9tb2NrL0VuZHBvaW50Rm9ybWF0LnNyYyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL21vY2svRW5kcG9pbnRGb3JtYXQuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YmY2ZmI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL21vY2svRW5kcG9pbnRGb3JtYXQuc3JjCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcHVibGljIGNsYXNzIEVuZHBvaW50e3B1YmxpYyBFbmRwb2ludCgpe31wdWJsaWMgdm9pZCB1c2VWb2lkKCl7fXB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgcyl7cmV0dXJuIHN9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmptb2NrLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlZTA1MGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9qbW9jay1jb3JlLTEuMi4wLmphciIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuam1vY2svLnByb2plY3QgYi90ZXN0cy9vcmcuam1vY2svLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzZjZiNDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuam1vY2s8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuam1vY2svLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmptb2NrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzYxMTA3OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuam1vY2svLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEp1biAyMyAxODo0MTo1NSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5qbW9jay9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFlMzQ3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuam1vY2svTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O3Zpc2liaWxpdHk6PXJlZXhwb3J0DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5qbW9jaywNCi0gb3JnLmptb2NrLmJ1aWxkZXIsDQotIG9yZy5qbW9jay5jb3JlLA0KLSBvcmcuam1vY2suY29yZS5jb25zdHJhaW50LA0KLSBvcmcuam1vY2suY29yZS5tYXRjaGVyLA0KLSBvcmcuam1vY2suY29yZS5zdHViLA0KLSBvcmcuam1vY2suZXhwZWN0YXRpb24sDQotIG9yZy5qbW9jay51dGlsDQotQnVuZGxlLVZlbmRvcjogb3JnLmptb2NrDQotQnVuZGxlLUNsYXNzUGF0aDogbGliL2ptb2NrLWNvcmUtMS4yLjAuamFyDQotQnVuZGxlLVZlcnNpb246IDEuMi4wDQotRWNsaXBzZS1CdWRkeVBvbGljeTogZ2xvYmFsDQotQnVuZGxlLU5hbWU6IEpNb2NrDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5qbW9jaztzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCi0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuam1vY2svYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5qbW9jay9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI3YWNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5qbW9jay9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAyMCwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmptb2NrL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzYThmYzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGxpYi8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay9saWIvam1vY2stY29yZS0xLjIuMC5qYXIgYi90ZXN0cy9vcmcuam1vY2svbGliL2ptb2NrLWNvcmUtMS4yLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOWQzMTdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5qbW9jay9saWIvam1vY2stY29yZS0xLjIuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCg==